Transformers 文件

CodeLlama

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

PyTorch Flax

CodeLlama

Code Llama 是一個基於 Llama 2 的大型語言模型家族,專門用於編碼任務。它有不同的變體——通用程式碼、Python 專用和指令遵循變體——所有這些都提供 7B、13B、34B 和 70B 引數。Code Llama 模型可以生成、解釋,甚至填充程式碼中缺失的部分(稱為“填充”)。它還可以處理非常長的上下文,在 16K 令牌序列上進行訓練,但仍可穩定生成多達 100k 令牌。

您可以在 Code Llama 集合下找到所有原始 Code Llama 檢查點。

單擊右側邊欄中的 Code Llama 模型,獲取更多如何將 Code Llama 應用於不同編碼任務的示例。

下面的示例演示如何使用 PipelineAutoModel,以及從命令列生成程式碼。

流水線
自動模型
Transformers CLI
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 相同,後者支援提示填充。

build_inputs_with_special_tokens

< >

( token_ids_0 token_ids_1 = None )

get_special_tokens_mask

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None already_has_special_tokens: bool = False ) list[int]

引數

  • token_ids_0 (list[int]) — ID 列表。
  • token_ids_1 (list[int], 可選) — 序列對的第二個 ID 列表。
  • already_has_special_tokens (bool, 可選, 預設為 False) — 令牌列表是否已用模型的特殊令牌格式化。

返回

list[int]

一個範圍為 [0, 1] 的整數列表:1 表示特殊標記,0 表示序列標記。

從沒有新增特殊標記的標記列表中檢索序列ID。此方法在使用分詞器prepare_for_model方法新增特殊標記時呼叫。

create_token_type_ids_from_sequences

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

引數

  • token_ids_0 (list[int]) — ID 列表。
  • token_ids_1 (list[int], optional) — 可選的第二組 ID 列表,用於序列對。

返回

list[int]

根據給定序列的 token type IDs 列表。

根據傳入的兩個序列建立掩碼,用於序列對分類任務。一個 ALBERT

如果 token_ids_1None,則此方法僅返回掩碼的第一部分(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

< >

( save_directory filename_prefix: typing.Optional[str] = None ) Tuple(str)

引數

  • save_directory (str) — 儲存詞彙表的目錄。

返回

Tuple(str)

儲存的檔案路徑。

將詞彙表和特殊標記檔案儲存到目錄。

CodeLlamaTokenizerFast

class transformers.CodeLlamaTokenizerFast

< >

( 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_tokeneos_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

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

引數

  • token_ids_0 (list[int]) — 將新增特殊標記的 ID 列表。
  • token_ids_1 (list[int], optional) — 可選的第二組 ID 列表,用於序列對。

返回

list[int]

包含適當特殊標記的 輸入 ID 列表。

透過連線和新增特殊標記來構建序列或序列對的模型輸入,用於序列分類任務。特殊標記取決於呼叫 set_lang。

NLLB 序列的格式如下,其中 X 表示序列

  • input_ids(用於編碼器)X [eos, src_lang_code]
  • decoder_input_ids:(用於解碼器)X [eos, tgt_lang_code]

從不使用 BOS。序列對不是預期的用例,但它們將在沒有分隔符的情況下處理。

get_special_tokens_mask

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None already_has_special_tokens: bool = False ) 一個包含整數範圍 [0, 1] 的列表

引數

  • token_ids_0 (list[int]) — 第一個序列的 ID 列表。
  • token_ids_1 (list[int], optional) — 第二個序列的 ID 列表。
  • already_has_special_tokens (bool, optional, 預設為 False) — 標記列表是否已按模型特殊標記格式化。

返回

一個範圍在 [0, 1] 的整數列表

特殊令牌為 1,序列令牌為 0。

從未新增特殊令牌的令牌列表中檢索序列 ID。使用分詞器 prepare_for_modelencode_plus 方法新增特殊令牌時會呼叫此方法。

create_token_type_ids_from_sequences

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

引數

  • token_ids_0 (list[int]) — 第一個分詞序列。
  • token_ids_1 (list[int], optional) — 第二個分詞序列。

返回

list[int]

標記型別 ID。

建立與傳入序列對應的標記型別 ID。什麼是標記型別 ID?

如果模型有特殊的構建方式,應在子類中重寫此方法。

update_post_processor

< >

( )

使用當前的 bos_tokeneos_token 更新底層後處理器。

save_vocabulary

< >

( save_directory: str filename_prefix: typing.Optional[str] = None )

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.