# CodeLlama

[Code Llama](https://huggingface.co/papers/2308.12950), kodlama görevleri için [Llama 2](./llama2) tabanlı, özel bir büyük dil modeli ailesidir. Farklı çeşitlerde sunulur: genel kod, Python'a özgü ve talimat takibi varyantı; tümü 7B, 13B, 34B ve 70B parametre seçenekleriyle mevcuttur. Code Llama modelleri kodunuzu üretebilir, açıklayabilir ve hatta eksik kısımlarını doldurabilir (buna "infilling" denir). 16K token uzunluğundaki diziler üzerinde eğitilmesine rağmen, 100k token'a kadar kararlı üretimle çok uzun bağlamları da işleyebilir.

Tüm orijinal Code Llama kontrol noktalarını [Code Llama](https://huggingface.co/collections/meta-llama/code-llama-family-661da32d0a9d678b6f55b933) koleksiyonunda bulabilirsiniz.

> [!TIP]
> Farklı kodlama görevlerine Code Llama uygulamanın daha fazla örneği için sağ kenar çubuğundaki Code Llama modellerine tıklayın.

Aşağıdaki örnek, [Pipeline](/docs/transformers/v5.23.0/tr/main_classes/pipelines#transformers.Pipeline), [AutoModel](/docs/transformers/v5.23.0/tr/model_doc/auto#transformers.AutoModel) veya komut satırı üzerinden kod üretmenin nasıl yapılacağını göstermektedir.

```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, ağırlıkları daha düşük bir hassasiyetle temsil ederek büyük modellerin bellek yükünü azaltır. Daha fazla kullanılabilir quantization backend'i için [Quantization](../quantization/overview) genel bakışına başvurun.

Aşağıdaki örnek, ağırlıkları yalnızca 4-bite küçültmek için [bitsandbytes](../quantization/bitsandbytes) kullanır.

```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))
```

Modelin hangi token'lara dikkat edebildiğini ve edemediğini daha iyi anlamak için [AttentionMaskVisualizer](https://github.com/huggingface/transformers/blob/beb9b5b02246b9b7ee81ddf938f93f44cfeaad19/src/transformers/utils/attention_visualizer.py#L139)'ı kullanın.

```python
from transformers.utils.attention_visualizer import AttentionMaskVisualizer

visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
  return a + b""")
```

    

## Notlar

- Infilling yalnızca 7B ve 13B taban modellerinde kullanılabilir; Python, Instruct, 34B veya 70B modellerinde kullanılamaz.
- Girdinizin doldurulmasını istediğiniz yerde `<FILL_ME>` belirteci kullanın. Tokenizer, bu belirteci bölerek [orijinal eğitim desenini](https://github.com/facebookresearch/codellama/blob/cb51c14ec761370ba2e2bc351374a79265d0465e/llama/generation.py#L402) takip eden biçimlendirilmiş bir girdi dizesi oluşturur. Bu, deseni kendiniz hazırlamaktan daha sağlamdır.

    ```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))
    ```

- Daha fazla eğitim veya ince ayar için `bfloat16`, çıkarım için ise `float16` kullanın.
- `BOS` karakteri, önek veya son ek kodlanırken dolgu için kullanılmaz; yalnızca her istemin başında kullanılır.
- Tokenizör, [SentencePiece](https://github.com/google/sentencepiece) tabanlı bir bayt çifti kodlama modelidir. Çözümleme sırasında, ilk token bir kelimenin başlangıcıysa (örneğin, “Banana”), tokenizör dizinin başına boşluk önekini eklemez.

## 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)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/code_llama/tokenization_code_llama.py#L41)

**Parametreler:**

clean_up_tokenization_spaces (`str`, *isteğe bağlı*, varsayılan `False`) : Çözümleme sonrası boşlukların temizlenip temizlenmeyeceğini belirtir. Temizleme işlemi, ek boşluklar gibi olası artefaktların kaldırılmasını içerir.

unk_token (`str`, *isteğe bağlı*, varsayılan `"<unk>"`) : Bilinmeyen token. Sözlükte yer almayan bir token, bir kimliğe dönüştürülemez ve bunun yerine bu token olarak ayarlanır.

bos_token (`str`, *isteğe bağlı*, varsayılan `"<s>"`) : Ön eğitim sırasında kullanılan dizinin başlangıç jetonu. Bir dizi sınıflandırıcı jetonu olarak kullanılabilir.

eos_token (`str`, *isteğe bağlı*, varsayılan `"</s>"`) : Sıra sonu belirteci.

prefix_token (`str`, *isteğe bağlı*, varsayılan `"▁<PRE>"`) : Dolgu (infilling) için kullanılan önek (prefix) belirteci.

middle_token (`str`, *isteğe bağlı*, varsayılan `"▁<MID>"`) : Dolgu (infilling) için kullanılan orta token.

suffix_token (`str`, *isteğe bağlı*, varsayılan `"▁<SUF>"`) : Dolgu için kullanılan sonek belirteci.

eot_token (`str`, *isteğe bağlı*, varsayılan `"▁<EOT>"`) : Dolgu (infilling) için kullanılan metin sonu belirteci.

fill_token (`str`, *isteğe bağlı*, varsayılan `"<FILL_ME>"`) : Girdinin önek ve son ek arasında bölünmesinde kullanılan belirteç.

additional_special_tokens (`list[str]`, *isteğe bağlı*) : Tokenizer tarafından kullanılan ek özel tokenlar.

add_bos_token (`bool`, *isteğe bağlı*, varsayılan `True`) : Dizilerin başına bir dizin başlangıç (beginning of sequence) token'ı eklenip eklenmeyeceğini belirtir.

add_eos_token (`bool`, *isteğe bağlı*, varsayılan `False`) : Dizilerin sonuna bir dizi sonu (end of sequence) belirteci eklenip eklenmeyeceğini belirtir.

use_default_system_prompt (`bool`, *isteğe bağlı*, varsayılan `False`) : Llama için varsayılan sistem isteminin kullanılıp kullanılmayacağı.

add_prefix_space (`bool`, *isteğe bağlı*) : Girdinin başına bir boşluk eklenip eklenmeyeceğini belirtir. Bu, baştaki kelimenin diğer kelimelerle aynı şekilde ele alınmasını sağlar.

vocab (`str`, `dict` veya `list`, *isteğe bağlı*) : Özel sözlük. Sağlanmazsa, sözlük vocab_file'den yüklenir.

merges (`str` veya `list`, *isteğe bağlı*) : Özel birleştirmeler listesi. Sağlanmazsa, birleştirmeler merges_file'den yüklenir.

vocab_file (`str`, *isteğe bağlı*) : Bir tokenizer'ı örneklemek için gerekli sözlüğü içeren [SentencePiece](https://github.com/google/sentencepiece) dosyası (genellikle .model uzantısına sahiptir).

Llama tokenizer'ı oluşturun. Bayt düzeyinde Byte-Pair-Encoding tabanlıdır.

Bu, özellikle ByteFallback kullanır ve normalizasyon uygulanmaz.

```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` veya `eos_token` değerlerini değiştirmek istiyorsanız, modelin başlatılması sırasında bunları belirtmekten veya `tokenizer.update_post_processor()` çağrısını yaparak son işleminin doğru şekilde gerçekleştirildiğinden emin olmaktan emin olun (aksi halde kodlanmış bir dizinin ilk ve son token değerleri doğru olmayacaktır). Daha fazla ayrıntı için [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors) belgesine göz atın.

Bu tokenizer, ana yöntemlerin çoğunu içeren [PreTrainedTokenizerFast](/docs/transformers/v5.23.0/tr/main_classes/tokenizer#transformers.TokenizersBackend) sınıfından devralır. Kullanıcıların bu yöntemler hakkında daha fazla bilgi için bu üst sınıfa başvurması gerekir. Varsayılan yapılandırma, prompt infilling'i destekleyen [meta-llama/CodeLlama-7b-Instruct-hf](https://huggingface.co/meta-llama/CodeLlama-7b-Instruct-hf/blob/main/tokenizer_config.json) ile eşleşir.

#### 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)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/tokenization_utils_base.py#L1337)

**Parametreler:**

token_ids_0 : (muhtemelen biçimlendirilmiş) dizinin kimlik listesi.

token_ids_1 `already_has_special_tokens=True` olduğunda kullanılmaz. Bu durumda None olmalıdır.

already_has_special_tokens : Dizi, özel jetonlarla zaten biçimlendirilmiş mi?

**Dönüş:** [0, 1] aralığında tamsayılar listesi

özel bir jeton için 1, bir dizi jetonu için 0.

Özel tokenlar eklenmemiş bir token listesinden dizi kimliklerini (sequence ids) alın.

Hızlı tokenizörler için veri toplayıcılar, biçimlendirilmiş bir dizinin üzerine bir maske oluşturmak üzere bunu `already_has_special_tokens=True` ile çağırır. Bu durumda, maskenin hesaplanması `all_special_ids` içinde üyelik kontrolü yapılarak gerçekleştirilir.

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

```python
update_post_processor()
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/tokenization_utils_tokenizers.py#L628)

Altta yatan post işlemcisini güncel `bos_token` ve `eos_token` ile günceller.

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

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

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/tokenization_utils_tokenizers.py#L547)

## 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)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/code_llama/tokenization_code_llama.py#L41)

**Parametreler:**

clean_up_tokenization_spaces (`str`, *isteğe bağlı*, varsayılan `False`) : Çözümleme sonrası boşlukların temizlenip temizlenmeyeceğini belirtir. Temizleme işlemi, ek boşluklar gibi olası artefaktların kaldırılmasını içerir.

unk_token (`str`, *isteğe bağlı*, varsayılan `"<unk>"`) : Bilinmeyen token. Sözlükte yer almayan bir token, bir kimliğe dönüştürülemez ve bunun yerine bu token olarak ayarlanır.

bos_token (`str`, *isteğe bağlı*, varsayılan `"<s>"`) : Ön eğitim sırasında kullanılan dizinin başlangıç jetonu. Bir dizi sınıflandırıcı jetonu olarak kullanılabilir.

eos_token (`str`, *isteğe bağlı*, varsayılan `"</s>"`) : Sıra sonu belirteci.

prefix_token (`str`, *isteğe bağlı*, varsayılan `"▁<PRE>"`) : Dolgu (infilling) için kullanılan önek (prefix) belirteci.

middle_token (`str`, *isteğe bağlı*, varsayılan `"▁<MID>"`) : Dolgu (infilling) için kullanılan orta token.

suffix_token (`str`, *isteğe bağlı*, varsayılan `"▁<SUF>"`) : Dolgu için kullanılan sonek belirteci.

eot_token (`str`, *isteğe bağlı*, varsayılan `"▁<EOT>"`) : Dolgu (infilling) için kullanılan metin sonu belirteci.

fill_token (`str`, *isteğe bağlı*, varsayılan `"<FILL_ME>"`) : Girdinin önek ve son ek arasında bölünmesinde kullanılan belirteç.

additional_special_tokens (`list[str]`, *isteğe bağlı*) : Tokenizer tarafından kullanılan ek özel tokenlar.

add_bos_token (`bool`, *isteğe bağlı*, varsayılan `True`) : Dizilerin başına bir dizin başlangıç (beginning of sequence) token'ı eklenip eklenmeyeceğini belirtir.

add_eos_token (`bool`, *isteğe bağlı*, varsayılan `False`) : Dizilerin sonuna bir dizi sonu (end of sequence) belirteci eklenip eklenmeyeceğini belirtir.

use_default_system_prompt (`bool`, *isteğe bağlı*, varsayılan `False`) : Llama için varsayılan sistem isteminin kullanılıp kullanılmayacağı.

add_prefix_space (`bool`, *isteğe bağlı*) : Girdinin başına bir boşluk eklenip eklenmeyeceğini belirtir. Bu, baştaki kelimenin diğer kelimelerle aynı şekilde ele alınmasını sağlar.

vocab (`str`, `dict` veya `list`, *isteğe bağlı*) : Özel sözlük. Sağlanmazsa, sözlük vocab_file'den yüklenir.

merges (`str` veya `list`, *isteğe bağlı*) : Özel birleştirmeler listesi. Sağlanmazsa, birleştirmeler merges_file'den yüklenir.

vocab_file (`str`, *isteğe bağlı*) : Bir tokenizer'ı örneklemek için gerekli sözlüğü içeren [SentencePiece](https://github.com/google/sentencepiece) dosyası (genellikle .model uzantısına sahiptir).

Llama tokenizer'ı oluşturun. Bayt düzeyinde Byte-Pair-Encoding tabanlıdır.

Bu, özellikle ByteFallback kullanır ve normalizasyon uygulanmaz.

```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` veya `eos_token` değerlerini değiştirmek istiyorsanız, modelin başlatılması sırasında bunları belirtmekten veya `tokenizer.update_post_processor()` çağrısını yaparak son işleminin doğru şekilde gerçekleştirildiğinden emin olmaktan emin olun (aksi halde kodlanmış bir dizinin ilk ve son token değerleri doğru olmayacaktır). Daha fazla ayrıntı için [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors) belgesine göz atın.

Bu tokenizer, ana yöntemlerin çoğunu içeren [PreTrainedTokenizerFast](/docs/transformers/v5.23.0/tr/main_classes/tokenizer#transformers.TokenizersBackend) sınıfından devralır. Kullanıcıların bu yöntemler hakkında daha fazla bilgi için bu üst sınıfa başvurması gerekir. Varsayılan yapılandırma, prompt infilling'i destekleyen [meta-llama/CodeLlama-7b-Instruct-hf](https://huggingface.co/meta-llama/CodeLlama-7b-Instruct-hf/blob/main/tokenizer_config.json) ile eşleşir.

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

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

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/code_llama/tokenization_code_llama.py#L229)

`infilling` için istem formatına uyulmasını sağlamak üzere normalizer'ı günceller. Infilling formatı şu şekildedir: suffix_first ise "  {suf}  {pre}" değilse: "  {pre} {suf} "

`reset` `True` olarak ayarlanırsa, `normalizer` ve `post_processor`, normalizer için bir önek boşluğu ekleyen ve `post_processor` için giriş metnine `bos_token` ekleyen "normal" davranışlarına sıfırlanır.

