# CodeLlama

[Code Llama](https://huggingface.co/papers/2308.12950)は、コーディングタスク向けに[Llama 2](./llama2)をベースとした大規模言語モデルのファミリーです。一般的なコード、Python特化型、指示追従型という異なるバリエーションがあり、いずれも7B、13B、34B、70Bのパラメータサイズで提供されています。Code Llamaモデルは、コードの生成、説明、さらには欠落部分の補完（「infilling」と呼ばれる）を行うことができます。また、16Kトークンのシーケンスで学習されていますが、最大100kトークンまでの非常に長いコンテキストでも安定した生成が可能です。

すべての元の Code Llama チェックポイントは、[Code Llama](https://huggingface.co/collections/meta-llama/code-llama-family-661da32d0a9d678b6f55b933) コレクション内で確認できます。

> [!TIP]
> Code Llamaモデルの詳細なコーディングタスクへの適用例については、右側のサイドバーにあるCode Llamaモデルをクリックしてください。

以下の例では、[Pipeline](/docs/transformers/main/ja/main_classes/pipelines#transformers.Pipeline)、[AutoModel](/docs/transformers/main/ja/model_doc/auto#transformers.AutoModel)、およびコマンドラインからコードを生成する方法を示しています。

```python
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'])
```

```python
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](../quantization/overview) の概要を参照してください。

以下の例では、[bitsandbytes](../quantization/bitsandbytes)を使用して、重みを4ビットに量子化します。

```python
# 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](https://github.com/huggingface/transformers/blob/beb9b5b02246b9b7ee81ddf938f93f44cfeaad19/src/transformers/utils/attention_visualizer.py#L139) を使用して、モデルが注意できるトークンと注意できないトークンをより深く理解してください。

```python
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>`トークンを使用します。トークナイザーはこのトークンを分割して、[元の学習パターン](https://github.com/facebookresearch/codellama/blob/cb51c14ec761370ba2e2bc351374a79265d0465e/llama/generation.py#L402)に従うフォーマット済みの入力文字列を作成します。これは、パターンを自分で用意するよりも堅牢です。

    ```py
    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](https://github.com/google/sentencepiece)に基づくバイトペアエンコーディングモデルです。デコード時に、最初のトークンが単語の先頭（例: “Banana”）である場合、トークナイザーは文字列の先頭にプレフィックススペースを付与しません。

## CodeLlamaTokenizer[[transformers.CodeLlamaTokenizer]]

#### transformers.CodeLlamaTokenizer[[transformers.CodeLlamaTokenizer]]

```python
transformers.CodeLlamaTokenizer(vocab: str | dict[str, int] | None = None, merges: str | list[str] | None = 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, use_default_system_prompt: bool = False, add_prefix_space: bool | None = True, add_bos_token: bool = True, **kwargs)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/models/code_llama/tokenization_code_llama.py#L41)

**パラメータ:**

clean_up_tokenization_spaces (`str`、*任意*、デフォルトは`False`) : デコード後にスペースをクリーンアップするかどうか。クリーンアップとは、余分なスペースなどの潜在的なアーティファクトを削除することです。

unk_token (`str`、*任意*、デフォルトは `"<unk>"`) : 不明トークン。語彙に存在しないトークンは ID に変換できず、代わりにこのトークンが設定されます。

bos_token (`str`、*任意*、デフォルトは`"<s>"`) : 事前学習中に使用されたシーケンスの開始トークンです。シーケンス分類器のトークンとして使用できます。

eos_token (`str`、*任意*、デフォルトは `"</s>"`) : シーケンスの終了トークン。

prefix_token (`str`、*任意*、デフォルトは `"▁<PRE>"`) : infilling に使用されるプレフィックストークン。

middle_token (`str`、*任意*、デフォルトは `"▁<MID>"`) : インフィルリングに使用される中間トークン。

suffix_token (`str`、*任意*、デフォルトは `"▁<SUF>"`) : infilling に使用されるサフィックストークン。

eot_token (`str`、*任意*、デフォルトは `"▁<EOT>"`) : infilling に使用されるテキスト終了トークン。

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](https://github.com/google/sentencepiece) ファイル（通常は .model 拡張子を持っています）。

Llamaのトークナイザーを構築します。バイトレベルのByte-Pair-Encodingに基づいています。

ここでは、特にByteFallbackを使用し、正規化は行いません。

```python
>>> 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](/docs/transformers/main/ja/main_classes/tokenizer#transformers.TokenizersBackend) を継承しており、主要なメソッドの大部分が含まれています。これらのメソッドに関する詳細については、このスーパークラスを参照してください。デフォルトの構成は、プロンプトインフィルをサポートする [meta-llama/CodeLlama-7b-Instruct-hf](https://huggingface.co/meta-llama/CodeLlama-7b-Instruct-hf/blob/main/tokenizer_config.json) のものと一致します。

#### get_special_tokens_mask[[transformers.CodeLlamaTokenizer.get_special_tokens_mask]]

```python
get_special_tokens_mask(token_ids_0: list[int], token_ids_1: list[int] | None = None, already_has_special_tokens: bool = False)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/tokenization_utils_base.py#L1338)

**パラメータ:**

token_ids_0 : (すでにフォーマット済みの可能性がある) シーケンスの ID のリスト。

token_ids_1 `already_has_special_tokens=True` の場合は使用されません。その場合は None でなければなりません。

already_has_special_tokens : シーケンスがすでに特殊トークンでフォーマットされているかどうか。

**戻り値:** 範囲 [0, 1] 内の整数のリスト

特殊トークンには1、シーケンストークンには0を指定します。

特殊トークンが追加されていないトークンリストからシーケンスIDを取得します。

高速なトークナイザーでは、データコラテーターは`already_has_special_tokens=True`を指定してこの関数を呼び出し、すでに整形済みのシーケンスに対してマスクを構築します。その場合、`all_special_ids`への所属を確認することによってマスクを計算します。

#### update_post_processor[[transformers.CodeLlamaTokenizer.update_post_processor]]

```python
update_post_processor()
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/tokenization_utils_tokenizers.py#L627)

現在の`bos_token`と`eos_token`で、基盤となるpost processorを更新します。

#### save_vocabulary[[transformers.CodeLlamaTokenizer.save_vocabulary]]

```python
save_vocabulary(save_directory: str, filename_prefix: str | None = None)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/tokenization_utils_tokenizers.py#L546)

## CodeLlamaTokenizerFast[[transformers.CodeLlamaTokenizer]]

#### transformers.CodeLlamaTokenizer[[transformers.CodeLlamaTokenizer]]

```python
transformers.CodeLlamaTokenizer(vocab: str | dict[str, int] | None = None, merges: str | list[str] | None = 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, use_default_system_prompt: bool = False, add_prefix_space: bool | None = True, add_bos_token: bool = True, **kwargs)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/models/code_llama/tokenization_code_llama.py#L41)

**パラメータ:**

clean_up_tokenization_spaces (`str`、*任意*、デフォルトは`False`) : デコード後にスペースをクリーンアップするかどうか。クリーンアップとは、余分なスペースなどの潜在的なアーティファクトを削除することです。

unk_token (`str`、*任意*、デフォルトは `"<unk>"`) : 不明トークン。語彙に存在しないトークンは ID に変換できず、代わりにこのトークンが設定されます。

bos_token (`str`、*任意*、デフォルトは`"<s>"`) : 事前学習中に使用されたシーケンスの開始トークンです。シーケンス分類器のトークンとして使用できます。

eos_token (`str`、*任意*、デフォルトは `"</s>"`) : シーケンスの終了トークン。

prefix_token (`str`、*任意*、デフォルトは `"▁<PRE>"`) : infilling に使用されるプレフィックストークン。

middle_token (`str`、*任意*、デフォルトは `"▁<MID>"`) : インフィルリングに使用される中間トークン。

suffix_token (`str`、*任意*、デフォルトは `"▁<SUF>"`) : infilling に使用されるサフィックストークン。

eot_token (`str`、*任意*、デフォルトは `"▁<EOT>"`) : infilling に使用されるテキスト終了トークン。

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](https://github.com/google/sentencepiece) ファイル（通常は .model 拡張子を持っています）。

Llamaのトークナイザーを構築します。バイトレベルのByte-Pair-Encodingに基づいています。

ここでは、特にByteFallbackを使用し、正規化は行いません。

```python
>>> 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](/docs/transformers/main/ja/main_classes/tokenizer#transformers.TokenizersBackend) を継承しており、主要なメソッドの大部分が含まれています。これらのメソッドに関する詳細については、このスーパークラスを参照してください。デフォルトの構成は、プロンプトインフィルをサポートする [meta-llama/CodeLlama-7b-Instruct-hf](https://huggingface.co/meta-llama/CodeLlama-7b-Instruct-hf/blob/main/tokenizer_config.json) のものと一致します。

#### set_infilling_processor[[transformers.CodeLlamaTokenizer.set_infilling_processor]]

```python
set_infilling_processor(reset, suffix_first = False, add_special_tokens = True)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/models/code_llama/tokenization_code_llama.py#L229)

`infilling`のプロンプト形式が遵守されるよう、normalizerを更新します。infillingの形式は以下の通りです: suffix_first の場合 "  {suf}  {pre}"、それ以外の場合 "  {pre} {suf} "

`reset` が `True` に設定されている場合、`normalizer` と `post_processor` は「通常」の動作にリセットされます。これは、normalizer が接頭辞のスペースを追加し、`post_processor` が入力テキストに `bos_token` を追加する動作です。

