Transformers documentation
CodeLlama
このモデルは2023年8月24日にHF papersで公開され、2023年8月25日にHugging Face Transformersに貢献されました。
CodeLlama
Code Llamaは、コーディングタスク向けにLlama 2をベースとした大規模言語モデルのファミリーです。一般的なコード、Python特化、指示追従の3つのバリエーションがあり、いずれも7B、13B、34B、70Bのパラメータサイズで提供されています。Code Llamaモデルは、コードの生成、説明、および欠落部分の補完(「infilling」と呼ばれる)を行うことができます。また、16Kトークンのシーケンスで学習されていますが、最大100kトークンまでの非常に長いコンテキストでも安定した生成が可能です。
すべての元の Code Llama チェックポイントは、Code Llama コレクション内で確認できます。
Code Llamaモデルの詳細なコーディングタスクへの適用例については、右側のサイドバーにあるCode Llamaモデルをクリックしてください。
以下の例では、Pipeline、AutoModel、およびコマンドラインからコードを生成する方法を示しています。
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/CodeLlama-7b-hf",
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'])from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-7b-hf",
device_map="auto",
attn_implementation="sdpa"
)
# basic code generation
prompt = "# Function to calculate the factorial of a number\ndef factorial(n):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(
**input_ids,
max_new_tokens=256,
cache_implementation="static"
)
print(tokenizer.decode(output[0], skip_special_tokens=True))
# infilling
infill_prompt = "def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result"
input_ids = tokenizer(infill_prompt, return_tensors="pt").to(model.device)
filled_output = model.generate(**input_ids, max_new_tokens=200)
filled_text = tokenizer.decode(filled_output[0], skip_special_tokens=True)
print(filled_text)Quantization は、重みを低精度で表現することで、大規模モデルのメモリ負荷を軽減します。利用可能な Quantization バックエンドの詳細については、Quantization の概要を参照してください。
以下の例では、bitsandbytesを使用して、重みを4ビットに量子化します。
# pip install bitsandbytes
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, CodeLlamaTokenizer
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",
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(model.device)
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""")
注記
Infillingは、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", device_map="auto") PROMPT = '''def remove_non_ascii(s: str) -> str: """ <FILL_ME> return result ''' input_ids = tokenizer(PROMPT, return_tensors="pt").to(model.device)["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
クラス transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_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 = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
パラメータ
- clean_up_tokenization_spaces (
str、任意、デフォルトはFalse) — デコード後にスペースをクリーンアップするかどうか。クリーンアップとは、余分なスペースなどの潜在的なアーティファクトを削除することです。 - unk_token (
str、任意、デフォルトは"<unk>") — 不明トークンです。語彙に存在しないトークンは ID に変換できず、代わりにこのトークンが設定されます。 - bos_token (
str、任意、デフォルトは"<s>") — 事前学習で使用されたシーケンス開始トークンです。シーケンス分類器のトークンとして使用できます。 - eos_token (
str、任意、デフォルトは"</s>") — シーケンスの終了トークンです。 - prefix_token (
str、任意、デフォルトは"▁<PRE>") — インフィルリングに使用されるプレフィックストークン。 - middle_token (
str、任意、デフォルトは"▁<MID>") — インフィルリングに使用される中間トークン。 - suffix_token (
str、任意、デフォルトは"▁<SUF>") — インフィルリングに使用されるサフィックストークン。 - eot_token (
str、任意、デフォルトは"▁<EOT>") — インフィルリングに使用されるテキスト終了トークン。 - fill_token (
str、任意、デフォルトは"<FILL_ME>") — プレフィックスとサフィックスの間に挿入して入力を分割するために使用されるトークンです。 - additional_special_tokens (
list[str]、省略可) — トークナイザーで使用される追加の特殊トークン。 - add_bos_token (
bool、省略可能、デフォルトはTrue) — シーケンスの先頭にシーケンス開始トークンを追加するかどうかを指定します。 - add_eos_token (
bool、任意、デフォルトはFalse) — シーケンスの末尾にシーケンス終了トークンを追加するかどうか。 - use_default_system_prompt (
bool、省略可、デフォルトはFalse) — Llama のデフォルトのシステムプロンプトを使用するかどうかを指定します。 - add_prefix_space (
bool, 任意) — 入力に先頭スペースを追加するかどうか。これにより、先頭の単語を他の単語と同様に扱うことができます。 - vocab (
str、dictまたはlist、任意) — カスタム語彙辞書。指定しない場合、vocab_file から語彙が読み込まれます。 - merges (
strまたはlist、省略可) — カスタムマージリスト。指定しない場合、マージは merges_file から読み込まれます。 - vocab_file (
str, 任意) — トークナイザーをインスタンス化するために必要な語彙を含む、SentencePiece ファイル(通常は .model 拡張子を持っています)。
Llamaのトークナイザーを構築します。バイトレベルのByte-Pair-Encodingに基づいています。
ここでは、特にByteFallbackを使用し、正規化は行いません。
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.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() を呼び出して、後処理が正しく行われることを確認してください(そうしないと、エンコードされたシーケンスの最初のトークンと最後のトークンの値が正しくなりません)。詳細については、[post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors) のドキュメントを参照してください。
このトークナイザーは、主要なメソッドの大部分を含む PreTrainedTokenizerFast を継承しています。これらのメソッドに関する詳細については、このスーパークラスを参照してください。デフォルトの構成は、プロンプトインフィルを対応する meta-llama/CodeLlama-7b-Instruct-hf のものと一致しています。
get_special_tokens_mask
< source >( token_ids_0: list[int]token_ids_1: list[int] | None = Nonealready_has_special_tokens: bool = False ) → A list of integers in the range [0, 1]
特殊トークンが追加されていないトークンリストからシーケンスIDを取得します。
高速なトークナイザーでは、データコラテーターはalready_has_special_tokens=Trueを指定してこれを呼び出し、すでに整形済みのシーケンスに対してマスクを構築します。その場合、all_special_idsへの所属を確認することによってマスクを計算します。
現在のbos_tokenとeos_tokenで、基盤となるpost processorを更新します。
CodeLlamaTokenizerFast
クラス transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_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 = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
パラメータ
- clean_up_tokenization_spaces (
str、任意、デフォルトはFalse) — デコード後にスペースをクリーンアップするかどうか。クリーンアップとは、余分なスペースなどの潜在的なアーティファクトを削除することです。 - unk_token (
str、任意、デフォルトは"<unk>") — 不明トークンです。語彙に存在しないトークンは ID に変換できず、代わりにこのトークンが設定されます。 - bos_token (
str、任意、デフォルトは"<s>") — 事前学習で使用されたシーケンス開始トークンです。シーケンス分類器のトークンとして使用できます。 - eos_token (
str、任意、デフォルトは"</s>") — シーケンスの終了トークンです。 - prefix_token (
str、任意、デフォルトは"▁<PRE>") — インフィルリングに使用されるプレフィックストークン。 - middle_token (
str、任意、デフォルトは"▁<MID>") — インフィルリングに使用される中間トークン。 - suffix_token (
str、任意、デフォルトは"▁<SUF>") — インフィルリングに使用されるサフィックストークン。 - eot_token (
str、任意、デフォルトは"▁<EOT>") — インフィルリングに使用されるテキスト終了トークン。 - fill_token (
str、任意、デフォルトは"<FILL_ME>") — プレフィックスとサフィックスの間に挿入して入力を分割するために使用されるトークンです。 - additional_special_tokens (
list[str]、省略可) — トークナイザーで使用される追加の特殊トークン。 - add_bos_token (
bool、省略可能、デフォルトはTrue) — シーケンスの先頭にシーケンス開始トークンを追加するかどうかを指定します。 - add_eos_token (
bool、任意、デフォルトはFalse) — シーケンスの末尾にシーケンス終了トークンを追加するかどうか。 - use_default_system_prompt (
bool、任意、デフォルトはFalse) — Llama のデフォルトのシステムプロンプトを使用するかどうかを指定します。 - add_prefix_space (
bool, 任意) — 入力に先頭スペースを追加するかどうか。これにより、先頭の単語を他の単語と同様に扱うことができます。 - vocab (
str、dictまたはlist、任意) — カスタム語彙辞書。指定しない場合、vocab_file から語彙が読み込まれます。 - merges (
strまたはlist、省略可) — カスタムマージリスト。指定しない場合、マージは merges_file から読み込まれます。 - vocab_file (
str, 任意) — トークナイザーをインスタンス化するために必要な語彙を含む、SentencePiece ファイル(通常は .model 拡張子を持っています)。
Llamaのトークナイザーを構築します。バイトレベルのByte-Pair-Encodingに基づいています。
ここでは、特にByteFallbackを使用し、正規化は行いません。
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.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() を呼び出して、後処理が正しく行われることを確認してください(そうしないと、エンコードされたシーケンスの最初のトークンと最後のトークンの値が正しくなりません)。詳細については、[post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors) のドキュメントを参照してください。
このトークナイザーは、主要なメソッドの大部分を含む PreTrainedTokenizerFast を継承しています。これらのメソッドに関する詳細については、このスーパークラスを参照してください。デフォルトの構成は、プロンプトインフィルをサポートする meta-llama/CodeLlama-7b-Instruct-hf のものと一致しています。
infillingのプロンプト形式が遵守されるよう、normalizerを更新します。infillingの形式は以下の通りです: suffix_firstの場合
” <PRE> <SUF>{suf} <MID> {pre}”
それ以外の場合:
” <PRE> {pre} <SUF>{suf} <MID>”
reset が True に設定されている場合、normalizer と post_processor は「通常」の動作にリセットされます。これは、normalizer が接頭辞のスペースを追加し、post_processor が入力テキストに bos_token を追加する動作です。