# Llama3

```python
import torch

import transformers

model_id = "meta-llama/Meta-Llama-3-8B"

pipeline = transformers.pipeline("text-generation", model=model_id, model_kwargs={"dtype": torch.bfloat16}, device_map="auto")
pipeline("Hey how are you doing today?")
```

## نظرة عامة

قُدِّم نموذج [Llama3](https://huggingface.co/papers/2407.21783) في [Introducing Meta Llama 3: The most capable openly available LLM to date](https://ai.meta.com/blog/meta-llama-3/) من قِبل فريق Meta AI.

المستخلص من المدونة هو كالتالي:

*اليوم، يسعدنا أن نشارككم أول نموذجين من الجيل القادم من Llama، وهما Meta Llama 3، المتاحان للاستخدام الواسع. تتميز هذه الإصدار بنماذج لغوية مُدرَّبة مسبقًا ونماذج مُحسَّنة عبر التعليمات، بحجم 8B و70B من المعاملات، وقادرة على دعم مجموعة واسعة من حالات الاستخدام. يُظهر هذا الجيل الجديد من Llama أداءً متقدمًا على نطاق واسع من معايير الأداء الصناعية، ويقدّم قدرات جديدة، بما في ذلك تحسين الاستدلال. نعتقد أن هذه أفضل نماذج مفتوحة المصدر من فئتها، بلا منازع. ودعمًا لسياستنا طويلة الأمد في الانفتاح، نضع Llama 3 بين أيدي المجتمع. نريد أن نطلق العنان للموجة القادمة من الابتكار في مجال الذكاء الاصطناعي عبر كامل البنية التحتية — من التطبيقات إلى أدوات المطورين، ومن التقييمات إلى تحسينات الاستدلال وغيرها. لا ننتظر إلا لرؤية ما ستبنيونه، ونتطلع إلى تلقي ملاحظاتكم.*

يمكنك الاطلاع على جميع نقاط التفتيش لنماذج Llama3 [هنا](https://huggingface.co/models?search=llama3). ويمكن العثور على الكود الأصلي للمؤلفين [هنا](https://github.com/meta-llama/llama3).

## نصائح للاستخدام

تم تدريب نماذج `Llama3` باستخدام `bfloat16`، لكن الاستدلال الأصلي يستخدم `float16`. تستخدم نقاط التفتيش المرفوعة على Hub `dtype = 'float16'`، والتي ستستخدمها واجهة `AutoModel` لتحويل نقاط التفتيش من `torch.float32` إلى `torch.float16`.

يكون `dtype` للأوزان عبر الإنترنت غير ذي صلة في الغالب، ما لم تكن تستخدم `dtype="auto"` عند تهيئة نموذج باستخدام `model = AutoModelForCausalLM.from_pretrained("path", dtype = "auto")`. والسبب في ذلك أن النموذج سيُحمَّل أولاً (باستخدام `dtype` الخاص بنقاط التفتيش عبر الإنترنت)، ثم سيُحوَّل إلى `dtype` الافتراضي لـ`torch` (حيث يصبح `torch.float32`، مع device_map="auto")، وأخيراً، إذا كان هناك `dtype` أو `torch_dtype` مُقدَّم في الإعدادات، فسيتم استخدامه.

لا يُوصى بتدريب النموذج في `float16`، ومن المعروف أنه ينتج `nan`؛ لذلك يجب تدريب النموذج في `bfloat16`.

نصائح:

- يمكن الحصول على أوزان نماذج Llama3 من خلال ملء [هذا النموذج](https://ai.meta.com/resources/models-and-libraries/llama-downloads/)
- المعمارية هي نفسها تمامًا مثل Llama2.
- المُجزِّئ هو نموذج BPE مبني على [tiktoken](https://github.com/openai/tiktoken) (على عكس ذلك المبني على تنفيذ sentencepiece الخاص بـ Llama2). الفارق الرئيسي أنه يتجاهل قواعد دمج BPE عندما يكون رمز الإدخال جزءاً من قاموس الرموز. وهذا يعني أنه إذا لم يوجد دمج لإنتاج `"hugging"`، فبدلاً من الحصول على أصغر الوحدات، مثل `["hug","ging"]` التي تُشكّل رمزين، إذا كان `"hugging"` جزءاً من قاموس الرموز، فسيُعاد تلقائياً كرمز واحد.
- يستخدم النموذج الأصلي `pad_id = -1` مما يعني أنه لا يوجد رمز تعبئة. لا يمكننا استخدام المنطق نفسه، لذا تأكد من إضافة رمز تعبئة باستخدام `tokenizer.add_special_tokens({"pad_token":"<pad>"})` وإعادة ضبط حجم تضمين الرموز وفقاً لذلك. كما يجب عليك تعيين `model.config.pad_token_id`. يتم تهيئة طبقة `embed_tokens` في النموذج باستخدام `self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.config.padding_idx)`، مما يضمن أن ترميز رمز التعبئة سيُخرج أصفاراً، لذا يُنصح بتمريره عند التهيئة.
- يمكن تحويل نقطة التفتيش الأصلية باستخدام [سكربت التحويل](https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/convert_llama_weights_to_hf.py). يمكن استدعاء السكربت بالأمر التالي (مثال):

    ```bash
    python src/transformers/models/llama/convert_llama_weights_to_hf.py \
        --input_dir /path/to/downloaded/llama/weights --model_size 7B --output_dir /output/path --llama_version 3
    ```

- بعد التحويل، يمكن تحميل النموذج ومجزّئ الرموز عبر:

    ```python
    from transformers import AutoModelForCausalLM, AutoTokenizer

    tokenizer = AutoTokenizer.from_pretrained("/output/path")
    model = AutoModelForCausalLM.from_pretrained("/output/path", device_map="auto")
    ```

    لاحظ أن تنفيذ السكربت يتطلب ذاكرة عشوائية (RAM) كافية لاستضافة النموذج بأكمله بدقة float16 (حتى لو كانت أكبر الإصدارات تأتي على شكل عدة نقاط تحقق، فإن كل نقطة تحتوي على جزء من كل وزن في النموذج، لذا نحتاج إلى تحميلها جميعًا في الذاكرة العشوائية). بالنسبة لنموذج 75B، فإن ذلك يتطلب 145 جيجابايت من الذاكرة العشوائية.

- عند استخدام Flash Attention 2 عبر `attn_implementation="flash_attention_2"`، لا تمرّر `dtype` إلى طريقة الفئة `from_pretrained` واستخدم تدريب الدقة المختلطة التلقائية. عند استخدام `Trainer`، يكفي تحديد `fp16` أو `bf16` إلى `True`. وإلا، تأكد من أنك تستخدم `torch.autocast`. هذا مطلوب لأن Flash Attention يدعم فقط نوعَي البيانات `fp16` و`bf16`.

## الموارد

تتوفر مجموعة كبيرة من الموارد الرائعة بالفعل على صفحة توثيق [Llama2](./llama2)، ونرحّب بالمساهمين لإضافة موارد جديدة مُنتقاة خصيصاً لـ Llama3 هنا! 🤗

