📖 المجلد الثالث

🏗️ تدريب النماذج اللغوية (LLMs) من الصفر

من بنية GPT و LLaMA إلى التدريب الموزع وتحليل التكاليف و RLHF — دليل شامل ومتكامل

📐 7 فصول 📊 25+ جدول مقارنة 💻 أمثلة تطبيقية وأكواد 💰 تحليل تكاليف واقعي
1

هندسة LLMs المعاصرة

🎯 نظرة عامة: قبل أن نبدأ في تدريب نموذج لغوي كبير، يجب أن نفهم بنيته المعمارية. هذا القسم يشرح بالتفصيل بنية GPT، LLaMA، MoE، والمقارنة بين Encoder-only و Decoder-only.

1.1 عائلة GPT — من GPT-2 إلى GPT-4

تمثل سلسلة GPT (Generative Pre-trained Transformer) العمود الفقري لثورة LLMs. طوّرتها OpenAI وكل إصدارة حقق قفزة نوعية في القدرات.

النموذج المعاملات عدد الطبقات hidden dim عدد الرؤوس حجم البيانات سنة الإصدار
GPT-1117M1276812~4 GB2018
GPT-2 Small124M1276812~40 GB2019
GPT-2 Medium355M24102416~40 GB2019
GPT-2 Large774M36128020~40 GB2019
GPT-2 XL1.5B48160025~40 GB2019
GPT-3175B961228896~570 GB2020
GPT-4 (تقدير)~1.8T~120+~16384~128~10+ TB2023
🔑 ملاحظات مهمة عن GPT-4

GPT-4 يقدر بأنه يستخدم Mixture of Experts (MoE) مع 8 خبراء، كل منهم بحجم ~220B معاملات، مما يعطيه حجماً فعالاً (~220B معاملات نشطة لكل forward pass) مع حجم إجمالي ~1.8T معاملات. لم تؤكد OpenAI هذه التفاصيل رسمياً لكن التحليلات المستقلة (مثل من SemiAnalysis) تدعم هذه التقديرات.

1.2 عائلة LLaMA — Meta AI

أحدثت LLaMA ثورة في المجال المفتوح لل LLMs. ركزت Meta على تدريب نماذج أصغر حجماً على بيانات أكثر، محققة أداءً ينافس GPT-3 بحجم أصغر بكثير.

النموذج الأحجام Context مميزات معمارية تاريخ الإصدار
LLaMA 17B, 13B, 33B, 65B2KPre-Norm, SwiGLU, RoPEفبراير 2023
LLaMA 27B, 13B, 70B4Kتحسين GQA في 70B, تدريب على 2T tokenيوليو 2023
LLaMA 38B, 70B, 405B8K → 128KGrouped-Query Attention, FFN أكبر, تدريب على 15T+ tokenأبريل 2024
LLaMA 3.18B, 70B, 405B128Kنفس LLaMA 3 + تحسينات في الجودة, 405B هو أكبر نموذج مفتوحيوليو 2024

تحسينات LLaMA المعمارية الأساسية

SwiGLU

Swish-Gated Linear Unit — بديل ReLU يحسن convergence

🔄

RoPE

Rotary Position Embedding — تشفير الموضع النسبي دون إضافة معاملات

📏

RMSNorm

Root Mean Square Layer Normalization — أسرع وأخف من LayerNorm العادي

👁️

GQA

Grouped-Query Attention — يوفر الذاكرة في الاستدلال

مقارنة SwiGLU vs ReLU vs GELU

خاصيةReLUGELUSwiGLU
التعبيريةمتوسطةجيدةممتازة
سرعة التقارببطيئةجيدةسريعة
عدد المعاملاتأقلأقلضعف (3 W بدلاً من 2)
الأداء النهائيأدنىجيدأفضل
مستعمل فيBERT, GPT-2GPT-3, BARTLLaMA 1/2/3, PaLM, Mistral

1.3 Mixture of Experts (MoE)

تقنية MoE تسمح للنموذج أن يكون كبيراً جداً في العدد الإجمالي للمعاملات لكنه ينشّط جزءاً صغيراً منها فقط لكل token. هذا يقلل التكلفة الحسابية في الاستدلال بشكل كبير.

