Accelerate documentation

إطلاق سكربتات Accelerate

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

إطلاق سكربتات Accelerate

في الشرح التعليمي السابق، تعرّفت على كيفية تعديل سكربت التدريب الحالي لديك لاستخدام Accelerate. يُعرض الإصدار النهائي لذلك الكود أدناه:

from accelerate import Accelerator

accelerator = Accelerator()

model, optimizer, training_dataloader, scheduler = accelerator.prepare(
    model, optimizer, training_dataloader, scheduler
)

for batch in training_dataloader:
    optimizer.zero_grad()
    inputs, targets = batch
    outputs = model(inputs)
    loss = loss_function(outputs, targets)
    accelerator.backward(loss)
    optimizer.step()
    scheduler.step()

لكن كيف يمكنك تشغيل هذا الكود وجعله يستفيد من العتاد الخاص المتاح له؟

أولاً، يجب عليك إعادة كتابة الكود أعلاه في دالة، وجعله قابلًا للاستدعاء كسكربت. على سبيل المثال:

  from accelerate import Accelerator
  
+ def main():
      accelerator = Accelerator()

      model, optimizer, training_dataloader, scheduler = accelerator.prepare(
          model, optimizer, training_dataloader, scheduler
      )

      for batch in training_dataloader:
          optimizer.zero_grad()
          inputs, targets = batch
          outputs = model(inputs)
          loss = loss_function(outputs, targets)
          accelerator.backward(loss)
          optimizer.step()
          scheduler.step()

+ if __name__ == "__main__":
+     main()

بعد ذلك، تحتاج إلى تشغيله باستخدام accelerate launch.

يُوصى بتشغيل accelerate config قبل استخدام accelerate launch لتكوين بيئتك حسب تفضيلاتك. وإلا فإن Accelerate سيستخدم إعدادات افتراضية بسيطة جداً تعتمد على إعدادات نظامك.

باستخدام accelerate launch

يحتوي Accelerate على أمر سطر أوامر خاص لمساعدتك على تشغيل كودك في نظامك من خلال accelerate launch. يُغلّف هذا الأمر جميع الأوامر المختلفة اللازمة لتشغيل سكربتاتك على منصات متنوعة، دون أن تضطر إلى تذكر ما هو كلٌّ منها.

إذا كنت على دراية بإطلاق السكربتات في PyTorch بنفسك، كما هو الحال مع torchrun، يمكنك الاستمرار في القيام بذلك. لا يُشترط استخدام accelerate launch.

يمكنك تشغيل سكربت الخاص بك بسرعة باستخدام:

accelerate launch {script_name.py} --arg1 --arg2 ...

ما عليك سوى وضع accelerate launch في بداية أمر، ثم تمرير الحُجج والمعاملات الإضافية إلى سكربتك بعد ذلك كما هو معتاد!

بما أن هذا يشغّل طرق توليد torch المختلفة، يمكن تعديل جميع متغيرات البيئة المتوقعة هنا أيضًا. على سبيل المثال، فيما يلي كيفية استخدام accelerate launch مع وحدة معالجة رسومات واحدة:

# for cuda device:
CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ...
# for xpu device:
ZE_AFFINITY_MASK="0" accelerate launch {script_name.py} --arg1 --arg2 ...

يمكنك أيضًا استخدام accelerate launch دون تنفيذ accelerate config أولاً، لكن قد تحتاج إلى تمرير معاملات التهيئة الصحيحة يدويًا. في هذه الحالة، سيتخذ Accelerate بعض القرارات المتعلقة بالمعاملات الفائقة نيابةً عنك، على سبيل المثال، إذا كانت وحدات معالجة الرسومات (GPUs) متاحة، فسيستخدمها جميعًا افتراضيًا دون دقة مختلطة. إليك كيفية استخدام جميع وحدات معالجة الرسومات والتدريب مع تعطيل الدقة المختلطة:

accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ...

أو عن طريق تحديد عدد وحدات معالجة الرسومات (GPU) المراد استخدامها:

accelerate launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

للحصول على مزيد من التحديد، يجب عليك تمرير المعلمات المطلوبة بنفسك. على سبيل المثال، إليك الطريقة التي يمكنك بها تشغيل نفس السكربت على بطاقتَي GPU باستخدام الدقة المختلطة مع تجنّب جميع التحذيرات:

accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...

للعثور على قائمة كاملة بالمعاملات التي يمكنك تمريرها، قم بتشغيل الأمر التالي:

accelerate launch -h

حتى لو لم تكن تستخدم Accelerate في كودك، يمكنك ما زال استخدام المُشغِّل لبدء تشغيل سكربتاتك!

للتوضيح البصري لهذا الاختلاف، كان الأمر السابق accelerate launch على عدة وحدات معالجة رسومية سيبدو كما يلي باستخدام torchrun:

MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ...

