Transformers documentation

التحقق من النقاط

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

and get access to the augmented documentation experience

to get started

التحقق من النقاط

عادةً ما يخزّن التمرير الأمامي جميع التفعيلات الوسيطة مؤقتًا لإعادة استخدامها في التمرير الخلفي. ومع ذلك، تتناسب التفعيلات مع حجم الدفعة وطول التسلسل. لا يحفظ تدرّج نقطة التفتيش سوى تفعيلات معينة ويتخلص من الباقي. وهذا يجبر التمرير الخلفي على إعادة حساب بعض التفعيلات على الفور عند الحاجة إليها.

Normal training:
  Forward:   [L1]→[L2]→[L3]→[L4]   (save ALL activations)
  Backward:  ←uses cached activations everywhere

Gradient checkpointing:
  Forward:   [L1]→[L2]→[L3]→[L4]   (save only at checkpoints, discard the rest)
  Backward:  ←reaches L2, recomputes L2→L3 from scratch, uses it, discards it

يكون التدريب عادةً أبطأ لأن مسار الرجوع يعيد حساب التفعيلات المُتخلَّ عنها، لكن الفحص النقطة يقلل من ذاكرة التفعيلات.

اضبط gradient_checkpointing=True لتفعيله.

استخدمه مع تراكم التدرجات لتقليل استهلاك الذاكرة بشكل أكبر.

from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    gradient_checkpointing=True,
)

التحقق الجزئي

يعيد فحص التدرّج الكامل (Full gradient checkpointing) حساب كل طبقة قابلة للفحص. إذا كان لديك مساحة ذاكرة متاحة في تشغيلك، فقم بفحص عدد أقل من الطبقات لتبادل بعض توفير الذاكرة مقابل السرعة.

مرّر every_n_layers إلى gradient_checkpointing_enable() لاختيار فترة إنشاء نقاط التفتيش.

every_n_layers=2

Forward:   input  -> [L1] -> [L2] -> [L3] -> [L4] -> [L5] -> [L6]
                      CP     keep     CP     keep     CP     keep

Backward:  output <- [L6] <- [L5] <- [L4] <- [L3] <- [L2] <- [L1]
                     keep   rerun    keep   rerun    keep   rerun

مع every_n_layers=2، يتم إنشاء نقاط تفتيش للطبقة الأولى ولكل طبقة ثانية تليها. تتخلّى طبقات نقاط التفتيش عن تنشيطاتها أثناء المرور الأمامي وتعيد حسابها أثناء المرور الخلفي، بينما تحتفظ الطبقات الأخرى بتنشيطاتها في الذاكرة.

model.gradient_checkpointing_enable(every_n_layers=2)

القيمة الافتراضية، every_n_layers=1، تُنشئ نقاط تفتيش لكل طبقة. القيم الأكبر تنشئ نقطة تفتيش للطبقة الأولى ثم نقطة تفتيش لكل n طبقات بعدها، مع إبقاء تفعيلات الطبقات الأخرى في الذاكرة. على سبيل المثال، every_n_layers=2 تنشئ نقاط تفتيش للطبقات 1، 3، 5، وما إلى ذلك. تُحتسب فقط الوحدات التي ترث من GradientCheckpointingLayer. تبقى الوحدات الأخرى التي تدعم نقطة تفتيش التدرجات مفعّلة.

للاستخدام الجزئي لنقطة التفتيش للتدرج مع Trainer، اضبط every_n_layers في gradient_checkpointing_kwargs.

from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={"every_n_layers": 4},
)

تفريغ التفعيلات المحفوظة

يحافظ Gradient checkpointing على تنشيط واحد لكل طبقة مُتحقَّق منها على وحدة معالجة الرسوميات. عند أطوال التسلسلات الطويلة، قد يستهلك ذلك ذاكرة كبيرة (تقريبًا layers x sequence x hidden x bytes_per_element). اضبط offload للاحتفاظ بتلك التنشيطات في ذاكرة المضيف المثبّتة بدلاً من ذلك، على حساب نسخ من الجهاز إلى المضيف أثناء المرور الأمامي ونسخ من المضيف إلى الجهاز أثناء المرور الخلفي.

from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    gradient_checkpointing=True,
    gradient_checkpointing_kwargs={"offload": True},
)

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

الخطوات التالية

  • اقرأ وثيقة استخدام ذاكرة وحدة معالجة الرسوميات لفهم ما الذي يدفع إلى استخدام الذاكرة على وحدة معالجة الرسوميات أثناء التدريب.
  • اطّلع على دليل التدريب بدقة مختلطة لمعرفة كيفية استخدام أنواع بيانات بدقة أقل لتقليل الذاكرة بشكل أكبر وتسريع التدريب.
  • اطّلع على دليل Kernels لمعرفة كيفية تسريع التدريب باستخدام نواة مدمجة مخصصة.
Update on GitHub