🧠 كيف تعمل MoE؟
بدلاً من FFN واحدة في كل طبقة، لدينا N من "الخبراء" (experts). Router (شبكة صغيرة) تقرر أي خبير أو خبيرين ينشّطهم كل token. النتيجة: معاملات إجمالية ضخمة (مثلاً 1.8T) لكن معاملات فعالة صغيرة (مثلاً 220B).
النموذج المعاملات الإجمالية المعاملات النشطة عدد الخبراء Top-K
Mixtral 8x7B46.7B12.9B82
Mixtral 8x22B~141B~39B82
DeepSeek V2~236B~21B~160 (fine-grained)6
Qwen1.5-MoE~48B~14B82
GPT-4 (تقدير)~1.8T~220B~162
⚙️ معادلة التكلفة في MoE

التكلفة الحسابية ≈ Top-K × (حجم الخبير الواحد) + التكلفة الإضافية للـ Router والتواصل بين الخبراء. بالنسبة لـ Mixtral 8x7B: 2 خبراء نشطون من 8، كل خبير ~7B معاملات، يعني ~14B معاملات نشطة — أقل من Llama-70B بـ 5 مرات لكن بأداء مشابه أو أفضل.

1.4 مقارنة: Encoder-only vs Decoder-only vs Encoder-Decoder

المعيار Decoder-only (GPT) Encoder-only (BERT) Encoder-Decoder (T5)
البنيةمحولات سببية (causal)محولات ثنائية الاتجاهمشفر + مفكك
Attention maskCausal (أحادي)Bidirectional (ثنائي)Bidirectional (مشفر) + Causal (مفكك)
الاستخدام الأساسيتوليد النصوص (التحدث المستمر)فهم النصوص (تصنيف، استخراج)تحويل النص إلى نص (ترجمة، تلخيص)
أمثلة مشهورةGPT-4, LLaMA, MistralBERT, RoBERTa, ALBERTT5, BART, mT5
التدريب المسبقNext Token PredictionMLM (Masked LM) + NSPSpan Corruption / Denoising
عدد المعاملات (نموذج كبير)1.8T (GPT-4)340M (BERT-Large)11B (T5-XXL)
أداء التوليدممتازغير مناسبجيد جداً
أداء الفهمجيد (مع Few-shot)ممتاز (مع Fine-tuning)ممتاز
كفاءة الاستدلالمتوسطة (توليد تتابعي)سريعة (مرور واحد)أبطأ (ممران)
لماذا ساد Decoder-only؟البساطة المعمارية، قابلية التوسع، أداء قوي في التوليد، سهولة التطبيق على مهام متعددة — أصبح المعيار الفعلي لـ LLMs الحديثة
📌 الخلاصة: النماذج الحديثة جميعها تقريباً (GPT-4, LLaMA 3, Mistral, DeepSeek, Qwen, Gemini) تستخدم بنية Decoder-only مع تحسينات مثل RoPE, SwiGLU, GQA, و MoE للنماذج العملاقة. Encoder-only أصبح مقتصراً على المهام المضمنة (embedding) وفهم النصوص فائقة السرعة.
2

جمع وإعداد البيانات على نطاق واسع

📦 البيانات هي الوقود: نجاح أي LLM يعتمد بشكل حاسم على جودة وكمية بيانات التدريب. LLaMA 3 دُرّب على أكثر من 15 تريليون توكن — وهذا يتطلب هندسة data pipeline متطورة.

2.1 مصادر البيانات

أشهر مجموعات البيانات المفتوحة لتدريب LLMs:

المجموعة الحجم التقريبي المحتوى الرئيسي المطور متاحة للجميع؟
Common Crawl~50B+ صفحاتويب خام (جميع اللغات)Common Crawl Foundation✅ نعم
C4 (Colossal Clean Crawled Corpus)~800 GBCommon Crawl منقىGoogle / T5✅ نعم
The Pile~825 GB22 مصدراً متنوعاً (أكاديمي، كود، كتب)EleutherAI✅ نعم
RedPajama-V1~1.2T tokenإعادة إنتاج LLaMA datasetTogether✅ نعم
RedPajama-V2~30T tokenنسخة موسعة مع تصنيفات جودةTogether✅ نعم
Dolma~3T token6 مصادر منقاةAI2 / OLMo✅ نعم
FineWeb~15T tokenCommon 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✅ نعم

2.2 تنظيف البيانات (Data Cleaning)

إزالة التكرار (Deduplication)

