من بنية GPT و LLaMA إلى التدريب الموزع وتحليل التكاليف و RLHF — دليل شامل ومتكامل
تمثل سلسلة GPT (Generative Pre-trained Transformer) العمود الفقري لثورة LLMs. طوّرتها OpenAI وكل إصدارة حقق قفزة نوعية في القدرات.
| النموذج | المعاملات | عدد الطبقات | hidden dim | عدد الرؤوس | حجم البيانات | سنة الإصدار |
|---|---|---|---|---|---|---|
| GPT-1 | 117M | 12 | 768 | 12 | ~4 GB | 2018 |
| GPT-2 Small | 124M | 12 | 768 | 12 | ~40 GB | 2019 |
| GPT-2 Medium | 355M | 24 | 1024 | 16 | ~40 GB | 2019 |
| GPT-2 Large | 774M | 36 | 1280 | 20 | ~40 GB | 2019 |
| GPT-2 XL | 1.5B | 48 | 1600 | 25 | ~40 GB | 2019 |
| GPT-3 | 175B | 96 | 12288 | 96 | ~570 GB | 2020 |
| GPT-4 (تقدير) | ~1.8T | ~120+ | ~16384 | ~128 | ~10+ TB | 2023 |
GPT-4 يقدر بأنه يستخدم Mixture of Experts (MoE) مع 8 خبراء، كل منهم بحجم ~220B معاملات، مما يعطيه حجماً فعالاً (~220B معاملات نشطة لكل forward pass) مع حجم إجمالي ~1.8T معاملات. لم تؤكد OpenAI هذه التفاصيل رسمياً لكن التحليلات المستقلة (مثل من SemiAnalysis) تدعم هذه التقديرات.
أحدثت LLaMA ثورة في المجال المفتوح لل LLMs. ركزت Meta على تدريب نماذج أصغر حجماً على بيانات أكثر، محققة أداءً ينافس GPT-3 بحجم أصغر بكثير.
| النموذج | الأحجام | Context | مميزات معمارية | تاريخ الإصدار |
|---|---|---|---|---|
| LLaMA 1 | 7B, 13B, 33B, 65B | 2K | Pre-Norm, SwiGLU, RoPE | فبراير 2023 |
| LLaMA 2 | 7B, 13B, 70B | 4K | تحسين GQA في 70B, تدريب على 2T token | يوليو 2023 |
| LLaMA 3 | 8B, 70B, 405B | 8K → 128K | Grouped-Query Attention, FFN أكبر, تدريب على 15T+ token | أبريل 2024 |
| LLaMA 3.1 | 8B, 70B, 405B | 128K | نفس LLaMA 3 + تحسينات في الجودة, 405B هو أكبر نموذج مفتوح | يوليو 2024 |
Swish-Gated Linear Unit — بديل ReLU يحسن convergence
Rotary Position Embedding — تشفير الموضع النسبي دون إضافة معاملات
Root Mean Square Layer Normalization — أسرع وأخف من LayerNorm العادي
Grouped-Query Attention — يوفر الذاكرة في الاستدلال
| خاصية | ReLU | GELU | SwiGLU |
|---|---|---|---|
| التعبيرية | متوسطة | جيدة | ممتازة |
| سرعة التقارب | بطيئة | جيدة | سريعة |
| عدد المعاملات | أقل | أقل | ضعف (3 W بدلاً من 2) |
| الأداء النهائي | أدنى | جيد | أفضل |
| مستعمل في | BERT, GPT-2 | GPT-3, BART | LLaMA 1/2/3, PaLM, Mistral |
تقنية MoE تسمح للنموذج أن يكون كبيراً جداً في العدد الإجمالي للمعاملات لكنه ينشّط جزءاً صغيراً منها فقط لكل token. هذا يقلل التكلفة الحسابية في الاستدلال بشكل كبير.
| النموذج | المعاملات الإجمالية | المعاملات النشطة | عدد الخبراء | Top-K |
|---|---|---|---|---|
| Mixtral 8x7B | 46.7B | 12.9B | 8 | 2 |
| Mixtral 8x22B | ~141B | ~39B | 8 | 2 |
| DeepSeek V2 | ~236B | ~21B | ~160 (fine-grained) | 6 |
| Qwen1.5-MoE | ~48B | ~14B | 8 | 2 |
| GPT-4 (تقدير) | ~1.8T | ~220B | ~16 | 2 |
التكلفة الحسابية ≈ Top-K × (حجم الخبير الواحد) + التكلفة الإضافية للـ Router والتواصل بين الخبراء. بالنسبة لـ Mixtral 8x7B: 2 خبراء نشطون من 8، كل خبير ~7B معاملات، يعني ~14B معاملات نشطة — أقل من Llama-70B بـ 5 مرات لكن بأداء مشابه أو أفضل.
| المعيار | Decoder-only (GPT) | Encoder-only (BERT) | Encoder-Decoder (T5) |
|---|---|---|---|
| البنية | محولات سببية (causal) | محولات ثنائية الاتجاه | مشفر + مفكك |
| Attention mask | Causal (أحادي) | Bidirectional (ثنائي) | Bidirectional (مشفر) + Causal (مفكك) |
| الاستخدام الأساسي | توليد النصوص (التحدث المستمر) | فهم النصوص (تصنيف، استخراج) | تحويل النص إلى نص (ترجمة، تلخيص) |
| أمثلة مشهورة | GPT-4, LLaMA, Mistral | BERT, RoBERTa, ALBERT | T5, BART, mT5 |
| التدريب المسبق | Next Token Prediction | MLM (Masked LM) + NSP | Span Corruption / Denoising |
| عدد المعاملات (نموذج كبير) | 1.8T (GPT-4) | 340M (BERT-Large) | 11B (T5-XXL) |
| أداء التوليد | ممتاز | غير مناسب | جيد جداً |
| أداء الفهم | جيد (مع Few-shot) | ممتاز (مع Fine-tuning) | ممتاز |
| كفاءة الاستدلال | متوسطة (توليد تتابعي) | سريعة (مرور واحد) | أبطأ (ممران) |
| لماذا ساد Decoder-only؟ | البساطة المعمارية، قابلية التوسع، أداء قوي في التوليد، سهولة التطبيق على مهام متعددة — أصبح المعيار الفعلي لـ LLMs الحديثة | ||
أشهر مجموعات البيانات المفتوحة لتدريب LLMs:
| المجموعة | الحجم التقريبي | المحتوى الرئيسي | المطور | متاحة للجميع؟ |
|---|---|---|---|---|
| Common Crawl | ~50B+ صفحات | ويب خام (جميع اللغات) | Common Crawl Foundation | ✅ نعم |
| C4 (Colossal Clean Crawled Corpus) | ~800 GB | Common Crawl منقى | Google / T5 | ✅ نعم |
| The Pile | ~825 GB | 22 مصدراً متنوعاً (أكاديمي، كود، كتب) | EleutherAI | ✅ نعم |
| RedPajama-V1 | ~1.2T token | إعادة إنتاج LLaMA dataset | Together | ✅ نعم |
| RedPajama-V2 | ~30T token | نسخة موسعة مع تصنيفات جودة | Together | ✅ نعم |
| Dolma | ~3T token | 6 مصادر منقاة | AI2 / OLMo | ✅ نعم |
| FineWeb | ~15T token | Common Crawl منقى بدقة فائقة | Hugging Face | ✅ نعم |
| BooksCorpus | ~6 GB | كتب (خيال، غير خيال) | - | محدود |
| Wikipedia | ~4B token | موسوعي (جميع اللغات) | Wikimedia | ✅ نعم |
| ArXiv | ~30 GB | أوراق علمية | Cornell | ✅ نعم |
| Stack Exchange | ~25 GB | أسئلة وأجوبة تقنية | Stack Exchange | ✅ نعم |
| GitHub (The Stack) | ~3 TB | كود برمجي (500+ لغة) | BigCode | ✅ نعم |
التكرار مشكلة خطيرة — تكرار البيانات 10 مرات يضاعف وقت التدريب بلا فائدة. أبرز التقنيات:
يقسم المستندات إلى "توقيعات" ويقارنها. فعال لمليارات المستندات. يُستخدم في C4 و The Pile.
إزالة التطابق التام (hash كامل). سريع لكن لا يكتشف التشابه الجزئي.
يشبه MinHash لكن بحساسية مختلفة. جيد للنصوص القصيرة.
يستخدم embeddings لاكتشاف التشابه الدلالي. مكلف لكن الأدق.
ليست كل صفحات الويب مفيدة. خطوات الفلترة الأساسية:
الـ tokenizer هو أول ما يتعلمه النموذج — يحول النص الخام إلى أرقام. اختيار الـ tokenizer يؤثر على أداء النموذج وكفاءته.
| الخوارزمية | الوصف | المميزات | العيوب | مستعمل في |
|---|---|---|---|---|
| BPE (Byte-Pair Encoding) | يدمج الأحرف المتكررة تدريجياً | بسيط، فعال للغات المتعددة | قد ينتج ترميزاً غير بديهي | GPT-4, LLaMA, Mistral |
| WordPiece | مشابه لـ BPE لكن يختار الدمج بناءً على الاحتمالية | مستقر، جيد لمهام الفهم | أبطأ في التدريب | BERT |
| Unigram (SentencePiece) | يبدأ بمفردات كبيرة ويحذف الترميزات الأقل احتمالاً | مرن، يعمل مع أي لغة | أبطأ قليلاً في فك الترميز | LLaMA, T5, ALBERT |
| BBPE (Byte-level BPE) | BPE يعمل على مستوى البايت (وليس Unicode الأحرف) | يدعم أي حرف/رمز/إيموجي | يحتاج مفردات أكبر قليلاً | GPT-4 (BBPE), LLaMA 3 |
| حجم المفردات | النموذج | معدل tokens/كلمة (عربي) | معدل tokens/كلمة (إنجليزي) | مزايا | عيوب |
|---|---|---|---|---|---|
| 32,000 | LLaMA 1/2, GPT-2 | ~2.3 | ~1.2 | أصغر حجم embedding، تدريب أسرع | ترميز طويل للغات غير الإنجليزية |
| 50,257 | GPT-3/4, Mistral | ~2.0 | ~1.0 | توازن جيد | مقبول |
| 128,000 | LLaMA 3 | ~1.5 | ~0.8 | ترميز مضغوط جداً للغات المتعددة | مصفوفة embedding كبيرة (128K × dim) |
| 250,000 | Gemini (تقدير) | ~1.3 | ~0.7 | أضغط ترميز ممكن | كبير جداً، يزيد الذاكرة |
توزيع البيانات بين اللغات والمجالات يؤثر بشكل كبير على أداء النموذج. هنا توزيع بعض النماذج المعروفة:
| المصدر | LLaMA 1 | LLaMA 2 | LLaMA 3 | Falcon | OLMo |
|---|---|---|---|---|---|
| ويب (Common Crawl) | 67% | 66.6% | ~75% | 80% | 71% |
| كتب | 4.5% | 4.6% | ~5% | 6% | 8% |
| Wikipedia | 4.5% | 3.5% | ~3% | 4% | 4% |
| أكاديمي | 4.5% | 4.5% | ~4% | 5% | 6% |
| كود (GitHub) | 4.5% | 5.5% | ~10% | 3% | 8% |
| أخبار | - | - | - | - | 3% |
| إجمالي التوكنات | 1.4T | 2T | 15T+ | ~1T | ~2.5T |
متى تستخدم: عندما يتسع النموذج بالكامل في GPU واحدة وتريد تسريع التدريب باستخدام عدة GPUs.
كيف تعمل: كل GPU تحتفظ بنسخة كاملة من النموذج. نقسم batch الكلي على عدد GPUs. بعد كل forward/backward، نجمّع التدرجات (gradients) ونتشاركها عبر all-reduce. كل GPU تحدِّث معاملاتها بشكل متطابق.
| خاصية | DDP (PyTorch) | DDP + Gradient Accumulation | FSDP (Fully Sharded) |
|---|---|---|---|
| ذاكرة لكل GPU | full model | full model | جزء فقط |
| اتصال بين GPUs | متوسط | متوسط | كثيف |
| حجم batch الكلي | N × batch_per_gpu | N × acc_steps × batch_per_gpu | N × batch_per_gpu |
| سهولة الاستخدام | سهل جداً | سهل | متوسط |
| التوسع | حتى ~64 GPUs | حتى ~128 GPUs | حتى الآلاف |
متى تستخدم: عندما لا يتسع النموذج في GPU واحدة. نقسم الطبقات نفسها عبر GPUs.
W = [4×8] (مصفوفة الوزن الأصلية)
GPU 0: W₀ = [4×4] // النصف الأول من الأعمدة
GPU 1: W₁ = [4×4] // النصف الثاني
Y = X · W = [X·W₀, X·W₁] // then all-gather للدمج
الفكرة: نقسم الطبقات (layers) إلى مجموعات، كل مجموعة تُوضع على GPU مختلفة. البيانات تتدفق عبر "خط أنابيب" من GPU إلى أخرى.
| الجدولة | الوصف | كفاءة | ثباتية التدريب |
|---|---|---|---|
| GPipe | يقسم الميكروباتش إلى chunks أصغر. يرسل كل chunk عبر pipeline. يحسب التدرجات في النهاية. | جيدة (مع chunks كافية) | ثابتة |
| 1F1B (One-Forward-One-Backward) | بعد أول forward، يبدأ backward فوراً. يقلل فجوة الذاكرة. | أفضل (يقترب من المثالية) | جيدة جداً |
| Interleaved 1F1B | تقسيم أكثر دقة — كل GPU تدير عدة شرائح. يقلل فجوة الـ bubble. | أفضل بكثير | متوسطة (تعقيد أعلى) |
مشكلة الـ Bubble: في Pipeline Parallelism، بعض GPUs تبقى خاملة في بداية ونهاية كل ميكروباتش — وهذا يقلل الكفاءة. 1F1B يقلل هذه المشكلة بشكل كبير.
تقنية ثورية من Microsoft DeepSpeed توزع حالة المحسن (optimizer states)، التدرجات (gradients)، والمعاملات (parameters) عبر GPUs بدلاً من تكرارها.
| المرحلة | ما يتم توزيعه | توفير الذاكرة | زيادة الاتصال | شرح مبسط |
|---|---|---|---|---|
| ZeRO-1 | Optimizer States | ~4x | طفيفة | يقسم حالات المُحسِّن (momentum, variance) عبر GPUs. مثلاً مع Adam: كل GPU تحتفظ بـ 1/N من حالات المُحسِّن. المعاملات والتدرجات مكررة. |
| ZeRO-2 | Optimizer States + Gradients | ~8x | متوسطة | يضيف توزيع التدرجات. بعد backward، كل GPU تحتفظ بالتدرجات الخاصة بجزءها فقط. الـ all-reduce يُستبدَل بـ reduce-scatter + all-gather. |
| ZeRO-3 | Optimizer States + Gradients + Parameters | ~Nx (خطي) | كبيرة | يوزع المعاملات نفسها. كل GPU تحتفظ بجسء صغير من المعاملات. عند الحاجة، تُجمَّع المعاملات عبر all-gather ديناميكي. هذا يسمح بتدريب نماذج لا تتسع في أي GPU منفردة. |
نموذج 7B = 7 × 10⁹ معاملات
FP16 المعاملات: 7B × 2 bytes = 14 GB
Adam states (momentum + variance): 7B × 2 × 4 bytes = 56 GB
Gradients (FP16): 7B × 2 bytes = 14 GB
الإجمالي لكل GPU: 14 + 56 + 14 = 84 GB
مع ZeRO-3 على 8 GPUs:
84 / 8 = 10.5 GB لكل GPU فقط!
(بالإضافة إلى overhead الاتصال والـ activations)
لتدريب نماذج عملاقة جداً (مثل 175B, 405B, 1.8T)، نستخدم الأنواع الثلاثة معاً:
| التقنية | نطاق التقسيم | حجم الاتصال | أفضل استخدام |
|---|---|---|---|
| Data Parallel (DP) | عبر جميع GPUs | متوسط (gradients) | نماذج صغيرة + مجموعة GPUs كثيرة |
| Tensor Parallel (TP) | داخل الـ Node (NVLink) | كبير جداً | نماذج كبيرة لا تتسع في GPU |
| Pipeline Parallel (PP) | عبر Nodes (RDMA) | صغير (activations فقط) | نماذج عملاقة عبر Nodes متعددة |
| ZeRO-3 | عبر جميع GPUs | كبير (parameters) | بديل عن TP + PP للنماذج المتوسطة |
FSDP هو تطبيق PyTorch الأصلي لمفهوم ZeRO-3. يوزع المعاملات والتدرجات وحالات المُحسِّن عبر جميع GPUs. الفرق الرئيسي أن FSDP متكامل مع PyTorch Distributed مباشرة.
| خاصية | FSDP (PyTorch) | DeepSpeed ZeRO-3 |
|---|---|---|
| التكامل مع PyTorch | أصلي (جزء من PyTorch) | مكتبة خارجية |
| سهولة الاستخدام | أسهل (auto-wrap) | متوسطة (تعديل النموذج) |
| التوافق | أحدث الإصدارات فقط | أوسع (إصدارات أقدم) |
| ميزات إضافية | أساسية | MoE, Flash Attention, Offload, Mixing Precision |
| الأداء | متقارب | متقارب |
| CPU Offload | مدعوم | مدعوم (متقدم) |
إطار عمل NVIDIA المتخصص في تدريب النماذج العملاقة. يستخدم تقنيات خاصة مثل:
| النموذج | الحجم | التوكنات | GPU Hours (H100) | التكلفة المقدرة | المصدر/السنة |
|---|---|---|---|---|---|
| LLaMA 3 8B | 8B | 15T | ~184K | ~$500K | Meta, 2024 |
| LLaMA 3 70B | 70B | 15T | ~1.6M | ~$5M | Meta, 2024 |
| LLaMA 3 405B | 405B | 15T | ~30M | ~$80M | Meta, 2024 |
| Mixtral 8x7B | 47B (13B فعال) | ~4T | ~150K | ~$400K | Mistral, 2023 |
| Falcon 180B | 180B | ~3.5T | ~4.5M | ~$12M | TII, 2024 |
| GPT-3 (175B) | 175B | ~300B | ~3.5M (A100) | ~$4.6M | OpenAI, 2020 |
| GPT-4 (تقدير) | ~1.8T | ~13T | ~80M | ~$78M-100M | OpenAI, 2023 |
| Gemini Ultra | ~1.5T (تقدير) | ~10T | ~150M | ~$191M | Google, 2023 |
| PaLM 540B | 540B | ~780B | ~9.5M (TPUv4) | ~$12M | Google, 2022 |
| العنصر | التكلفة المقدرة | النسبة | ملاحظات |
|---|---|---|---|
| GPU Compute (H100 × 1024 لمدة ~60 يوم) | $3.5M - $4.0M | ~72% | أكبر بند في التكلفة |
| التخزين والبيانات | $150K - $300K | ~6% | تخزين 15T توكن، تنقية البيانات، cache |
| الشبكات (InfiniBand, Ethernet) | $200K - $400K | ~8% | تكلفة ربط 1024 GPU بسرعة عالية |
| الكهرباء والتبريد | $300K - $600K | ~10% | ~10-15 KW لكل GPU مع النظام بأكمله |
| الهندسة والتطوير | $150K - $300K | ~4% | فريق من 5-10 مهندسين لمدة 3-6 أشهر |
| الإجمالي | $4M - $5.6M | 100% | الرقم الفعلي قد يصل $10M مع التجارب الفاشلة |
| المزود | GPU/S | السعر/ساعة (H100) | التوفر | مميزات | أفضل استخدام |
|---|---|---|---|---|---|
| Lambda Labs | H100 80GB | $1.89 | جيد | سهل الاستخدام، دعم فني سريع | تدريب الفرق الصغيرة |
| RunPod | H100 80GB | $1.79 | ممتاز | مرن، SSD سريع، serverless | تدريب متقطع، تجارب |
| CoreWeave | H100 80GB | $2.19 | ممتاز | InfiniBand, كتل كبيرة, Kubernetes | تدريب كتل كبيرة (64+ GPUs) |
| Vast.ai | H100 80GB | $1.49 | متوسط | أرخص الأسعار، سوق مفتوح | الاختبار والتجارب القصيرة |
| GCP (Google Cloud) | H100 80GB | $3.50 | جيد | TPUs أيضاً, GKE, الموثوقية | المؤسسات الكبيرة |
| AWS (p5, p5e) | H100 80GB | $4.10 | جيد | أوسع خدمة سحابية, EFA | الشركات المرتبطة بـ AWS |
| Azure (ND H100) | H100 80GB | $3.80 | جيد | تكامل مع Microsoft, ONNX | المؤسسات الكبيرة |
| TensorDock | H100 80GB | $1.69 | متوسط | أسعار تنافسية, كتل مخصصة | الفرق ذات الميزانية المحدودة |
أرخص 50-70% لكن مع خطر الإنهاء المفاجئ. مناسب للتدريب مع checkpointing متكرر.
يوفر ~40% ذاكرة ويسرع ~60%. FP8 يقدم توفيراً إضافياً على H100.
يقلل ذاكرة activations ~90% مقابل 20% overhead حسابي.
تقدير التكلفة الدقيقة يمنع 60% من هدر الميزانية (حسب التجربة).
مكتبة التحسين الرائدة لتدريب LLMs. توفر ZeRO، MoE، Flash Attention، وغيرها.
| الميزة | الوصف | التأثير |
|---|---|---|
| ZeRO-1/2/3 | توزيع حالة التدريب عبر GPUs | يقلل الذاكرة 2x-16x |
| MoE (DeepSpeed-MoE) | تدريب نماذج Mixture of Experts | يضاعف السعة بزيادة 30% تكلفة |
| Flash Attention | تنفيذ kernel مخصص للانتباه السريع | تسريع 2x-3x، توفير ذاكرة 10x |
| Mixed Precision | FP16/BF16/FP8 تلقائي | يسرع 1.5x-2x |
| CPU Offload | تفريغ المعاملات إلى CPU RAM | يدرب نماذج أكبر على GPUs أقل |
| Autotuning | بحث تلقائي عن أفضل إعدادات التدريب | توفير 10-20% وقت |
| Communication Quantization | ضغط الاتصالات بين GPUs | يسرع الاتصال 2x-4x |
# ds_config.json — تكوين DeepSpeed لنموذج 13B { "bf16": { "enabled": true }, "zero_optimization": { "stage": 3, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "offload_param": { "device": "cpu", "pin_memory": true }, "overlap_comm": true, "reduce_scatter": true, "contiguous_gradients": true }, "gradient_accumulation_steps": 8, "gradient_clipping": 1.0, "train_batch_size": 512, "train_micro_batch_size_per_gpu": 4, "wall_clock_breakdown": false }
متخصص في النماذج فائقة الضخامة. يُستخدم مع DeepSpeed في معظم مشاريع LLM الكبيرة.
أفضل الممارسات حالياً هي استخدام Megatron-LM لـ Tensor Parallelism و Sequence Parallelism، مع DeepSpeed ZeRO لتوزيع حالة المُحسِّن. هذا المزيج يُسمى Megatron-DeepSpeed وهو أساس تدريب LLaMA 3 و BLOOM و العديد من النماذج المفتوحة.
أسهل طريقة للبدء في التدريب الموزع. يغلف تعقيد PyTorch Distributed في بضعة أسطر من الكود.
from accelerate import Accelerator from transformers import AutoModelForCausalLM, AutoTokenizer, get_scheduler from datasets import load_dataset import torch # تهيئة Accelerator accelerator = Accelerator( mixed_precision="bf16", gradient_accumulation_steps=4 ) # تحميل النموذج والبيانات model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf") tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf") optimizer = torch.optim.AdamW(model.parameters(), lr=3e-5) # تجهيز الأجهزة (DDP تلقائي) model, optimizer, dataloader = accelerator.prepare( model, optimizer, dataloader ) # حلقة التدريب model.train() for batch in dataloader: with accelerator.accumulate(model): outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad()
Ray إطار عام للحوسبة الموزعة، و Ray Train (سابقاً Ray SGD) متخصص في تدريب نماذج التعلم العميق. يُستخدم في الشركات الكبيرة لإدارة آلاف GPUs.
أداة تتبع التجارب القياسية في الصناعة. ضرورية لأي مشروع تدريب LLM.
رسوم بيانية لـ loss, accuracy, learning rate حية
قارن عشرات التجارب في لوحة واحدة
رفع الـ checkpoints والـ artifacts
مشاركة النتائج مع الفريق مباشرة
تقنية أساسية لتوفير الذاكرة وتسريع التدريب دون التأثير على جودة النموذج.
| الدقة | حجم كل معامل | توفير الذاكرة | تسريع | استخدامات | ملاحظات |
|---|---|---|---|---|---|
| FP32 | 4 bytes | - | 1x | Master weights (للمحسن) | دقة عالية لكن بطيء |
| FP16 | 2 bytes | ~50% | ~1.5x-2x | Forward/Backward | قد يعاني من underflow (أرقام صغيرة جداً) |
| BF16 | 2 bytes | ~50% | ~1.5x-2x | Forward/Backward | نفس نطاق FP32! — أفضل خيار |
| FP8 | 1 byte | ~75% | ~2x-3x | Forward (H100 فقط) | جديد — يتطلب H100/H200 |
| INT8 | 1 byte | ~75% | ~2x-3x | Inference فقط | ليس للتدريب (يحتاج calibration) |
النموذج يتعلم اللغة والمعرفة من البيانات الخام — يتنبأ بـ next token. والنتيجة: نموذج أساسي (base model) يعرف اللغة لكن لا يتبع التعليمات.
تدريب على أمثلة (تعليمات → إجابة) بشرية أو مخلقة. النتيجة: نموذج يبدأ في اتباع التعليمات.
مواءمة النموذج مع التفضيلات البشرية — يعطي إجابات مفيدة، غير ضارة، وصادقة.
الخطوة الأولى والأهم بعد التدريب المسبق. الهدف: تدريب النموذج على اتباع التعليمات (instruction following).
| مجموعة بيانات SFT | الحجم | الوصف | متاحة؟ |
|---|---|---|---|
| Open Assistant (OASST1) | ~45K محادثة | مجتمعي، متعدد اللغات | ✅ |
| ShareGPT | ~80K محادثة | مقاطع من محادثات ChatGPT الحقيقية | غير رسمي |
| Alpaca (Self-Instruct) | 52K | من text-davinci-003 | ✅ |
| Dolly | 15K | يدوي بشري من Databricks | ✅ |
| UltraChat | 1.5M | محادثات مخلقة ضخمة | ✅ |
| LIMA | 1K | فقط 1000 مثال عالي الجودة — أثبت أن الجودة أهم من الكمية | ✅ |
تقنية OpenAI الرائدة لجعل LLMs مفيدة وآمنة. تتكون من 3 مراحل:
| المعيار | RLHF (PPO) | DPO | ORPO | KTO |
|---|---|---|---|---|
| الحاجة لنموذج مكافأة | ✅ نعم (نموذج منفصل) | ❌ لا | ❌ لا | ❌ لا |
| الحاجة لبيانات تفضيل | مقارنات (chosen/rejected) | مقارنات | مقارنات + إجابة مرغوبة | فقط إجابات جيدة/سيئة (لا حاجة لمقارنات) |
| التعقيد التنفيذي | عالي جداً | متوسط | متوسط | متوسط |
| الثباتية التدريبية | متوسطة (PPO متقلب) | عالية | عالية | عالية |
| الأداء العام | ممتاز (مع الضبط الجيد) | ممتاز | جيد جداً | جيد |
| كلفة التدريب | 3 نماذج في الذاكرة | نموذج واحد | نموذج واحد | نموذج واحد |
| مستعمل في | GPT-4, LLaMA 2, Claude | LLaMA 3, Mistral, Zephyr | نماذج أحدث | تطبيقات محدودة |
بديل بسيط لـ RLHF دون الحاجة إلى نموذج مكافأة منفصل. حوَّل RLHF إلى مشكلة تصنيف مباشرة.
L_DPO = -log( σ( β * (log π(y_c|x) - log π(y_r|x)) ) )لا يمكنك تحسين ما لا تقيسه. هذه هي المعايير القياسية لتقييم LLMs:
| المعيار | المجال | الوصف | عدد الأسئلة | صعوبة |
|---|---|---|---|---|
| MMLU | معرفة عامة | 57 مادة (رياضيات، تاريخ، قانون، طب...) | 14,042 | متوسط-صعب |
| GSM8K | رياضيات | مسائل كلامية من المدرسة الابتدائية | 1,319 | متوسط |
| HumanEval | كود | كتابة دوال Python من docstring | 164 | متوسط |
| HellaSwag | استدلال عام | اختيار النهاية الأكثر منطقية لجملة | 10,042 | متوسط |
| WinoGrande | ضمائر | حل غموض الضمائر في الجمل | 1,267 | متوسط |
| ARC-Challenge | علوم | أسئلة علمية من اختبارات مدرسية | 1,172 | صعب |
| TruthfulQA | الصدق | هل يقدم النموذج معلومات صحيحة؟ | 817 | متوسط |
| BBH (BIG-Bench Hard) | استدلال معقد | 23 مهمة صعبة من BIG-Bench | ~6,500 | صعب جداً |
| MATH | رياضيات متقدمة | مسائل رياضية بمستويات 1-5 | 5,000 | صعب جداً |
| المعيار | LLaMA 3 8B | LLaMA 3 70B | GPT-4 | Claude 3.5 Sonnet |
|---|---|---|---|---|
| MMLU (5-shot) | 66.6% | 83.4% | 86.4% | 88.7% |
| GSM8K (8-shot) | 74.2% | 93.0% | 92.0% | 92.3% |
| HumanEval (0-shot) | 62.2% | 84.2% | 87.8% | 93.7% |
| HellaSwag (10-shot) | 80.7% | 87.5% | 87.0% | 89.5% |
| WinoGrande (5-shot) | 74.5% | 84.8% | 82.3% | 85.3% |
| البند | القيمة | ملاحظات |
|---|---|---|
| المعمارية | LLaMA-style (Decoder-only, RoPE, SwiGLU, RMSNorm, GQA) | نفس LLaMA 2/3 |
| حجم النموذج | 6.7B معاملات | أقل بقليل من 7B لتوفير هامش ذاكرة |
| عدد الطبقات | 32 | مثل LLaMA 2 7B |
| Hidden dimension | 4096 | |
| عدد رؤوس الانتباه | 32 | مع GQA (8 KV heads) |
| حجم البيانات | 1.5T توكن | مزيج من RedPajama + FineWeb + The Stack |
| المصادر | ويب (60%), كود (15%), كتب (10%), Wikipedia (8%), أكاديمي (7%) | توزيع متعمد لتحسين الاستدلال |
| عدد GPUs | 64 × H100 (80GB) | 8 Nodes × 8 GPUs |
| مدة التدريب | ~45 يوماً | بحوالي 340K steps |
| التكلفة التقديرية | ~$240K - $300K | بسعر CoreWeave (~$2.19/h) |
# 1. إعداد العقد (Nodes) — 8 عقد × 8 GPU H100 # عبر CoreWeave Kubernetes أو Slurm # 2. تثبيت الحزم المطلوبة pip install torch==2.4.0 --index-url https://download.pytorch.org/whl/cu124 pip install deepspeed==0.14.0 transformers datasets wandb pip install flash-attn --no-build-isolation pip install mpi4py ninja # 3. إعداد تخزين موزع (مثلاً: GPFS, Lustre, أو S3 مع caching محلي) # البيانات: /mnt/data/pretrain/ (حجم ~4 TB) # Checkpoints: /mnt/checkpoints/ (حجم ~500 GB)
# 4. تحميل وتنظيف البيانات باستخدام datatrove (أداة مفتوحة المصدر) pip install datatrove # مثال: تشغيل pipeline تنظيف على 100 عقدة python -m datatrove \ --data_input s3://my-bucket/common-crawl/ \ --data_output /mnt/data/pretrain/cleaned/ \ --execution slurm \ --slurm_nodes 100 \ --steps \ language_filter(language=ar,en) \ quality_filter(min_words=50, max_words=20000) \ minhash_dedup(ngram_size=5, threshold=0.8) \ pii_removal() # 5. تدريب Tokenizer (BPE, vocab_size=64000) python train_tokenizer.py \ --data /mnt/data/pretrain/cleaned/ \ --vocab_size 64000 \ --output /mnt/models/tokenizer.json # يستخدم huggingface tokenizers في training على عينة 2% من البيانات # 6. ترميز البيانات مسبقاً (pre-tokenize) python pre_tokenize.py \ --data /mnt/data/pretrain/cleaned/ \ --tokenizer /mnt/models/tokenizer.json \ --output /mnt/data/pretrain/tokenized/ \ --num_workers 512
import torch.nn as nn from transformers import PreTrainedModel, PretrainedConfig import math class LLaMAConfig(PretrainedConfig): model_type = "llama" def __init__(self, vocab_size=64000, hidden_size=4096, intermediate_size=11008, num_hidden_layers=32, num_attention_heads=32, num_key_value_heads=8, max_position_embeddings=8192, rms_norm_eps=1e-5, rope_theta=500000, **kwargs): super().__init__(**kwargs) # ... تعيين كل الخاصيات class LLaMAModel(PreTrainedModel): config_class = LLaMAConfig def __init__(self, config): super().__init__(config) self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size) self.layers = nn.ModuleList([ TransformerLayer(config) for _ in range(config.num_hidden_layers) ]) self.norm = RMSNorm(config.hidden_size, eps=config.rms_norm_eps) self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
# ملف التشغيل الرئيسي — ds_pretrain.py import torch import deepspeed from config import LLaMAConfig, LLaMAModel from data import create_dataloader # إعداد التكوين config = LLaMAConfig() model = LLaMAModel(config) model = model.bfloat16() # DeepSpeed ZeRO-3 + AdamW ds_config = { "bf16": {"enabled": true}, "zero_optimization": {"stage": 3, "overlap_comm": true}, "train_micro_batch_size_per_gpu": 4, "gradient_accumulation_steps": 8, # batch إجمالي = 4 × 8 × 64 = 2048 "optimizer": {"type": "AdamW", "params": {"lr": 3e-4, "betas": [0.9, 0.95]}}, "scheduler": {"type": "WarmupCosine", "params": {"warmup_num_steps": 2000}}, "gradient_clipping": 1.0, "wandb": {"enabled": true, "project": "llama-7b-pretrain"} } # تهيئة DeepSpeed model_engine, optimizer, _, _ = deepspeed.initialize( model=model, model_parameters=model.parameters(), config=ds_config ) # حلقة التدريب dataloader = create_dataloader(tokenized_data_path, model_engine.local_rank) model_engine.train() train_iterator = iter(dataloader) for step in range(total_steps): batch = next(train_iterator) outputs = model_engine(**batch) loss = outputs.loss model_engine.backward(loss) model_engine.step() if step % 500 == 0: if model_engine.global_rank == 0: print(f"Step {step}, Loss: {loss.item():.4f}") wandb.log({"loss": loss.item()}, step=step) if step % 5000 == 0: model_engine.save_checkpoint("/mnt/checkpoints/", tag=f"step_{step}")
deepspeed \ --num_gpus 8 \ --num_nodes 8 \ --master_addr $MASTER_ADDR \ --master_port $MASTER_PORT \ --hostfile hostfile.txt \ ds_pretrain.py
# تدريب SFT على UltraChat + OpenAssistant accelerate launch \ --num_processes 64 \ --use_deepspeed \ --deepspeed_config_file ds_config_sft.json \ train_sft.py \ --model_path=/mnt/checkpoints/step_340000 \ --data_path=openassistant/ultrachat_200k \ --output_dir=/mnt/models/sft/ \ --learning_rate=2e-5 \ --num_train_epochs=2 \ --per_device_train_batch_size=2 \ --gradient_accumulation_steps=16 # تدريب DPO على بيانات تفضيل (Anthropic HH / UltraFeedback) accelerate launch \ --num_processes 64 \ --use_deepspeed \ --deepspeed_config_file ds_config_dpo.json \ train_dpo.py \ --model_path=/mnt/models/sft/ \ --data_path=argilla/ultrafeedback-binarized-preferences \ --output_dir=/mnt/models/dpo/ \ --beta=0.1 \ --learning_rate=1e-6 \ --num_train_epochs=1
# تقييم باستخدام LM Evaluation Harness pip install eval-harness lm_eval --model hf \ --model_args pretrained=/mnt/models/dpo/,dtype=bfloat16 \ --tasks mmlu,gsm8k,hellaswag,winogrande,human_eval \ --batch_size 4 \ --output_path /mnt/eval/results.json # تقييم إضافي: TruthfulQA, BBH, MATH lm_eval --model hf \ --model_args pretrained=/mnt/models/dpo/,dtype=bfloat16 \ --tasks truthfulqa,bbh,match \ --num_fewshot 5 \ --output_path /mnt/eval/results_extended.json
| المرحلة | المدة | فريق | توصيف |
|---|---|---|---|
| إعداد البنية التحتية | أسبوع 1 | مهندس DevOps (2) | إعداد الكتلة، التخزين، الشبكات، تثبيت الحزم |
| جمع وتنظيف البيانات | أسابيع 1-3 | مهندس بيانات (2) | تطبيق pipeline التنظيف على تيرابايتات البيانات |
| إعداد النموذج والتجارب الأولية | أسابيع 2-3 | مهندس تدريب (3) | كتابة الكود، اختبار على نطاق صغير (طريقة 6 ساعات) |
| اختبار pipeline التدريب الكامل | أسابيع 3-4 | فريق كامل (5+) | تدريب اختباري على 64 GPU لمدة 2 يوم، ضبط ZeRO |
| التدريب الرئيسي | أسابيع 4-11 (45 يوم) | مهندس مراقبة (1) | مراقبة 24/7، إدارة الأعطال، حفظ checkpoints |
| SFT + DPO | أسابيع 11-12 | مهندس تدريب (2) | تدريب المواءمة على بيانات SFT و DPO |
| التقييم والتحسين | أسابيع 12-13 | مهندس تقييم (2) | تقييم شامل، تحليل الأخطاء، تحسينات |
| التوثيق والإصدار | أسبوع 14 | فريق كامل | كتابة الورقة، إصدار النموذج، نموذج البطاقة (model card) |
| MMLU (5-shot) | ~60-65% | أقل من LLaMA 3 8B (66.6%) لكن تنافسي جداً |
| GSM8K (8-shot) | ~55-65% | بسبب رفع نسبة الكود في البيانات |
| HumanEval (0-shot) | ~40-50% | الكود المضمن في التدريب يساعد |
| HellaSwag (10-shot) | ~75-80% | المنطق العامي الجيد |