Transformers documentation
DeepSpeed ZeRO
DeepSpeed ZeRO
يُزيل DeepSpeed ZeRO (Zero Redundancy Optimizer) التكرار في الذاكرة عبر التدريب الموزّع من خلال تقسيم حالات المُحسِّن والتدرّجات والمعاملات على وحدات معالجة الرسوميات. يتكوّن ZeRO من ثلاث مراحل، حيث تقسم كل مرحلة حالة أكثر من سابقتها. كما يدعم DeepSpeed التفريغ إلى ذاكرة المعالج المركزي أو ذاكرة NVMe لتحقيق توفير إضافي. تقلّل كل مرحلة إضافية ومستوى تفريغ من الذروة في استهلاك الذاكرة، على حساب زيادة التواصل بين وحدات معالجة الرسوميات.
params grads opt states
┌──────────┐ ┌──────────┐ ┌──────────┐
ZeRO-1 │██████████│ │██████████│ │███░░░░░░░│ GPU 0
│██████████│ │██████████│ │░░░███░░░░│ GPU 1
│██████████│ │██████████│ │░░░░░░████│ GPU 2
└──────────┘ └──────────┘ └──────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐
ZeRO-2 │██████████│ │███░░░░░░░│ │███░░░░░░░│ GPU 0
│██████████│ │░░░███░░░░│ │░░░███░░░░│ GPU 1
│██████████│ │░░░░░░████│ │░░░░░░████│ GPU 2
└──────────┘ └──────────┘ └──────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐
ZeRO-3 │███░░░░░░░│ │███░░░░░░░│ │███░░░░░░░│ GPU 0
│░░░███░░░░│ │░░░███░░░░│ │░░░███░░░░│ GPU 1
│░░░░░░████│ │░░░░░░████│ │░░░░░░████│ GPU 2
└──────────┘ └──────────┘ └──────────┘
█ resident ░ held on another GPUيقوم ZeRO-2 بتجزئة التدرجات وحالات المُحسِّن مع انخفاض في تكلفة الاتصال مقارنةً بـ ZeRO-3. استخدم ZeRO-3 فقط عندما لا يتسع نموذجك عبر وحدات معالجة الرسومات باستخدام ZeRO-2.
التثبيت
قم بتثبيت DeepSpeed من PyPI، أو ثبّت Transformers مع الإضافة deepspeed.
pip install deepspeed pip install transformers[deepspeed]
إذا واجهت أخطاء تثبيت متعلقة بـ CUDA، فراجع وثائق DeepSpeed CUDA. يُعد التثبيت من المصدر الخيار الأكثر موثوقية لأنه يتوافق مع عتادك الدقيق ويتضمن ميزات غير متاحة بعد في إصدار PyPI.
إعداد
يتكامل Trainer مع DeepSpeed من خلال الحجة deepspeed، والتي تقبل ملف إعداد بصيغة JSON. أو استخدم ملف إعداد Accelerate بدلاً من TrainingArguments.
استخدم "auto" في إعداداتك للقيم التي تريد أن يملأها DeepSpeed من TrainingArguments. إذا كنت تريد تحديد قيمة بشكل صريح، فتأكد من استخدام نفس القيمة لكل من معامل DeepSpeed وTrainingArguments.
راجع مرجع DeepSpeed Configuration JSON للحصول على قائمة كاملة بخيارات تكوين DeepSpeed.
{
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"optimizer": {
"type": "AdamW",
"params": { "lr": "auto" }
},
"fp16": { "enabled": "auto" }
}| إعدادات DeepSpeed | TrainingArguments |
|---|---|
train_micro_batch_size_per_gpu | per_device_train_batch_size |
gradient_accumulation_steps | gradient_accumulation_steps |
optimizer.params.lr | learning_rate |
fp16.enabled | fp16 |
مرّر الإعداد إلى معامل deepspeed.
from transformers import TrainingArguments
args = TrainingArguments(
deepspeed="path/to/deepspeed_config.json",
...
)# DeepSpeed launcher
deepspeed --num_gpus 4 train.py
# torchrun
torchrun --nproc_per_node 4 train.py
# Accelerate
accelerate launch --num_processes 4 train.pyيتجاهل Accelerate الحجة
deepspeedفي TrainingArguments.
شغّل الأمر accelerate config وأجب عن الأسئلة المتعلقة بمكوناتك المادية وإعداد التدريب لإنشاء ملف default_config.yaml في ذاكرتك المؤقتة.
distributed_type: DEEPSPEED
deepspeed_config:
deepspeed_config_file: path/to/ds_config.json
machine_rank: 0
num_machines: 1
num_processes: 4شغّل accelerate launch مع سكربت مبني على Trainer.
accelerate launch --config_file deepspeed_config.yaml train.py
مراحل ZeRO
اختر إعداد مرحلة ZeRO لاستخدامه كنقطة انطلاق.
{
"bf16": { "enabled": "auto" },
"zero_optimization": { "stage": 1 },
"gradient_clipping": "auto",
"train_micro_batch_size_per_gpu": "auto",
"train_batch_size": "auto",
"gradient_accumulation_steps": "auto"
}{
"bf16": { "enabled": "auto" },
"zero_optimization": {
"stage": 2,
"overlap_comm": true,
"allgather_bucket_size": 2e8,
"reduce_bucket_size": 2e8,
"contiguous_gradients": true
},
"gradient_clipping": "auto",
"train_micro_batch_size_per_gpu": "auto",
"train_batch_size": "auto",
"gradient_accumulation_steps": "auto"
}يقوم ZeRO-3 بتجزئة المعاملات أثناء التهيئة. يجب عليك إنشاء TrainingArguments قبل تحميل نموذجك — إذا كان النموذج موجودًا بالفعل على كل وحدة معالجة رسومية قبل تكوين DeepSpeed، فلن يتم توفير أي ذاكرة.
{
"bf16": { "enabled": "auto" },
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"contiguous_gradients": true,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_gather_16bit_weights_on_model_save": true,
"offload_optimizer": { "device": "cpu", "pin_memory": true },
"offload_param": { "device": "cpu", "pin_memory": true }
},
"gradient_clipping": "auto",
"train_micro_batch_size_per_gpu": "auto",
"train_batch_size": "auto",
"gradient_accumulation_steps": "auto"
}الحقول التالية مهمة لتخصيص التدريب.
zero_optimizationيحدد مرحلة ZeRO.{ "zero_optimization": { "stage": 3 } }اضبط حجج حجم الدفعة وتراكم التدرجات على
"auto". إذا قمت بإعداد هذه القيم يدوياً بقيم لا تتوافق مع TrainingArguments، فسيستمر التدريب بصمت بالقيم الخاطئة.{ "train_micro_batch_size_per_gpu": "auto", "train_batch_size": "auto", "gradient_accumulation_steps": "auto", "gradient_clipping": "auto" }bf16يحدد دقة التدريب. اضبطه على"auto"ليتطابق مع علمbf16في TrainingArguments.{ "bf16": { "enabled": "auto" } }stage3_gather_16bit_weights_on_model_saveيُنفّذ عملية all-gather عبر جميع وحدات معالجة الرسوميات قبل الحفظ، لإعادة بناء الموترات الكاملة من مقاطعها. هذا هو حجة ZeRO-3.{ "zero_optimization": { "stage": 3, "stage3_gather_16bit_weights_on_model_save": true } }اضبط
overlap_commعلىtrueلإخفاء زمن تأخير all-reduce خلف مسار الرجوع. وتُوازنallgather_bucket_sizeوreduce_bucket_sizeبين سرعة الاتصال وذاكرة وحدة معالجة الرسوميات. فالقيم الأقل تستخدم ذاكرة أقل لكنها تُبطئ الاتصال.{ "zero_optimization": { "stage": 2, "overlap_comm": true, "allgather_bucket_size": 2e8, "reduce_bucket_size": 2e8, "contiguous_gradients": true } }offload_optimizerينقل المُحسِّن إلى ذاكرة المعالج المركزي. ولتوفير المزيد من الذاكرة، انقل أيضًا معاملات النموذج باستخدامoffload_param(لنسخة ZeRO-3 فقط). اضبطpin_memoryعلىtrueلتسريع عمليات النقل بين المعالج المركزي والوحدة الرسومية، لكن هذا يُثبّت ذاكرة الوصول العشوائي فلا تصبح متاحةً للعمليات الأخرى.{ "zero_optimization": { "stage": 3, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "offload_param": { "device": "cpu", "pin_memory": true } } }optimizerوschedulerافتراضيًا هما المُحسِّن والمُجدوِل المُعيَّنان في TrainingArguments. اضبطهما على"auto"حتى يقرأ DeepSpeed القيم من TrainingArguments ما لم تكن بحاجة إلى مُحسِّن أصلي لـ DeepSpeed مثل LAMB.{ "optimizer": { "type": "AdamW", "params": { "lr": "auto", "betas": "auto", "eps": "auto", "weight_decay": "auto" } }, "scheduler": { "type": "WarmupDecayLR", "params": { "total_num_steps": "auto", "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto" } } }إذا كنت تقوم بإسناد المُحسِّن إلى وحدة المعالجة المركزية، فاضبط
zero_force_ds_cpu_optimizerعلىfalseلاستخدام مُحسِّن Adam على وحدة المعالجة المركزية من DeepSpeed.{ "zero_force_ds_cpu_optimizer": false }
نقاط التفتيش
يحفظ DeepSpeed نقاط التفتيش في تنسيق مجزأ لا يمكن تحميله مباشرة باستخدام from_pretrained(). اضبط load_best_model_at_end() على True ليتمكن Trainer من تتبع أفضل نقطة تفتيش وإعادة تحميلها في نهاية التدريب.
from transformers import TrainingArguments, Trainer
args = TrainingArguments(
deepspeed="ds_config_zero3.json",
load_best_model_at_end=True,
...
)
# after training, save a normal transformers checkpoint
trainer.save_model("./best-model")تؤدي تعيين save_only_model=True إلى تخطي حفظ حالة المُحسِّن الكاملة، مما يعني أنك لن تتمكن من إعادة تحميل أفضل نموذج في نهاية التدريب. كما اضبط stage3_gather_16bit_weights_on_model_save: true لإعادة بناء الأوزان الكاملة من شقوقها. هذا مطلوب لحفظ نموذج موحّد بدقة 16 بت أو حالة dict بدقة 16 بت مع ZeRO-3. يرمي Transformers خطأً عند دمج save_only_model=True مع load_best_model_at_end=True.
لمتابعة الاستئناف عبر تكوينات التوازي المختلفة، راجع دليل Universal Checkpointing الخاص بـ DeepSpeed.
الخطوات التالية
- اقرأ الفصل Zero Redundancy Optimizer من The Ultra-Scale Playbook لمعرفة المزيد حول كيفية عمل ZeRO.
- اقرأ أبحاث ZeRO: Memory Optimizations Toward Training Trillion Parameter Models، وDemocratizing Billion-Scale Model Training، وBreaking the GPU Memory Wall for Extreme Scale Deep Learning.