التكرار مشكلة خطيرة — تكرار البيانات 10 مرات يضاعف وقت التدريب بلا فائدة. أبرز التقنيات:

🔗

MinHash (LSH)

يقسم المستندات إلى "توقيعات" ويقارنها. فعال لمليارات المستندات. يُستخدم في C4 و The Pile.

🔤

Exact Dedup

إزالة التطابق التام (hash كامل). سريع لكن لا يكتشف التشابه الجزئي.

🧬

SimHash

يشبه MinHash لكن بحساسية مختلفة. جيد للنصوص القصيرة.

🧠

Semantic Dedup

يستخدم embeddings لاكتشاف التشابه الدلالي. مكلف لكن الأدق.

فلترة الجودة (Quality Filtering)

ليست كل صفحات الويب مفيدة. خطوات الفلترة الأساسية:

🧪 إحصاءات التنظيف لـ FineWeb (Hugging Face)
  • البيانات الخام: 52.8 تريليون حرف من Common Crawl (2013-2024)
  • بعد إزالة التكرار والفلترة: 15.2 تريليون حرف (فقدان ~71%)
  • MinHash dedup أزال ~30% من البيانات المكررة
  • فلترة الجودة (C4-based): أزالت ~40% إضافية
  • النتيجة: أفضل أداء من C4 الأصلي على MMLU و HellaSwag

2.3 الترميز (Tokenization)

الـ tokenizer هو أول ما يتعلمه النموذج — يحول النص الخام إلى أرقام. اختيار الـ tokenizer يؤثر على أداء النموذج وكفاءته.

أنواع Tokenizers

الخوارزمية الوصف المميزات العيوب مستعمل في
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,000LLaMA 1/2, GPT-2~2.3~1.2أصغر حجم embedding، تدريب أسرعترميز طويل للغات غير الإنجليزية
50,257GPT-3/4, Mistral~2.0~1.0توازن جيدمقبول
128,000LLaMA 3~1.5~0.8ترميز مضغوط جداً للغات المتعددةمصفوفة embedding كبيرة (128K × dim)
250,000Gemini (تقدير)~1.3~0.7أضغط ترميز ممكنكبير جداً، يزيد الذاكرة
💡 نصيحة: إذا كنت تدرب نموذجاً يدعم العربية، استخدم مفردات بحجم 64K-128K ودرّب الـ tokenizer على بيانات عربية كثيفة. LLaMA 3 بتحسن أداءه على العربية بسبب مفرداته الأكبر (128K) وتدريب tokenizer على بيانات متعددة اللغات.

2.4 توزيع البيانات — ما هي البيانات المثالية؟

توزيع البيانات بين اللغات والمجالات يؤثر بشكل كبير على أداء النموذج. هنا توزيع بعض النماذج المعروفة:

المصدر LLaMA 1 LLaMA 2 LLaMA 3 Falcon OLMo
ويب (Common Crawl)67%66.6%~75%80%71%
كتب4.5%4.6%~5%6%8%
Wikipedia4.5%3.5%~3%4%4%
أكاديمي4.5%4.5%~4%5%6%
كود (GitHub)4.5%5.5%~10%3%8%
أخبار----3%
إجمالي التوكنات1.4T2T15T+~1T~2.5T
⚖️ مبادئ التوزيع المثالي
  1. التنوع: لا تعتمد على مصدر واحد — امزج ويب، كتب، كود، أكاديمي
  2. الترجيح حسب الجودة: امنح وزناً أعلى للبيانات عالية الجودة (الكتب، Wikipedia) وأقل للويب الخام
  3. التوازن اللغوي: الإنجليزي قد يشكل 80-90% من البيانات، لكن رفع نسبة اللغات الأخرى يحسن الأداء عبر اللغات
  4. Upsampling للكود: زيادة نسبة الكود (5-10%) تحسن الاستدلال المنطقي بشكل كبير (مثل LLaMA 3)
  5. إزالة السمية: تصفية المحتوى الضار دون المساس بالتنوع المعرفي
15T+
توكن تدريب LLaMA 3
52.8T
حجم Common Crawl الخام
71%
نسبة البيانات المحذوفة في التنظيف
128K
حجم مفردات LLaMA 3 tokenizer
3

التدريب الموزع (Distributed Training)