يمكنك أيضًا تشغيل سكربت الخاص بك باستخدام واجهة سطر الأوامر accelerate.commands.launch كوحدة بايثون بحد ذاتها، مما يتيح إمكانية تمرير سلوكيات تشغيل أخرى خاصة بلغة بايثون. للقيام بذلك، استخدم accelerate.commands.launch بدلاً من accelerate launch:

python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

إذا كنت ترغب في تنفيذ السكربت باستخدام أي أعلام Python أخرى، يمكنك تمريرها أيضًا بشكل مشابه لـ-m، كما في المثال أدناه الذي يُفعّل stdout وstderr دون تخزين مؤقت:

python -u -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}

يمكنك تشغيل الكود الخاص بك على وحدة المعالجة المركزية (CPU) أيضًا! وهذا مفيد لأغراض تصحيح الأخطاء واختبار النماذج والمجموعات البيانات الصغيرة.

accelerate launch --cpu {script_name.py} {--arg1} {--arg2}

لماذا يجب عليك دائماً استخدام accelerate config

لماذا يُعدّ الأمر مفيداً لدرجة أنه يجب عليك دائماً تشغيل accelerate config؟

تذكّر الاستدعاء السابق لـ accelerate launch وكذلك torchrun؟ بعد الإعداد، لتشغيل ذلك السكربت مع الأجزاء المطلوبة، ما عليك سوى استخدام accelerate launch مباشرة، دون تمرير أي شيء آخر:

accelerate launch {script_name.py} {--arg1} {--arg2} ...

إعدادات مخصصة

كما ذُكر بإيجاز سابقاً، ينبغي استخدام accelerate launch بشكل رئيسي من خلال دمج الإعدادات التي يتم إنشاؤها باستخدام أمر accelerate config. تُحفظ هذه الإعدادات في ملف default_config.yaml داخل مجلد التخزين المؤقت الخاص بـ Accelerate. يقع هذا المجلد في (بترتيب تنازلي للأولوية):

  • المحتوى متغير البيئة HF_HOME مع إضافة accelerate في نهايته.
  • إذا لم يكن موجودًا، فإن محتوى متغير البيئة الخاص بك XDG_CACHE_HOME مع إضافة huggingface/accelerate في نهايته.
  • إذا لم يكن هذا موجودًا أيضًا، فسيكون المجلد ~/.cache/huggingface/accelerate.

لإعداد تكوينات متعددة، يمكن تمرير العلم --config_file إلى الأمر accelerate launch مع موقع ملف yaml المخصص.

قد يبدو مثال yaml على النحو التالي لجهازين GPU على جهاز واحد باستخدام fp16 للدقة المختلطة:

compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: MULTI_GPU
fsdp_config: {}
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 2
use_cpu: false

يبدو تشغيل السكربت من موقع ملف yaml المخصص على النحو التالي:

accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...

التدريب متعدد العقد

يُشبه التدريب متعدد العقد باستخدام Accelerate التدريب متعدد العقد باستخدام torchrun. أبسط طريقة لإطلاق عملية تدريب متعددة العقد هي اتباع ما يلي:

  • انسخ قاعدة الكود والبيانات إلى جميع العقد. (أو ضعها على نظام ملفات مشترك)
  • قم بإعداد حزم بايثون على جميع العقد.
  • شغّل accelerate config على العقدة الرئيسية المفردة أولاً. بعد تحديد عدد العقد، سيُطلب منك تحديد ترتيب كل عقدة (سيكون هذا 0 للعقدة الرئيسية/الأساسية)، إلى جانب عنوان IP والمنفذ للعملية الرئيسية. هذا مطلوب حتى تتمكن العقد العاملة من التواصل مع العملية الرئيسية. بعد ذلك، يمكنك نسخ ملف الإعداد هذا أو إرساله عبر جميع عقدك، مع تغيير machine_rank إلى 1، 2، 3، وما إلى ذلك، لتجنب الحاجة إلى تشغيل الأمر (أو يمكنك ببساطة اتباع تعليماتهم مباشرةً للإطلاق باستخدام torchrun أيضاً)

بمجرد إتمام ذلك، يمكنك بدء تشغيل التدريب متعدد العقد من خلال تنفيذ accelerate launch (أو torchrun) على جميع العقد.

It is required that the command be run on all nodes for everything to start, not just running it from the main node. You can use something like SLURM or a different process executor to wrap around this requirement and call everything from a single command.

يُوصى باستخدام عنوان IP الداخلي (Intranet) الخاص بالعقدة الرئيسية بدلاً من عنوان IP العام للحصول على زمن استجابة أفضل. هذا هو عنوان 192.168.x.x أو عنوان 172.x.x.x الذي تراه عند تشغيل hostname -I على العقدة الرئيسية.

للحصول على فكرة أفضل حول التدريب متعدد العقد، راجع مثالنا الخاص بـ التدريب متعدد العقد باستخدام FSDP.

Update on GitHub