الفصل 2: المتطلبات الحسابية
حساب ذاكرة GPU وتكاليف التدريب
فهم المتطلبات الحسابية للتخصيص الدقيق أمر بالغ الأهمية لتخطيط مشاريعك واختيار النهج الصحيح.
مكونات ذاكرة GPU
أثناء التدريب، تستهلك ذاكرة GPU بواسطة أربعة مكونات رئيسية:
1. أوزان النموذج
معلمات النموذج نفسه.
2. التدرجات
نفس حجم الأوزان - يخزن التدرج لكل معلمة.
3. حالات المحسن
يخزن AdamW حالتين (الزخم، التباين) لكل معلمة.
4. التنشيطات
القيم الوسيطة اللازمة للانتشار العكسي.
صيغة حساب الذاكرة
الصيغة الأساسية
Memory (bytes) = Parameters × Precision × Multiplier
Where Multiplier for training:
- Inference: 1
- AdamW training: 4-6 (weights + gradients + 2 optimizer states + activations)
أحجام الدقة
| الدقة | البايت لكل معلمة |
|---|---|
| float32 | 4 |
| bfloat16 | 2 |
| float16 | 2 |
| int8 | 1 |
| int4 | 0.5 |
متطلبات الذاكرة للتخصيص الدقيق الكامل
مثال: نموذج 7B معلمة
# Parameters: 7 billion
parameters = 7_000_000_000
# With float32 (full precision)
weights_fp32 = parameters * 4 # 28 GB
gradients_fp32 = parameters * 4 # 28 GB
optimizer_fp32 = parameters * 4 * 2 # 56 GB (2 states)
# Total: ~112 GB ❌ Too much for most GPUs
# With bfloat16 + mixed precision
weights_bf16 = parameters * 2 # 14 GB
gradients_bf16 = parameters * 2 # 14 GB
optimizer_fp32 = parameters * 4 * 2 # 56 GB (kept in fp32)
# Total: ~84 GB ⚠️ Still requires A100-80GB
# With gradient checkpointing + bf16
# Activations reduced by ~30%
# Total: ~60-70 GB
جدول متطلبات الذاكرة
| حجم النموذج | التخصيص الكامل (fp32) | التخصيص الكامل (bf16) | مع Grad Ckpt |
|---|---|---|---|
| 1B | ~16 GB | ~12 GB | ~8 GB |
| 7B | ~112 GB | ~84 GB | ~60 GB |
| 13B | ~208 GB | ~156 GB | ~110 GB |
| 70B | ~1.1 TB | ~840 GB | ~600 GB |
تقليل متطلبات الذاكرة
1. التدريب بدقة مختلطة
training_args = TrainingArguments(
bf16=True, # Use bfloat16
)
يقلل من ذاكرة الأوزان والتدرجات بحوالي 50٪.
2. التحقق من التدرج
training_args = TrainingArguments(
gradient_checkpointing=True,
)
# OR
model.gradient_checkpointing_enable()
يستبدل الحوسبة بالذاكرة - يعيد حساب التنشيطات أثناء المرور العكسي.
3. تراكم التدرج
training_args = TrainingArguments(
per_device_train_batch_size=1,
gradient_accumulation_steps=16,
# Effective batch size = 1 * 16 = 16
)
تستخدم الدفعات الأصغر ذاكرة أقل؛ تراكم التدرجات لمحاكاة دفعات أكبر.
4. المحسنات الفعالة للذاكرة
# 8-bit Adam (requires bitsandbytes)
training_args = TrainingArguments(
optim="adamw_8bit",
)
# OR Adafactor (no momentum)
training_args = TrainingArguments(
optim="adafactor",
)
5. DeepSpeed ZeRO
# deepspeed_config.json
{
"zero_optimization": {
"stage": 2, # Partition gradients and optimizer states
}
}
# In training
training_args = TrainingArguments(
deepspeed="deepspeed_config.json",
)
مراحل ZeRO:
- المرحلة 1: تقسيم حالات المحسن
- المرحلة 2: + تقسيم التدرجات
- المرحلة 3: + تقسيم أوزان النموذج (يتيح تدريب النماذج الأكبر من ذاكرة GPU)
توصيات عملية لـ GPU
التدريب على GPU واحد
| GPU | VRAM | الحد الأقصى للنموذج (التخصيص الكامل) | الحد الأقصى للنموذج (فعال) |
|---|---|---|---|
| RTX 3090 | 24 GB | 1B | 3B |
| RTX 4090 | 24 GB | 1B | 3B |
| A100-40GB | 40 GB | 3B | 7B |
| A100-80GB | 80 GB | 7B | 13B |
| H100 | 80 GB | 7B | 13B |
التدريب على عدة وحدات GPU
# Automatic distribution with accelerate
from accelerate import Accelerator
accelerator = Accelerator()
model, optimizer, dataloader = accelerator.prepare(
model, optimizer, dataloader
)
| الإعداد | VRAM المدمج | الحد الأقصى للنموذج (فعال) |
|---|---|---|
| 2× A100-40GB | 80 GB | 7-13B |
| 4× A100-80GB | 320 GB | 30-40B |
| 8× H100 | 640 GB | 70B |
تقدير وقت التدريب
العوامل المؤثرة على وقت التدريب
Training Time = (Dataset Size × Epochs) / (Batch Size × Throughput)
أمثلة على الإنتاجية (tokens/second)
| النموذج | GPU | الإنتاجية |
|---|---|---|
| 7B | A100-40GB | ~1,000 tokens/s |
| 7B | H100 | ~2,000 tokens/s |
| 13B | A100-80GB | ~500 tokens/s |
| 70B | 8× H100 | ~800 tokens/s |
مثال على حساب الوقت
# Dataset: 10,000 examples, 512 tokens each
total_tokens = 10_000 * 512 = 5_120_000
# Training: 3 epochs
total_training_tokens = 5_120_000 * 3 = 15_360_000
# Throughput: 1,000 tokens/second
training_time_seconds = 15_360_000 / 1_000 = 15,360 seconds
training_time_hours = 15_360 / 3_600 = 4.3 hours
تقدير تكلفة السحابة
تسعير GPU (تقريبي)
| GPU | عند الطلب ($/hr) | سبوت ($/hr) |
|---|---|---|
| T4 | $0.50 | $0.15 |
| A10G | $1.50 | $0.45 |
| A100-40GB | $4.00 | $1.20 |
| A100-80GB | $6.00 | $1.80 |
| H100 | $8.00 | $2.40 |
مثال على حساب التكلفة
# Training a 7B model
# Time: 4 hours on A100-40GB
# Cost: 4 × $4.00 = $16 (on-demand)
# Cost: 4 × $1.20 = $4.80 (spot)
# With experimentation (5 runs)
# Total: $80 (on-demand) or $24 (spot)
تحليل الذاكرة
تحقق من استخدام الذاكرة الحالي
import torch
# Current allocated memory
allocated = torch.cuda.memory_allocated() / 1024**3
print(f"Allocated: {allocated:.2f} GB")
# Peak memory usage
peak = torch.cuda.max_memory_allocated() / 1024**3
print(f"Peak: {peak:.2f} GB")
# Reset peak stats
torch.cuda.reset_peak_memory_stats()
تقدير قبل التدريب
def estimate_memory(model, batch_size, seq_len, precision="bf16"):
"""Estimate training memory requirements."""
param_count = sum(p.numel() for p in model.parameters())
# Bytes per parameter based on precision
bytes_per_param = 2 if precision == "bf16" else 4
# Model weights
weights_gb = (param_count * bytes_per_param) / 1024**3
# Gradients (same as weights)
gradients_gb = weights_gb
# Optimizer states (AdamW: 2 states in fp32)
optimizer_gb = (param_count * 4 * 2) / 1024**3
# Activations (rough estimate)
activation_gb = (batch_size * seq_len * 4096 * 4) / 1024**3 # Approximate
total_gb = weights_gb + gradients_gb + optimizer_gb + activation_gb
print(f"Weights: {weights_gb:.2f} GB")
print(f"Gradients: {gradients_gb:.2f} GB")
print(f"Optimizer: {optimizer_gb:.2f} GB")
print(f"Activations: ~{activation_gb:.2f} GB")
print(f"Total: ~{total_gb:.2f} GB")
return total_gb
قائمة التحقق من التحسين
□ Enable mixed precision (bf16/fp16)
□ Enable gradient checkpointing
□ Use gradient accumulation for larger effective batch sizes
□ Consider 8-bit optimizers
□ Use DeepSpeed for multi-GPU
□ Monitor memory with profiling
□ Use spot instances for cost savings
النقاط الرئيسية
✅ يتطلب التخصيص الدقيق الكامل ~4-6x حجم النموذج في ذاكرة GPU
✅ يحتاج نموذج 7B إلى 60-80GB للتخصيص الدقيق الكامل
✅ الدقة المختلطة والتحقق من التدرج يقللان بشكل كبير من الذاكرة
✅ يتيح التدريب على عدة وحدات GPU نماذج أكبر
✅ يمكن تقليل تكاليف السحابة بنسبة 60-70٪ باستخدام سبوت
✅ قم دائمًا بتحليل الذاكرة قبل الالتزام بجلسات تدريب طويلة
الخطوات التالية
تابع إلى الفصل 3: النسيان الكارثي لتتعلم عن الاحتفاظ بالمعرفة أثناء التخصيص الدقيق.
تحقق سريع
قبل المتابعة، تأكد من أنك تستطيع الإجابة على:
- ما هي المكونات الأربعة الرئيسية التي تستهلك ذاكرة GPU أثناء التدريب؟
- كم تتطلب ذاكرة نموذج 7B للتخصيص الدقيق الكامل مع bf16؟
- ما هو الغرض من تراكم التدرج؟