🖥️ لماذا التدريب الموزع؟ نموذج LLaMA 70B يحتاج ~140 GB من ذاكرة GPU للمعاملات وحدها — هذا لا يتسع في أي GPU واحد (H100 بها 80 GB). الحل: توزيع النموذج والبيانات عبر عدة GPUs.

3.1 Data Parallelism (DDP)

متى تستخدم: عندما يتسع النموذج بالكامل في GPU واحدة وتريد تسريع التدريب باستخدام عدة GPUs.

📦Batch 1GPU 1
📦Batch 2GPU 2
📦Batch 3GPU 3
📦Batch 4GPU 4

كيف تعمل: كل GPU تحتفظ بنسخة كاملة من النموذج. نقسم batch الكلي على عدد GPUs. بعد كل forward/backward، نجمّع التدرجات (gradients) ونتشاركها عبر all-reduce. كل GPU تحدِّث معاملاتها بشكل متطابق.

خاصيةDDP (PyTorch)DDP + Gradient AccumulationFSDP (Fully Sharded)
ذاكرة لكل GPUfull modelfull modelجزء فقط
اتصال بين GPUsمتوسطمتوسطكثيف
حجم batch الكليN × batch_per_gpuN × acc_steps × batch_per_gpuN × batch_per_gpu
سهولة الاستخدامسهل جداًسهلمتوسط
التوسعحتى ~64 GPUsحتى ~128 GPUsحتى الآلاف

3.2 Tensor / Model Parallelism

متى تستخدم: عندما لا يتسع النموذج في GPU واحدة. نقسم الطبقات نفسها عبر GPUs.

🧩 التقسيم: كل طبقة (مثل الـ Attention أو FFN) تُقسَّم عبر GPUs. مثلاً، مصفوفات الأوزان تُقطَّع عمودياً وأفقياً. كل GPU تحسب جزءاً من الناتج ثم تتواصل مع الأخرى لدمج النتائج.
📐 مثال: تقسيم الطبقة الخطية (Linear Layer) عبر 2 GPUs

W = [4×8] (مصفوفة الوزن الأصلية)
GPU 0: W₀ = [4×4] // النصف الأول من الأعمدة
GPU 1: W₁ = [4×4] // النصف الثاني
Y = X · W = [X·W₀, X·W₁] // then all-gather للدمج

3.3 Pipeline Parallelism

الفكرة: نقسم الطبقات (layers) إلى مجموعات، كل مجموعة تُوضع على GPU مختلفة. البيانات تتدفق عبر "خط أنابيب" من GPU إلى أخرى.

الجدولةالوصفكفاءةثباتية التدريب
GPipeيقسم الميكروباتش إلى chunks أصغر. يرسل كل chunk عبر pipeline. يحسب التدرجات في النهاية.جيدة (مع chunks كافية)ثابتة
1F1B (One-Forward-One-Backward)بعد أول forward، يبدأ backward فوراً. يقلل فجوة الذاكرة.أفضل (يقترب من المثالية)جيدة جداً
Interleaved 1F1Bتقسيم أكثر دقة — كل GPU تدير عدة شرائح. يقلل فجوة الـ bubble.أفضل بكثيرمتوسطة (تعقيد أعلى)

مشكلة الـ Bubble: في Pipeline Parallelism، بعض GPUs تبقى خاملة في بداية ونهاية كل ميكروباتش — وهذا يقلل الكفاءة. 1F1B يقلل هذه المشكلة بشكل كبير.

3.4 ZeRO Optimization (DeepSpeed)

تقنية ثورية من 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 منفردة.
🧮 حساب توفير الذاكرة في ZeRO (نموذج 7B مع Adam)

نموذج 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)

3.5 3D Parallelism — الجمع بين الثلاثة

لتدريب نماذج عملاقة جداً (مثل 175B, 405B, 1.8T)، نستخدم الأنواع الثلاثة معاً:

📊Data Parallelتقسيم البيانات عبر مجموعات GPUs
🧩Tensor Parallelتقسيم كل طبقة عبر GPUs داخل Node
🔗Pipeline Parallelتقسيم الطبقات عبر Nodes
ZeROتوزيع حالة المحسن عبر جميع GPUs
التقنية نطاق التقسيم حجم الاتصال أفضل استخدام
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 للنماذج المتوسطة
🏆 استراتيجية NVIDIA Megatron المثلى (للنماذج الكبيرة جداً):
داخل الـ Node (8 GPUs عبر NVLink): استخدم Tensor Parallel = 8.
عبر Nodes (عبر InfiniBand/RDMA): استخدم Pipeline Parallel و Data Parallel.
وزِّع حالات المُحسِّن عبر Data Parallel groups باستخدام ZeRO-1.
هذا المزيج يُطلق عليه Megatron-LM + DeepSpeed (3D Parallelism).

