# CodeLlama

[Code Llama](https://huggingface.co/papers/2308.12950) هو عائلة متخصصة من نماذج اللغة الكبيرة المبنية على [Llama 2](./llama2) لمهام البرمجة. يتوفر بعدة أشكال - كود عام، محدد للغة Python، ومتغير لمتابعة التعليمات - جميعها متاحة بحجم 7B و13B و34B و70B من المعاملات. يمكن لنماذج Code Llama توليد الشرح وحتى ملء الأجزاء الناقصة من الكود الخاص بك (يُسمى "infilling"). كما يمكنه التعامل مع سياقات طويلة جداً مع توليد مستقر يصل إلى 100k رمز، على الرغم من أنه تم تدريبه على تسلسلات من 16K رمز.

يمكنك العثور على جميع نقاط التفتيش الأصلية لـ Code Llama ضمن مجموعة [Code Llama](https://huggingface.co/collections/meta-llama/code-llama-family-661da32d0a9d678b6f55b933).

> [!TIP]
> انقر على نماذج Code Llama في الشريط الجانبي الأيمن لمزيد من الأمثلة حول كيفية تطبيق Code Llama على مهام البرمجة المختلفة.

يُبيّن المثال أدناه كيفية توليد الشيفرة باستخدام [Pipeline](/docs/transformers/main/ar/main_classes/pipelines#transformers.Pipeline)، أو [AutoModel](/docs/transformers/main/ar/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/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""")
```

    

## ملاحظات

- يتوفر استيفاء النصوص فقط في النماذج الأساسية بحجم 7B و13B، وليس في نماذج Python أو Instruct أو 34B أو 70B.
- استخدم الرمز `<FILL_ME>` في المكان الذي تريد أن يُملأ فيه مدخلاتك. يقوم مُجزِّئ الرموز (tokenizer) بتقسيم هذا الرمز لإنشاء نص مدخلات منسّق يتبع [نمط التدريب الأصلي](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>"`) : رمز المجهول. الرمز غير الموجود في قاموس الكلمات لا يمكن تحويله إلى معرّف، لذا يُعيَّن هذا الرمز بدلاً منه.

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](https://github.com/google/sentencepiece) (يحمل عادةً امتداد .model) يحتوي على المفردات اللازمة لإنشاء مُجزِّئ.

أنشئ مُرمِّز Llama. يعتمد على ترميز زوج البايت على مستوى البايت.

يستخدم هذا بشكل ملحوظ 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/ar/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) التي تدعم ملء الأوامر (prompt infilling).

#### 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 : قائمة معرّفات (IDs) للتسلسل (الذي قد يكون منسّقًا بالفعل).

token_ids_1 : غير مستخدم عندما يكون `already_has_special_tokens=True`. يجب أن يكون None في هذه الحالة.

already_has_special_tokens : ما إذا كانت التسلسلة منسّقة مسبقًا باستخدام الرموز الخاصة.

**يعيد:** قائمة من الأعداد الصحيحة في المدى [0, 1]

1 لرمز خاص، 0 لرمز التسلسل.

استرجاع معرّفات التسلسلات من قائمة الرموز التي لم تُضف إليها أي رموز خاصة.

للمُرمِّزات السريعة، تستدعي مُجمِّعات البيانات هذه الدالة مع `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` الحاليين.

#### 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>"`) : رمز المجهول. الرمز غير الموجود في قاموس الكلمات لا يمكن تحويله إلى معرّف، لذا يُعيَّن هذا الرمز بدلاً منه.

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](https://github.com/google/sentencepiece) (يحمل عادةً امتداد .model) يحتوي على المفردات اللازمة لإنشاء مُجزِّئ.

أنشئ مُرمِّز Llama. يعتمد على ترميز زوج البايت على مستوى البايت.

يستخدم هذا بشكل ملحوظ 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/ar/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) التي تدعم ملء الأوامر (prompt infilling).

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

يحدّث المُطبِّع (normalizer) للتأكد من احترام تنسيق الموجه (prompt) الخاص بـ`infilling`. تنسيق infilling هو التالي: إذا كان suffix_first "  {suf}  {pre}" وإلا: "  {pre} {suf} "

إذا تم تعيين `reset` إلى `True`، فإن `normalizer` و`post_processor` يُعادان إلى سلوكهما "الطبيعي"، وهو إضافة مسافة بادئة للمُطَبِّع، وإضافة `bos_token` إلى النص المُدخل للمُعالِج اللاحق `post_processor`.

