إنتقل إلى المحتوى الرئيسي

الفصل 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


الانتقال إلى الاختبار →