3.6 Fully Sharded Data Parallelism (FSDP)

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مدعوممدعوم (متقدم)

3.7 Megatron-LM من NVIDIA

إطار عمل NVIDIA المتخصص في تدريب النماذج العملاقة. يستخدم تقنيات خاصة مثل:

10,000+
GPU لتدريب GPT-4
80 GB
ذاكرة H100 GPU
900 GB/s
NVLink bandwidth (H100)
3,200 Gbps
InfiniBand NDR 400
4

تحليل التكاليف بالكامل 💰

⚠️ واقع التكاليف: تدريب LLM ليس رخيصاً. حتى النموذج المتوسط (7B) يكلف عشرات الآلاف من الدولارات. فهم التكاليف ضروري قبل البدء.

4.1 جدول تكاليف تدريب النماذج المختلفة

النموذج الحجم التوكنات GPU Hours (H100) التكلفة المقدرة المصدر/السنة
LLaMA 3 8B8B15T~184K~$500KMeta, 2024
LLaMA 3 70B70B15T~1.6M~$5MMeta, 2024
LLaMA 3 405B405B15T~30M~$80MMeta, 2024
Mixtral 8x7B47B (13B فعال)~4T~150K~$400KMistral, 2023
Falcon 180B180B~3.5T~4.5M~$12MTII, 2024
GPT-3 (175B)175B~300B~3.5M (A100)~$4.6MOpenAI, 2020
GPT-4 (تقدير)~1.8T~13T~80M~$78M-100MOpenAI, 2023
Gemini Ultra~1.5T (تقدير)~10T~150M~$191MGoogle, 2023
PaLM 540B540B~780B~9.5M (TPUv4)~$12MGoogle, 2022
💵 ملاحظة: الأسعار تعتمد على $2.5-3.5 لكل GPU H100 ساعة (سعر السوق لاستئجار الكتلة). التكاليف الفعلية تختلف حسب الكفاءة، نوع GPU، التسعير التجاري، وتكلفة الكهرباء والتبريد. تقديرات GPT-4 و Gemini Ultra من تحليل SemiAnalysis.

4.2 تفصيل التكاليف (لنموذج 70B)

العنصرالتكلفة المقدرةالنسبةملاحظات
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.6M100%الرقم الفعلي قد يصل $10M مع التجارب الفاشلة

4.3 استئجار GPU — مقارنة المزودين

المزود GPU/S السعر/ساعة (H100) التوفر مميزات أفضل استخدام
Lambda LabsH100 80GB$1.89جيدسهل الاستخدام، دعم فني سريعتدريب الفرق الصغيرة
RunPodH100 80GB$1.79ممتازمرن، SSD سريع، serverlessتدريب متقطع، تجارب
CoreWeaveH100 80GB$2.19ممتازInfiniBand, كتل كبيرة, Kubernetesتدريب كتل كبيرة (64+ GPUs)
Vast.aiH100 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المؤسسات الكبيرة
TensorDockH100 80GB$1.69متوسطأسعار تنافسية, كتل مخصصةالفرق ذات الميزانية المحدودة
📈 مقارنة تكلفة تدريب نموذج 7B على 64 H100 لمدة 10 أيام
$28,736
Vast.io (64 × 1.49 × 240h)
$34,368
RunPod (64 × 1.79 × 240h)
$42,048
CoreWeave (64 × 2.19 × 240h)
$78,720
AWS (64 × 4.10 × 240h)

4.4 نصائح لخفض التكاليف

🔍

استخدم Spot Instances

أرخص 50-70% لكن مع خطر الإنهاء المفاجئ. مناسب للتدريب مع checkpointing متكرر.

Mixed Precision (BF16)

يوفر ~40% ذاكرة ويسرع ~60%. FP8 يقدم توفيراً إضافياً على H100.

♻️

Gradient Checkpointing

يقلل ذاكرة activations ~90% مقابل 20% overhead حسابي.

📋

خطط مسبقاً

تقدير التكلفة الدقيقة يمنع 60% من هدر الميزانية (حسب التجربة).

