الفصل 3: التدريب بكفاءة في استخدام الذاكرة
تحسين التدريب للأجهزة ذات الموارد المحدودة
يغطي هذا الفصل جميع التقنيات لزيادة كفاءة التدريب على ذاكرة GPU المحدودة.
تقنيات تحسين الذاكرة
1. تدقيق التدرج
المقايضة بين الحساب والذاكرة عن طريق إعادة حساب التفعيلات:
# التفعيل عبر معلمات التدريب
training_args = TrainingArguments(
gradient_checkpointing=True,
...
)
# أو مباشرة على النموذج
model.gradient_checkpointing_enable()
التوفير: ~30% تقليل في الذاكرة التكلفة: ~20% تدريب أبطأ
2. تراكم التدرج
محاكاة دفعات أكبر بذاكرة محدودة:
training_args = TrainingArguments(
per_device_train_batch_size=1, # دفعة صغيرة تناسب الذاكرة
gradient_accumulation_steps=16, # تراكم التدرجات
# حجم الدفعة الفعلي = 1 * 16 = 16
)
3. المحسنات الفعالة
آدم 8 بت
training_args = TrainingArguments(
optim="adamw_8bit", # يتطلب bitsandbytes
)
المحسنات المصفحة
training_args = TrainingArguments(
optim="paged_adamw_8bit", # ينقل إلى CPU عند الحاجة
)
نص كامل للتدريب بكفاءة في استخدام الذاكرة
import torch
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
TrainingArguments,
)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from trl import SFTTrainer
from datasets import load_dataset
# التكميم
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
# تحميل النموذج
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B",
quantization_config=bnb_config,
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B")
tokenizer.pad_token = tokenizer.eos_token
# التحضير للتدريب
model = prepare_model_for_kbit_training(model)
# إعدادات LoRA
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_config)
# مجموعة البيانات
dataset = load_dataset("databricks/dolly-15k", split="train[:1000]")
# معلمات التدريب بكفاءة في استخدام الذاكرة
training_args = TrainingArguments(
output_dir="./qlora-output",
num_train_epochs=1,
per_device_train_batch_size=1,
gradient_accumulation_steps=16,
learning_rate=2e-4,
bf16=True,
gradient_checkpointing=True,
optim="paged_adamw_8bit",
logging_steps=10,
save_strategy="epoch",
)
# التدريب
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
args=training_args,
dataset_text_field="text",
max_seq_length=512,
tokenizer=tokenizer,
)
trainer.train()
model.save_pretrained("./qlora-adapter")
قائمة التحقق من الذاكرة
□ استخدم QLoRA (تكميم 4 بت)
□ فعّل تدقيق التدرج
□ استخدم تراكم التدرج
□ استخدم محسن 8 بت أو مصفح
□ استخدم دقة bfloat16
□ قلل max_seq_length إذا أمكن
□ استخدم أحجام دفعات أصغر
الاستخدام المتوقع للذاكرة
| النموذج | بدون تحسين | مع تحسين كامل |
|---|---|---|
| 7B | ~14GB | ~4-6GB |
| 13B | ~26GB | ~8-10GB |
| 70B | ~140GB | ~40-48GB |
النقاط الرئيسية
✅ اجمع بين تقنيات تحسين متعددة ✅ تدقيق التدرج يقايض بين الحساب والذاكرة ✅ تراكم التدرج يحاكي دفعات أكبر ✅ المحسنات المصفحة تتعامل مع ارتفاعات الذاكرة ✅ QLoRA + جميع التحسينات تمكن 7B على 6GB