Accelerate documentation
جولة سريعة
جولة سريعة
تتوفر طرق عديدة لإطلاق الكود وتشغيله اعتمادًا على بيئة التدريب (torchrun، DeepSpeed، إلخ) والأجهزة المتاحة. يوفر Accelerate واجهة موحدة لإطلاق التدريب على تراكيب التوزيع المختلفة، مما يتيح لك التركيز على كود تدريب PyTorch الخاص بك بدلاً من التفاصيل الدقيقة لتكييف الكود مع هذه التراكيب المختلفة. وهذا يتيح لك توسيع نطاق كود PyTorch الخاص بك بسهولة للتدريب والاستدلال على تراكيب التوزيع باستخدام أجهزة مثل وحدات معالجة الرسوميات (GPUs) ووحدات المعالجة المخصصة (TPUs). كما يوفر Accelerate ميزة الاستدلال على النماذج الكبيرة (Big Model Inference) لجعل تحميل النماذج الضخمة جدًا التي لا تتسع عادةً في الذاكرة وتشغيل الاستدلال عليها أكثر سهولة.
يُقدّم هذا الدليل السريع تعريفاً بالخصائص الثلاث الرئيسية في Accelerate:
- واجهة موحدة لسطر الأوامر لإطلاق سكربتات التدريب الموزّع
- مكتبة تدريب لتكييف كود تدريب PyTorch لتشغيله على تكوينات موزعة مختلفة
- استدلال النماذج الكبيرة
واجهة إطلاق موحدة
يختار Accelerate تلقائيًا قيم الإعداد المناسبة لأي إطار عمل للتدريب الموزّع (DeepSpeed، FSDP، إلخ) من خلال ملف إعداد موحّد يتم توليده من الأمر accelerate config. كما يمكنك تمرير قيم الإعداد صراحةً إلى سطر الأوامر، وهو أمر مفيد في حالات معينة مثل استخدام SLURM.
لكن في معظم الحالات، يجب عليك دائمًا تشغيل accelerate config أولاً لمساعدة Accelerate على التعرف على إعدادات التدريب الخاصة بك.
accelerate config
يُنشئ الأمر accelerate config ملف default_config.yaml ويحفظه في مجلد ذاكرة التخزين المؤقت لـ Accelerate. يخزّن هذا ملف الإعدادات لبيئة التدريب الخاصة بك، مما يساعد Accelerate على تشغيل سكربت التدريب بشكل صحيح بناءً على جهازك.
بعد أن تقوم بإعداد بيئتك، يمكنك اختبار إعدادك باستخدام accelerate test، والذي يشغّل سكربتًا قصيرًا لاختبار البيئة الموزعة.
accelerate testأضف
--config_fileإلى أمرaccelerate testأوaccelerate launchلتحديد موقع ملف الإعدادات إذا كان محفوظًا في موقع غير افتراضي مثل ذاكرة التخزين المؤقت.
بمجرد إعداد بيئتك، شغّل سكربت التدريب الخاص بك باستخدام accelerate launch!
accelerate launch path_to_script.py --args_for_the_script
للمزيد من المعلومات، اطّلع على شروحات إطلاق الكود الموزّع لمعرفة المزيد حول كيفية إطلاق سكربتاتك.
كما نوفر مجموعة إعدادات تعرض عدداً من إعدادات أمثلة الأدنى الجاهزة مسبقاً لمجموعة متنوعة من التكوينات التي يمكنك تشغيلها.
تكييف كود التدريب
الميزة الرئيسية التالية في Accelerate هي فئة Accelerator التي تُكيّف كود PyTorch الخاص بك لتشغيله على إعدادات موزعة مختلفة.
يكفيك إضافة بضع أسطر من الكود إلى سكربت التدريب الخاص بك لتفعيل تشغيله على وحدات معالجة رسومية (GPUs) أو وحدات معالجة برمجية (TPUs) متعددة.
+ from accelerate import Accelerator
+ accelerator = Accelerator()
+ device = accelerator.device
+ model, optimizer, training_dataloader, scheduler = accelerator.prepare(
+ model, optimizer, training_dataloader, scheduler
+ )
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
- inputs = inputs.to(device)
- targets = targets.to(device)
outputs = model(inputs)
loss = loss_function(outputs, targets)
+ accelerator.backward(loss)
optimizer.step()
scheduler.step()- استورد فئة Accelerator وأنشئ مثيلًا لها في بداية سكربت التدريب الخاص بك. تُهيّئ فئة Accelerator كل ما هو ضروري للتدريب الموزّع، وتكتشف تلقائيًا بيئة التدريب (جهاز واحد بوحدة معالجة رسومية GPU، أو جهاز بعدة وحدات معالجة رسومية، أو عدة أجهزة بعدة وحدات معالجة رسومية، أو وحدة معالجة TPU، إلخ) بناءً على طريقة تشغيل الكود.
from accelerate import Accelerator
accelerator = Accelerator()- أزل الاستدعاءات مثل
.cuda()على النموذج وبيانات الإدخال. يقوم كلاس Accelerator تلقائيًا بوضع هذه الكائنات على الجهاز المناسب نيابةً عنك.
هذه الخطوة اختيارية، لكن يُعدّ السماح لـ Accelerate بالتعامل مع توزيع الأجهزة ممارسةً مثالية. يمكنك أيضًا تعطيل التوزيع التلقائي للأجهزة عن طريق تمرير
device_placement=Falseعند تهيئة Accelerator. إذا كنت ترغب في وضع الكائنات على جهاز بشكل صريح باستخدام.to(device)، فتأكد من استخدامaccelerator.deviceبدلاً من ذلك. على سبيل المثال، إذا أنشأت مُحسِّنًا (optimizer) قبل وضع النموذج علىaccelerator.device، فإن التدريب يفشل على TPU.
لا يستخدم Accelerate عمليات النقل غير الحاصلة على الحظر (non-blocking) بشكل افتراضي في وضعه التلقائي للأجهزة، مما قد يؤدي إلى مزامنات CUDA غير مرغوب فيها. يمكنك تفعيل عمليات النقل غير الحاصلة على الحظر عن طريق تمرير DataLoaderConfiguration مع ضبط
non_blocking=Trueكـdataloader_configعند تهيئة Accelerator. وكالمعتاد، لن تعمل عمليات النقل غير الحاصلة على الحظر إلا إذا كان مُحمّل البيانات (dataloader) مضبوطاً أيضاً علىpin_memory=True. احذر من أن استخدام عمليات النقل غير الحاصلة على الحظر من وحدة معالجة الرسوميات (GPU) إلى وحدة المعالجة المركزية (CPU) قد يؤدي إلى نتائج غير صحيحة إذا أدى ذلك إلى تنفيذ عمليات على وحدة المعالجة المركزية على متجهات (tensors) غير جاهزة.
device = accelerator.device
- مرّر جميع كائنات PyTorch ذات الصلة بالتدريب (المُحسِّن، النموذج، مُحمِّل البيانات، مُجدول معدل التعلم) إلى طريقة prepare() فور إنشائها. تُغلّف هذه الطريقة النموذج في حاوية مُحسَّنة لإعدادك الموزَّع، وتستخدم نسخة Accelerate من المُحسِّن والمُجدول، وتُنشئ نسخة مُجزَّأة من مُحمِّل بياناتك لتوزيعها عبر وحدات معالجة الرسوميات (GPUs) أو وحدات المعالجة المخصصة (TPUs).
model, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(
model, optimizer, train_dataloader, lr_scheduler
)- استبدل
loss.backward()بـ backward() لاستخدام طريقةbackward()الصحيحة لإعداد التدريب الخاص بك.
accelerator.backward(loss)
اقرأ دليل الآليات الداخلية لـ Accelerate لمعرفة المزيد من التفاصيل حول كيفية تكيّف Accelerate مع كودك.
التقييم الموزّع
لتنفيذ التقييم الموزّع، مرّر مُحمّل بيانات التحقق الخاص بك إلى طريقة prepare():
validation_dataloader = accelerator.prepare(validation_dataloader)
لا يتلقى كل جهاز في إعدادك الموزع سوى جزء من بيانات التقييم، مما يعني أنه يجب عليك تجميع تنبؤاتك معًا باستخدام طريقة gather_for_metrics(). تتطلب هذه الطريقة أن تكون جميع المصفوفات (tensors) بنفس الحجم في كل عملية، لذا إذا كانت مصفوفاتك ذات أحجام مختلفة في كل عملية (على سبيل المثال عند الحشو الديناميكي حتى الطول الأقصى في الدفعة)، فيجب عليك استخدام طريقة pad_across_processes() لحشو مصفوفتك حتى أكبر حجم عبر العمليات. لاحظ أن المصفوفات يجب أن تكون أحادية البعد (1D) وأننا نلصق المصفوفات على طول البعد الأول.
for inputs, targets in validation_dataloader:
predictions = model(inputs)
# Gather all predictions and targets
all_predictions, all_targets = accelerator.gather_for_metrics((predictions, targets))
# Example of use with a *Datasets.Metric*
metric.add_batch(all_predictions, all_targets)في الحالات الأكثر تعقيدًا (مثل الموترات ثنائية الأبعاد، أو عدم الرغبة في دمج الموترات، أو قاموس من الموترات ثلاثية الأبعاد)، يمكنك تمرير use_gather_object=True في gather_for_metrics. سيعيد هذا الأمر قائمة الكائنات بعد جمعها. لاحظ أن استخدام هذه الخاصية مع الموترات على وحدة معالجة الرسوميات (GPU) غير مدعوم بشكل جيد وغير فعال.
قد تتكرر البيانات في نهاية مجموعة البيانات بحيث يمكن تقسيم الدفعة بالتساوي بين جميع العمال. تزيل طريقة gather_for_metrics() البيانات المكررة تلقائيًا لحساب مقياس أكثر دقة.
استدلال النماذج الكبيرة
يتميز استنتاج النماذج الكبيرة في Accelerate بميزتين رئيسيتين، هما init_empty_weights() وload_checkpoint_and_dispatch()، لتحميل النماذج الكبيرة للاستنتاج التي لا تتسع عادةً في الذاكرة.
اطّلع على دليل معالجة النماذج الكبيرة للاستدلال لفهم أفضل لكيفية عمل استدلال النماذج الكبيرة في الخلفية.
تهيئة الأوزان الفارغة
يُهيّئ مدير السياق init_empty_weights() النماذج بأي حجم من خلال إنشاء هيكل النموذج ونقل المعاملات ووضعها في كل مرة يتم إنشاؤها على جهاز meta الخاص بـ PyTorch. وبهذه الطريقة، لا يتم تحميل جميع الأوزان فوراً، بل يُحمَّل جزء صغير من النموذج في الذاكرة في كل مرة.
على سبيل المثال، يستهلك تحميل نموذج Mixtral-8x7B فارغًا ذاكرة أقل بكثير من تحميل النماذج والأوزان بالكامل على وحدة المعالجة المركزية.
from accelerate import init_empty_weights
from transformers import AutoConfig, AutoModelForCausalLM
config = AutoConfig.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
with init_empty_weights():
model = AutoModelForCausalLM.from_config(config)تحميل الأوزان وإرسالها
تحمّل الدالة load_checkpoint_and_dispatch() نقاط التفتيش الكاملة أو المقسّمة إلى النموذج الفارغ، وتوزّع الأوزان تلقائيًا على جميع الأجهزة المتاحة.
يحدد معامل device_map مكان وضع كل طبقة من طبقات النموذج، وعند تحديد "auto" يتم وضعها أولاً على وحدة معالجة الرسوميات (GPU)، ثم على وحدة المعالجة المركزية (CPU)، وأخيراً على القرص الصلب كمُتجهات مُرمّزة في الذاكرة إذا لم يكن هناك ما يكفي من الذاكرة. استخدم معامل no_split_module_classes للإشارة إلى الوحدات التي لا ينبغي تقسيمها عبر الأجهزة (عادةً تلك التي تحتوي على اتصال متبقي).
from accelerate import load_checkpoint_and_dispatch
model_checkpoint = "your-local-model-folder"
model = load_checkpoint_and_dispatch(
model, checkpoint=model_checkpoint, device_map="auto", no_split_module_classes=['Block']
)الخطوات التالية
الآن وقد تعرّفت على الميزات الرئيسية في Accelerate، قد تشمل خطواتك التالية:
- اطّلع على الدروس التعليمية للحصول على شرح مبسّط لتطبيق Accelerate. وهذا مفيد بشكل خاص إذا كنت جديدًا في التدريب الموزّع وفي المكتبة.
- تعمّق في الأدلة لمعرفة كيفية استخدام Accelerate لحالات استخدام محددة.
- عمّق فهمك المفاهيمي لكيفية عمل Accelerate داخليًا من خلال قراءة أدلة المفاهيم.
- استعرض الفئات والأوامر في مرجع الواجهة البرمجية لمعرفة المعاملات والخيارات المتاحة.