Gradient Checkpointing
تعرف على كيفية تقليل حفظ التدريج (gradient checkpointing) لذاكرة وحدة معالجة الرسوميات (GPU) عن طريق إعادة حساب التنشيطات أثناء الانتشار العكسي، مع أمثلة باستخدام PyTorch، والمقايضات، وإرشادات التدريب العملية.
التحقق من التدرج هو تقنية تدريب موفرة للذاكرة تقوم بتخزين التنشيطات الوسيطة المحددة فقط من تمريرة الأمام وتُعيد حساب البقية أثناء الانتشار العكسي. يُطلق عليه أيضًا اسم التحقق من التنشيط، وهو يبادل الحسابات الإضافية بانخفاض استهلاك الذاكرة القصوى. على الرغم من اسمه، فإن التقنية تقوم بالتحقق من التنشيطات بدلاً من تدرجات المعلمات أو ملفات النموذج، مما يجعلها ذات قيمة خاصة عندما تمنع موترات التنشيط الشبكة العصبية من ملاءمة ذاكرة وحدة معالجة الرسوميات المتاحة.
كيف يعمل التحقق من التدرج#
أثناء تمريرة الأمام القياسية، تحسب الشبكة العصبية موترات وسيطة تُسمى التنشيطات. يحافظ نظام التمييز التلقائي على التنشيطات اللازمة لحساب التدرجات لاحقًا، كما هو موضح في آليات التمايز التلقائي في PyTorch. يمكن الشبكات العميقّة، والدفعات الكبيرة، والصور عالية الدقة، وتسلسلات الإدخال الطويلة أن تجعل هذه الموترات المحفوظة تستهلك ذاكرة كبيرة.
يقسم التحقق من التدرج الشبكة إلى قطاعات:
- تقوم تمريرة الأمام بتخزين المدخلات أو تنشيطات الحدود للقطاعات المحددة.
- يتم التخلص من التنشيطات الوسيطة الأخرى داخل تلك القطاعات.
- أثناء تمريرة الخلف، يعمل كل قطاع تم التحقق منه للأمام مرة أخرى لإعادة بناء القيم المفقودة.
- تُستخدم التنشيطات المُعاد بناؤها على الفور لحساب التدرجات.
تعرض واجهة برمجة تطبيقات التحقق من التنشيط في PyTorch هذا السلوك من خلال torch.utils.checkpoint. تظهر مفاهيم مكافئة مثل التحقق من التدرج وإعادة المواد في JAX والتحقق من شريط TensorFlow.
يحدد موضع التحقق المقايضة. يؤدي التحقق من مناطق أكثر عمومًا إلى توفير المزيد من الذاكرة ولكنه يكرر المزيد من العمليات. يمكن أن يوفر الوضع الانتقائي حول الكتل الكثيفة التنشيط توازنًا أفضل من إعادة حساب الشبكة بأكملها.
المقايضات والتقنيات ذات الصلة#
يترك التحقق من التدرج عادة معلمات النموذج، والتدرجات، وحالات المُحسن دون تغيير. هدفها الأساسي هو ذاكرة التنشيط، ويصبح التدريب أبطأ لأن بعض حسابات الأمام تعمل مرتين. تعتمد النتيجة الدقيقة على البنية، وحدود التحقق، وشكل الدفعة، والأجهزة.
وهو يختلف عن عدة تقنيات ذات صلة:
- تعمل تراكم التدرج على معالجة دفعات صغيرة متعددة قبل تحديث أوزان النموذج، مما يخلق دفعة فعالة أكبر دون تحميل كل عينة في نفس الوقت. بدلاً من ذلك، يقلل التحقق من التدرج التنشيطات المحتفظ بها لكل دفعة صغيرة.
- تستخدم الدقة المختلطة أنواع بيانات ذات دقة أقل للعمليات المحددة. يمكن لـ سير عمل الدقة المختلطة التلقائية في PyTorch تقليل الذاكرة وتسريع العمليات المتوافقة، بينما يضيف التحقق عن عمد حسابات.
- يؤدي تقليل حجم الدفعة إلى خفض الذاكرة عن طريق معالجة عدد أقل من العينات معًا. قد يسمح التحقق بأن يظل حجم الدفعة الأكبر أو دقة الإدخال قابلة للتطبيق.
- تحفظ تحققات التدريب الأوزان وحالة المُحسن للاسترداد أو الاستدلال لاحقًا. يصف دليل التحقق من نموذج PyTorch آلية الثبات هذه، والتي لا علاقة لها بإعادة حساب التنشيط.
يجب أن يكون الكود الذي تم التحقق منه متسقًا وظيفيًا بين تنفيذاته الأصلية والمعادة حسابها للأمام. قد تتسبب الحالة المتغيرة، أو عمليات نقل الأجهزة، أو العشوائية غير المتحكم فيها داخل المنطقة التي تم التحقق منها في حدوث أخطاء أو تدرجات غير صحيحة. في المحولات من نوع فك التشفير، قد يحتاج ذاكرة التخزين المؤقت للمفتاح والقيمة أيضًا إلى التعطيل أثناء التدريب الذي تم التحقق منه لأن حالة الاستدلال المخزنة مؤقتًا يمكن أن تتعارض مع إعادة بناء رسم الأمام.
مثال PyTorch#
يقوم المثال التالي بالتحقق من كتلة كثيفة الذاكرة أثناء خطوة تدريب واحدة:
import torch
from torch import nn
from torch.utils.checkpoint import checkpoint
torch.manual_seed(0)
block = nn.Sequential(
nn.Linear(1024, 4096),
nn.ReLU(),
nn.Linear(4096, 1024),
)
optimizer = torch.optim.AdamW(block.parameters())
inputs = torch.randn(8, 1024, requires_grad=True)
targets = torch.zeros_like(inputs)
optimizer.zero_grad(set_to_none=True)
outputs = checkpoint(block, inputs, use_reentrant=False)
loss = nn.functional.mse_loss(outputs, targets)
loss.backward()
optimizer.step()يتم الاحتفاظ بمدخلات الكتلة ومعلومات الحدود المطلوبة فقط؛ ويتم إعادة بناء تنشيطاتها الداخلية أثناء loss.backward(). يجب على المشاريع الحقيقية مقارنة التشغيلات بوجود التحقق وبدونه باستخدام قياس مثل الذاكرة القصوى المخصصة لوحدة معالجة الرسوميات في PyTorch.
تطبيقات العالم الحقيقي#
-
رؤية الكمبيوتر عالية الدقة: قد يتم التدريب على الصور الكبيرة التي تستهلك خرائط ميزاتها ذاكرة أكثر من أوزان النموذج في التجزئة الطبية، والكشف الجوي، والفحص الصناعي. يمكن للتحقق من مراحل العمود الفقري المحددة الحفاظ على دقة الصورة أو السماح بعينات إضافية لكل دفعة بدلاً من تقليل دقة المدخلات بقوة.
-
تدريب محول التسلسل الطويل: ينمو تخزين التنشيط بسرعة مع زيادة طول التسلسل وعدد الطبقات. يمكن لإعادة حساب كتل المحول أن تجعل السياقات الأطول أو الدفعات الصغيرة الأكبر تتلاءم مع نفس المُعجِّل. يوضح دليل إعادة حساب التنشيط من NVIDIA إعادة الحساب الكاملة والانتقائية لطبقات المحول.
إرشادات عملية#
استخدم التحقق من التدرج عندما يُظهر التحليل أن التنشيطات، وليست المعلمات أو حالة المُحسن، هي التي تسيطر على الذاكرة. ابدأ بكتل كبيرة متكررة وقم بقياس الذاكرة القصوى، ووقت التكرار، وسلوك التحقق قبل توسيع التغطية.
بالنسبة لـ تكوينات تدريب Ultralytics YOLO المُوثقة، تشمل ضوابط الذاكرة للخط الأول الدقة المختلطة التلقائية، وحجم الصورة، وحجم الدفعة الفعلية. يشرح مرجع Ultralytics AutoBatch تحديد الدفعة التلقائي استنادًا إلى ذاكرة وحدة معالجة الرسوميات المتاحة. عندما تظل الأجهزة المحلية غير كافية، توفر تدريب السحابة لمنصة Ultralytics وحدات معالجة رسوميات سحابة قابلة للتكوين لتشغيلات التدريب المُدارة. يمكن للتحقق من التدرج أن يكمل هذه الضوابط عندما تتطلب بنية PyTorch المخصصة إدارة أفضل لذاكرة التنشيط.