5

أدوات وتقنيات التدريب 🛠️

🔧 مجموعة الأدوات: تدريب LLM يحتاج أكثر من مجرد PyTorch. إليك الأدوات الأساسية التي ستستخدمها في كل مشروع تدريب.

5.1 DeepSpeed — Microsoft

مكتبة التحسين الرائدة لتدريب 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 PrecisionFP16/BF16/FP8 تلقائييسرع 1.5x-2x
CPU Offloadتفريغ المعاملات إلى CPU RAMيدرب نماذج أكبر على GPUs أقل
Autotuningبحث تلقائي عن أفضل إعدادات التدريبتوفير 10-20% وقت
Communication Quantizationضغط الاتصالات بين GPUsيسرع الاتصال 2x-4x

مثال تكوين DeepSpeed ZeRO-3

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

5.2 Megatron-LM — NVIDIA

متخصص في النماذج فائقة الضخامة. يُستخدم مع DeepSpeed في معظم مشاريع LLM الكبيرة.

🔗 الجمع بين Megatron + DeepSpeed

أفضل الممارسات حالياً هي استخدام Megatron-LM لـ Tensor Parallelism و Sequence Parallelism، مع DeepSpeed ZeRO لتوزيع حالة المُحسِّن. هذا المزيج يُسمى Megatron-DeepSpeed وهو أساس تدريب LLaMA 3 و BLOOM و العديد من النماذج المفتوحة.

5.3 Hugging Face Accelerate

أسهل طريقة للبدء في التدريب الموزع. يغلف تعقيد 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()

5.4 Ray للتدريب الموزع

Ray إطار عام للحوسبة الموزعة، و Ray Train (سابقاً Ray SGD) متخصص في تدريب نماذج التعلم العميق. يُستخدم في الشركات الكبيرة لإدارة آلاف GPUs.

5.5 Weights & Biases (W&B)

أداة تتبع التجارب القياسية في الصناعة. ضرورية لأي مشروع تدريب LLM.

📊

تتبع التكرارات

رسوم بيانية لـ loss, accuracy, learning rate حية

📁

مقارنة التجارب

قارن عشرات التجارب في لوحة واحدة

💾

تسجيل النماذج

رفع الـ checkpoints والـ artifacts

🤝

التعاون

مشاركة النتائج مع الفريق مباشرة

5.6 Mixed Precision Training

تقنية أساسية لتوفير الذاكرة وتسريع التدريب دون التأثير على جودة النموذج.

الدقة حجم كل معامل توفير الذاكرة تسريع استخدامات ملاحظات
FP324 bytes-1xMaster weights (للمحسن)دقة عالية لكن بطيء
FP162 bytes~50%~1.5x-2xForward/Backwardقد يعاني من underflow (أرقام صغيرة جداً)
BF162 bytes~50%~1.5x-2xForward/Backwardنفس نطاق FP32! — أفضل خيار
FP81 byte~75%~2x-3xForward (H100 فقط)جديد — يتطلب H100/H200
INT81 byte~75%~2x-3xInference فقطليس للتدريب (يحتاج calibration)
🏆 الخلاصة العملية: استخدم BF16 إذا كان GPU يدعمه (Ampere+: A100, H100, RTX 3090+). BF16 له نفس نطاق FP32 (لا underflow) لكن بحجم FP16. FP8 هو المستقبل على H100 لكن لا يزال بحاجة إلى حذر في الاستخدام.
6

مرحلة ما بعد التدريب (Post-Training)

🧪 التدريب المسبق (Pre-training) يمنح النموذج المعرفة العامة. ما بعد التدريب يجعله مفيداً وآمناً: بعد أن يستهلك النموذج تريليونات التوكنات، نحتاج إلى توجيهه للتفاعل بشكل مفيد وأخلاقي.

1. التدريب المسبق (Pre-training)

النموذج يتعلم اللغة والمعرفة من البيانات الخام — يتنبأ بـ next token. والنتيجة: نموذج أساسي (base model) يعرف اللغة لكن لا يتبع التعليمات.

2. SFT (Supervised Fine-Tuning)

تدريب على أمثلة (تعليمات → إجابة) بشرية أو مخلقة. النتيجة: نموذج يبدأ في اتباع التعليمات.

3. RLHF / DPO

