Transformers 文件
CodeLlama
並獲得增強的文件體驗
開始使用
CodeLlama
Code Llama 是一個基於 Llama 2 的大型語言模型家族,專門用於編碼任務。它有不同的變體——通用程式碼、Python 專用和指令遵循變體——所有這些都提供 7B、13B、34B 和 70B 引數。Code Llama 模型可以生成、解釋,甚至填充程式碼中缺失的部分(稱為“填充”)。它還可以處理非常長的上下文,在 16K 令牌序列上進行訓練,但仍可穩定生成多達 100k 令牌。
您可以在 Code Llama 集合下找到所有原始 Code Llama 檢查點。
單擊右側邊欄中的 Code Llama 模型,獲取更多如何將 Code Llama 應用於不同編碼任務的示例。
下面的示例演示如何使用 Pipeline 或 AutoModel,以及從命令列生成程式碼。
import torch
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/CodeLlama-7b-hf",
torch_dtype=torch.float16,
device_map=0
)
# basic code generation
result = pipe("# Function to calculate the factorial of a number\ndef factorial(n):", max_new_tokens=256)
print(result[0]['generated_text'])
# infilling
infill_result = pipe("def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result", max_new_tokens=200)
print(infill_result[0]['generated_text'])
量化透過以較低精度表示權重來減少大型模型的記憶體負擔。有關更多可用量化後端,請參閱量化概述。
以下示例使用 bitsandbytes 僅將權重量化為 4 位。
# pip install bitsandbytes
import torch
from transformers import AutoModelForCausalLM, CodeLlamaTokenizer, BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True)
tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-34b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-34b-hf",
torch_dtype=torch.bfloat16,
device_map="auto",
quantization_config=bnb_config
)
prompt = "# Write a Python function to check if a string is a palindrome\ndef is_palindrome(s):"
input_ids = tokenizer(prompt, return_tensors="pt").to("cuda")
output = model.generate(**input_ids, max_new_tokens=200, cache_implementation="static")
print(tokenizer.decode(output[0], skip_special_tokens=True))
使用 AttentionMaskVisualizer 更好地理解模型可以和不能關注的令牌。
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
return a + b""")

注意事項
填充功能僅適用於 7B 和 13B 基礎模型,不適用於 Python、Instruct、34B 或 70B 模型。
使用
<FILL_ME>
令牌作為您想要填充輸入的位置。分詞器將此令牌拆分以建立遵循 原始訓練模式 的格式化輸入字串。這比您自己準備模式更健壯。from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf") model = LlamaForCausalLM.from_pretrained("meta-llama/CodeLlama-7b-hf") PROMPT = '''def remove_non_ascii(s: str) -> str: """ <FILL_ME> return result ''' input_ids = tokenizer(PROMPT, return_tensors="pt")["input_ids"] generated_ids = model.generate(input_ids, max_new_tokens=128) filling = tokenizer.batch_decode(generated_ids[:, input_ids.shape[1]:], skip_special_tokens = True)[0] print(PROMPT.replace("<FILL_ME>", filling))
對於進一步的訓練或微調,請使用
bfloat16
;對於推理,請使用float16
。在編碼字首或字尾時,不使用
BOS
字元,僅在每個提示的開頭使用。該分詞器是一個基於 SentencePiece 的位元組級位元組對編碼模型。在解碼過程中,如果第一個令牌是單詞的開頭(例如,“Banana”),分詞器不會將字首空格新增到字串中。
CodeLlamaTokenizer
class transformers.CodeLlamaTokenizer
< 來源 >( vocab_file unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' prefix_token = ' <PRE>' middle_token = ' <MID>' suffix_token = ' <SUF>' eot_token = ' <EOT>' fill_token = '<FILL_ME>' suffix_first = False sp_model_kwargs: typing.Optional[dict[str, typing.Any]] = None add_bos_token = True add_eos_token = False clean_up_tokenization_spaces = False additional_special_tokens = None use_default_system_prompt = False **kwargs )
引數
- vocab_file (
str
) — 詞彙表文件的路徑。 - unk_token (
str
, 可選, 預設為"<unk>"
) — 未知令牌。不在詞彙表中的令牌無法轉換為 ID,並被設定為此令牌。 - bos_token (
str
, 可選, 預設為"<s>"
) — 預訓練期間使用的序列開始令牌。可以用作序列分類器令牌。 - eos_token (
str
, 可選, 預設為"</s>"
) — 序列結束令牌。當使用特殊令牌構建序列時,這不是用於序列結束的令牌。使用的令牌是
sep_token
。 - prefix_token (
str
, 可選, 預設為" <PRE>"
) — 用於填充的字首令牌。 - middle_token (
str
, 可選, 預設為" <MID>"
) — 用於填充的中間令牌。 - suffix_token (
str
, 可選, 預設為" <SUF>"
) — 用於填充的字尾令牌。 - eot_token (
str
, 可選, 預設為" <EOT>"
) — 用於填充的文字結束令牌。 - fill_token (
str
, 可選, 預設為"<FILL_ME>"
) — 用於在字首和字尾之間分割輸入的令牌。 - suffix_first (
bool
, 可選, 預設為False
) — 輸入提示和字尾是否應以後綴優先的格式化。 - sp_model_kwargs (
dict
, 可選) — 將傳遞給SentencePieceProcessor.__init__()
方法。可使用 SentencePiece 的 Python 封裝器,其中可用於設定:-
enable_sampling
: 啟用子詞正則化。 -
nbest_size
: Unigram 取樣引數。對於 BPE-Dropout 無效。nbest_size = {0,1}
: 不執行取樣。nbest_size > 1
: 從 nbest_size 結果中取樣。nbest_size < 0
: 假定 nbest_size 是無限的,並使用前向濾波和後向取樣演算法從所有假設(格)中取樣。
-
alpha
: Unigram 取樣的平滑引數,以及 BPE-dropout 合併操作的 dropout 機率。
-
- add_bos_token (
bool
, 可選, 預設為True
) — 是否在序列開頭新增序列開始令牌。 - add_eos_token (
bool
, 可選, 預設為False
) — 是否在序列末尾新增序列結束令牌。 - clean_up_tokenization_spaces (
bool
, 可選, 預設為False
) — 是否清理分詞空間。 - additional_special_tokens (
list[str]
, 可選) — 分詞器使用的其他特殊令牌。 - use_default_system_prompt (
bool
, 可選, 預設為False
) — 是否使用 Llama 的預設系統提示。
構建 CodeLlama 分詞器。基於位元組級位元組對編碼。預設填充令牌未設定,因為原始模型中沒有填充令牌。
預設配置與 codellama/CodeLlama-7b-Instruct-hf 相同,後者支援提示填充。
get_special_tokens_mask
< 來源 >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None already_has_special_tokens: bool = False ) → list[int]
從沒有新增特殊標記的標記列表中檢索序列ID。此方法在使用分詞器prepare_for_model
方法新增特殊標記時呼叫。
create_token_type_ids_from_sequences
< 來源 >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) → list[int]
根據傳入的兩個序列建立掩碼,用於序列對分類任務。一個 ALBERT
如果 token_ids_1
為 None
,則此方法僅返回掩碼的第一部分(0s)。
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
| first sequence | second sequence |
如果 token_ids_1 為 None,則只返回掩碼的第一部分(0s)。
save_vocabulary
< source >( save_directory filename_prefix: typing.Optional[str] = None ) → Tuple(str)
將詞彙表和特殊標記檔案儲存到目錄。
CodeLlamaTokenizerFast
class transformers.CodeLlamaTokenizerFast
< source >( vocab_file = None tokenizer_file = None clean_up_tokenization_spaces = False unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' prefix_token = ' <PRE>' middle_token = ' <MID>' suffix_token = ' <SUF>' eot_token = ' <EOT>' fill_token = '<FILL_ME>' additional_special_tokens = None add_bos_token = True add_eos_token = False use_default_system_prompt = False **kwargs )
引數
- vocab_file (
str
, optional) — SentencePiece 檔案(通常具有 .model 副檔名),其中包含例項化分詞器所需的詞彙表。 - tokenizer_file (
str
, optional) — tokenizers 檔案(通常具有 .json 副檔名),其中包含載入分詞器所需的一切。 - clean_up_tokenization_spaces (
str
, optional, 預設為False
) — 解碼後是否清理空格,清理包括移除額外的空格等潛在的“偽跡”。 - unk_token (
str
, optional, 預設為"<unk>"
) — 未知標記。不在詞彙表中的標記無法轉換為 ID,將設定為此標記。 - bos_token (
str
, optional, 預設為"<s>"
) — 預訓練期間使用的序列開始標記。可用作序列分類器標記。 - eos_token (
str
, optional, 預設為"</s>"
) — 序列結束標記。 - prefix_token (
str
, optional, 預設為" <PRE>"
) — 用於填充的字首標記。 - middle_token (
str
, optional, 預設為" <MID>"
) — 用於填充的中間標記。 - suffix_token (
str
, optional, 預設為" <SUF>"
) — 用於填充的字尾標記。 - eot_token (
str
, optional, 預設為" <EOT>"
) — 用於填充的文字結束標記。 - fill_token (
str
, optional, 預設為"<FILL_ME>"
) — 用於分隔字首和字尾之間輸入的標記。 - additional_special_tokens (
list[str]
, optional) — 分詞器使用的附加特殊標記。 - add_bos_token (
bool
, optional, 預設為True
) — 是否在序列開頭新增序列開始標記。 - add_eos_token (
bool
, optional, 預設為False
) — 是否在序列末尾新增序列結束標記。 - use_default_system_prompt (
bool
, optional, 預設為False
) — 是否使用 Llama 的預設系統提示。
構建 Llama 分詞器。基於位元組級位元組對編碼。
這主要使用 ByteFallback 且不進行規範化。
>>> from transformers import CodeLlamaTokenizerFast
>>> tokenizer = CodeLlamaTokenizerFast.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]
如果要更改 bos_token
或 eos_token
,請務必在初始化模型時指定它們,或呼叫 tokenizer.update_post_processor()
以確保後處理正確完成(否則編碼序列的第一個和最後一個標記的值將不正確)。有關更多詳細資訊,請檢視 [後處理器] (https://huggingface.co/docs/tokenizers/api/post-processors) 文件。
此分詞器繼承自 PreTrainedTokenizerFast,其中包含大部分主要方法。使用者應參閱此超類以獲取有關這些方法的更多資訊。預設配置與 meta-llama/CodeLlama-7b-Instruct-hf 的配置匹配,支援提示填充。
build_inputs_with_special_tokens
< source >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) → list[int]
透過連線和新增特殊標記來構建序列或序列對的模型輸入,用於序列分類任務。特殊標記取決於呼叫 set_lang。
NLLB 序列的格式如下,其中 X
表示序列
input_ids
(用於編碼器)X [eos, src_lang_code]
decoder_input_ids
:(用於解碼器)X [eos, tgt_lang_code]
從不使用 BOS。序列對不是預期的用例,但它們將在沒有分隔符的情況下處理。
get_special_tokens_mask
< source >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None already_has_special_tokens: bool = False ) → 一個包含整數範圍 [0, 1] 的列表
從未新增特殊令牌的令牌列表中檢索序列 ID。使用分詞器 prepare_for_model
或 encode_plus
方法新增特殊令牌時會呼叫此方法。
create_token_type_ids_from_sequences
< source >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) → list[int]
建立與傳入序列對應的標記型別 ID。什麼是標記型別 ID?
如果模型有特殊的構建方式,應在子類中重寫此方法。
使用當前的 bos_token
和 eos_token
更新底層後處理器。