Transformers documentation
التحقق من النقاط
التحقق من النقاط
عادةً ما يخزّن التمرير الأمامي جميع التفعيلات الوسيطة مؤقتًا لإعادة استخدامها في التمرير الخلفي. ومع ذلك، تتناسب التفعيلات مع حجم الدفعة وطول التسلسل. لا يحفظ تدرّج نقطة التفتيش سوى تفعيلات معينة ويتخلص من الباقي. وهذا يجبر التمرير الخلفي على إعادة حساب بعض التفعيلات على الفور عند الحاجة إليها.
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 لمعرفة كيفية تسريع التدريب باستخدام نواة مدمجة مخصصة.