مواءمة النموذج مع التفضيلات البشرية — يعطي إجابات مفيدة، غير ضارة، وصادقة.

6.1 Supervised Fine-Tuning (SFT)

الخطوة الأولى والأهم بعد التدريب المسبق. الهدف: تدريب النموذج على اتباع التعليمات (instruction following).

مجموعة بيانات SFTالحجمالوصفمتاحة؟
Open Assistant (OASST1)~45K محادثةمجتمعي، متعدد اللغات
ShareGPT~80K محادثةمقاطع من محادثات ChatGPT الحقيقيةغير رسمي
Alpaca (Self-Instruct)52Kمن text-davinci-003
Dolly15Kيدوي بشري من Databricks
UltraChat1.5Mمحادثات مخلقة ضخمة
LIMA1Kفقط 1000 مثال عالي الجودة — أثبت أن الجودة أهم من الكمية

نصائح SFT عملية

6.2 Reinforcement Learning from Human Feedback (RLHF)

تقنية OpenAI الرائدة لجعل LLMs مفيدة وآمنة. تتكون من 3 مراحل:

🔁 مراحل RLHF
  1. SFT: تدريب خاضع للإشراف على أمثلة عالية الجودة (كما في 6.1)
  2. Reward Modeling (RM): تدريب نموذج مكافأة يتنبأ بأي إجابة يفضلها الإنسان
  3. RL Fine-tuning (PPO): تحسين النموذج لتعظيم المكافأة من نموذج RM مع تنظيم KL divergence لمنع الانهيار

مقارنة طرق المواءمة (Alignment)

المعيار RLHF (PPO) DPO ORPO KTO
الحاجة لنموذج مكافأة✅ نعم (نموذج منفصل)❌ لا❌ لا❌ لا
الحاجة لبيانات تفضيلمقارنات (chosen/rejected)مقارناتمقارنات + إجابة مرغوبةفقط إجابات جيدة/سيئة (لا حاجة لمقارنات)
التعقيد التنفيذيعالي جداًمتوسطمتوسطمتوسط
الثباتية التدريبيةمتوسطة (PPO متقلب)عاليةعاليةعالية
الأداء العامممتاز (مع الضبط الجيد)ممتازجيد جداًجيد
كلفة التدريب3 نماذج في الذاكرةنموذج واحدنموذج واحدنموذج واحد
مستعمل فيGPT-4, LLaMA 2, ClaudeLLaMA 3, Mistral, Zephyrنماذج أحدثتطبيقات محدودة

6.3 Direct Preference Optimization (DPO)

بديل بسيط لـ RLHF دون الحاجة إلى نموذج مكافأة منفصل. حوَّل RLHF إلى مشكلة تصنيف مباشرة.

🧮 معادلة DPO المبسطة:
الهدف: زيادة احتمالية الإجابة المفضلة (chosen) وتقليل احتمالية الإجابة غير المرغوبة (rejected) مع الحفاظ على الاستقرار عبر KL divergence ضمني.
L_DPO = -log( σ( β * (log π(y_c|x) - log π(y_r|x)) ) )
حيث: π هو النموذج، y_c الإجابة المفضلة، y_r الإجابة المرفوضة، β معامل التنظيم.
📊 أي طريقة تختار؟ — دليل سريع
  • لديك ميزانية وفريق كبير؟ → استخدم RLHF (PPO) — الأداء الأقصى (مثل GPT-4, Claude)
  • فريق صغير/ميزانية محدودة؟ → استخدم DPO — أداء ممتاز بتعقيد أقل (مثل LLaMA 3, Zephyr)
  • ليس لديك بيانات مقارنات (chosen/rejected)؟ → استخدم KTO — يحتاج فقط إجابات جيدة أو سيئة
  • تريد التبسيط الكامل؟ → استخدم ORPO — يجمع SFT + المواءمة في خطوة واحدة

6.4 التقييم — المقاييس القياسية (Benchmarks)

لا يمكنك تحسين ما لا تقيسه. هذه هي المعايير القياسية لتقييم LLMs:

