Accelerate documentation

مقارنة الأداء عبر التكوينات الموزعة

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

مقارنة الأداء عبر التكوينات الموزعة

قد يكون تقييم أداء الإعدادات المختلفة ومقارنتها أمرًا شائكًا إذا كنت لا تعرف ما الذي يجب البحث عنه. فعلى سبيل المثال، لا يمكنك تشغيل نفس السكربت بنفس حجم الدفعة عبر TPU، و multi-GPU، و single-GPU باستخدام Accelerate وتتوقع أن تتطابق نتائجك.

لكن لماذا؟

هناك ثلاثة أسباب لهذا الأمر سيغطيها هذا الشرح:

  1. ضبط البذور المناسبة
  2. أحجام الدفعات المرصودة
  3. معدلات التعلم

ضبط البذرة

على الرغم من أن هذه المشكلة لم تظهر كثيرًا، تأكد من استخدام utils.set_seed() لضبط البذرة بالكامل في جميع الحالات الموزعة حتى تكون عملية التدريب قابلة للتكرار:

from accelerate.utils import set_seed

set_seed(42)

لماذا هذا مهم؟ في الخلفية، سيؤدي هذا إلى تعيين 5 إعدادات مختلفة للبذور:

    random.seed(seed)
    np.random.seed(seed)
    torch.manual_seed(seed)
    torch.cuda.manual_seed_all(seed) # or torch.xpu.manual_seed_all, etc
    # ^^ safe to call this function even if cuda is not available
    if is_torch_xla_available():
        xm.set_rng_state(seed)

الحالة العشوائية، حالة numpy، torch، حالة جهاز torch، وحالة cuda الخاصة بـ torch_xla إذا كانت وحدات TPU متاحة.

حجم الدفعة المرصود

عند التدريب باستخدام Accelerate، يكون حجم الدفعة (batch size) المُمرَّر إلى مُحمِّل البيانات هو حجم الدفعة لكل وحدة معالجة رسومية. وهذا يعني أن حجم دفعة 64 على وحدتي معالجة رسومية هو في الواقع حجم دفعة 128. ونتيجةً لذلك، عند الاختبار على وحدة معالجة رسومية واحدة، يجب مراعاة ذلك، وكذلك الأمر بالنسبة لوحدات TPU.

يمكن استخدام الجدول أدناه كمرجع سريع لتجربة أحجام دفعات مختلفة:

في هذا المثال، هناك وحدتا معالجة رسومية (GPU) لـ “Multi-GPU” ووحدة معالجة برمجية (TPU) تحتوي على 8 عمّال

حجم الدفعة على وحدة معالجة رسومات واحدةحجم الدفعة المكافئ متعدد وحدات معالجة الرسومياتحجم الدفعة المكافئ على TPU
25612832
1286416
64328
32164

معدلات التعلم

كما ورد في مصادر متعددة[1][2]، يجب أن يتم تحجيم معدل التعلم خطياً بناءً على عدد الأجهزة الموجودة. يُظهر المقطع أدناه كيفية القيام بذلك باستخدام Accelerate:

بما أن المستخدمين يمكنهم تحديد جدولة معدل التعلم الخاصة بهم، فإننا نترك للمستخدم حرية القرار بشأن ما إذا كان يرغب في توسيع معدل التعلم أم لا.

learning_rate = 1e-3
accelerator = Accelerator()
learning_rate *= accelerator.num_processes

optimizer = AdamW(params=model.parameters(), lr=learning_rate)

ستجد أيضاً أن accelerate سيقوم بخطوة معدل التعلم بناءً على عدد العمليات التي يتم التدريب عليها. وهذا بسبب حجم الدفعة المرصود المذكور سابقاً. لذا في حالة وجود وحدتي GPU، سيتم تنفيذ خطوة معدل التعلم مرتين أكثر من وحدة GPU واحدة لمراعاة أن حجم الدفعة أكبر مرتين (إذا لم يتم إجراء أي تغييرات على حجم الدفعة في حالة وحدة GPU الواحدة).

تراكم التدرجات والدقة المختلطة

عند استخدام تراكم التدرجات والدقة المختلطة، بسبب طريقة عمل متوسط التدرجات (التراكم) وفقدان الدقة (الدقة المختلطة)، يُتوقع حدوث بعض التدهور في الأداء. وسيُلاحظ ذلك صراحةً عند مقارنة الخسارة على مستوى الدفعة بين إعدادات الحوسبة المختلفة. ومع ذلك، يجب أن تكون الخسارة الإجمالية، والمقياس، والأداء العام في نهاية التدريب مماثلةً تقريبًا.

Update on GitHub