المعيار المجال الوصف عدد الأسئلة صعوبة
MMLUمعرفة عامة57 مادة (رياضيات، تاريخ، قانون، طب...)14,042متوسط-صعب
GSM8Kرياضياتمسائل كلامية من المدرسة الابتدائية1,319متوسط
HumanEvalكودكتابة دوال Python من docstring164متوسط
HellaSwagاستدلال عاماختيار النهاية الأكثر منطقية لجملة10,042متوسط
WinoGrandeضمائرحل غموض الضمائر في الجمل1,267متوسط
ARC-Challengeعلومأسئلة علمية من اختبارات مدرسية1,172صعب
TruthfulQAالصدقهل يقدم النموذج معلومات صحيحة؟817متوسط
BBH (BIG-Bench Hard)استدلال معقد23 مهمة صعبة من BIG-Bench~6,500صعب جداً
MATHرياضيات متقدمةمسائل رياضية بمستويات 1-55,000صعب جداً

نتائج نموذجية على المعايير (LLaMA 3 8B vs 70B)

المعيار 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%
📌 مهم: استخدم دائماً مجموعة تقييم موحدة (مثل LM Evaluation Harness من EleutherAI) لتقييم نماذجك. وثِّق ظروف التقييم (عدد shots، التنسيق، البرومبت) لضمان قابلية المقارنة.
7

دراسة حالة متكاملة: تدريب LLaMA-style 7B من الصفر

🎯 الهدف: تطبيق كل ما تعلمناه في هذا المجلد — من جمع البيانات إلى التقييم النهائي — في مشروع واحد: تدريب نموذج LLaMA-style بحجم 7B من الصفر على 64 GPU H100.

7.1 مواصفات المشروع

البندالقيمةملاحظات
المعماريةLLaMA-style (Decoder-only, RoPE, SwiGLU, RMSNorm, GQA)نفس LLaMA 2/3
حجم النموذج6.7B معاملاتأقل بقليل من 7B لتوفير هامش ذاكرة
عدد الطبقات32مثل LLaMA 2 7B
Hidden dimension4096
عدد رؤوس الانتباه32مع GQA (8 KV heads)
حجم البيانات1.5T توكنمزيج من RedPajama + FineWeb + The Stack
المصادرويب (60%), كود (15%), كتب (10%), Wikipedia (8%), أكاديمي (7%)توزيع متعمد لتحسين الاستدلال
عدد GPUs64 × H100 (80GB)8 Nodes × 8 GPUs
مدة التدريب~45 يوماًبحوالي 340K steps
التكلفة التقديرية~$240K - $300Kبسعر CoreWeave (~$2.19/h)

7.2 الخطوات التفصيلية

المرحلة 1: إعداد البيئة والبنية التحتية

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

المرحلة 2: إعداد البيانات

# 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

المرحلة 3: إعداد النموذج

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)

المرحلة 4: تشغيل التدريب

# ملف التشغيل الرئيسي — 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}")
🚀 أمر تشغيل التدريب على 64 GPU
deepspeed \
  --num_gpus 8 \
  --num_nodes 8 \
  --master_addr $MASTER_ADDR \
  --master_port $MASTER_PORT \
  --hostfile hostfile.txt \
  ds_pretrain.py

المرحلة 5: ما بعد التدريب — SFT + DPO

# تدريب 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

المرحلة 6: التقييم والتحقق

# تقييم باستخدام 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

7.3 الجدول الزمني المتوقع

المرحلةالمدةفريقتوصيف
إعداد البنية التحتيةأسبوع 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%المنطق العامي الجيد

7.4 أسباب النجاح والفشل — دروس مستفادة

مفاتيح النجاح

  • جودة البيانات قبل كل شيء
  • اختبار الـ pipeline على نطاق صغير أولاً
  • Checkpoints متكررة (كل 5000 خطوة)
  • مراقبة W&B + تنبيهات Slack
  • ZeRO-3 مع overlap_comm=true
  • توليف بيانات الكود للنماذج الصغيرة

مزالق شائعة

  • زيادة معدل التعلم (lr) تسبب divergence
  • إهمال اختبار batch size يؤدي إلى OOM
  • عدم مراقبة فقدان الاتصال بين GPUs
  • تجاهل تحذيرات فقدان الدقة (loss spikes)
  • توزيع بيانات غير متوازن يؤدي إلى تحيزات
  • إهمال تقييم منتصف التدريب
🔄 التالي: المجلد الرابع — سيدرس تحسين LLMs وتطبيقاتها بما في ذلك: التكميم (Quantization)، التقطير (Distillation)، التضمين (RAG)، هندسة البرومبت، وكلاء AI، والنشر الإنتاجي.