Gradient Checkpointing
تعرّف على كيفية تقليل نقاط التحقق للتدرجات لذاكرة GPU عبر إعادة حساب التنشيطات أثناء الانتشار العكسي، مع أمثلة PyTorch والمفاضلات وإرشادات التدريب العملية.
تقنية نقاط التحقق للتدرجات هي أسلوب تدريبي لتوفير الذاكرة، لا يحتفظ إلا بتفعيلات وسيطة محددة من التمرير الأمامي ويعيد حساب التفعيلات الأخرى أثناء الانتشار العكسي. وتُسمى أيضًا نقاط التحقق للتفعيلات، وهي تستبدل جزءًا من الحساب الإضافي بخفض استخدام الذاكرة الأقصى. وعلى الرغم من اسمها، فإن هذه التقنية تنشئ نقاط تحقق للتفعيلات لا لتدرجات المعلمات أو ملفات النموذج، ما يجعلها قيّمة خصوصًا عندما تحول موترات التفعيلات دون احتواء الشبكة العصبية في ذاكرة GPU المتاحة.
آلية عمل نقاط التحقق للتدرجات#
أثناء التمرير الأمامي القياسي، تحسب الشبكة العصبية موترات وسيطة تُسمى التفعيلات. ويحتفظ نظام التفاضل التلقائي بالتفعيلات اللازمة لحساب التدرجات لاحقًا، كما هو موضح في آليات autograd في 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(). وينبغي للمشروعات الفعلية مقارنة عمليات التشغيل باستخدام نقاط التحقق ومن دونها، بمقياس مثل الحد الأقصى لذاكرة GPU المخصّصة في PyTorch.
تطبيقات عملية#
-
الرؤية الحاسوبية عالية الدقة: قد يتطلب تدريب التجزئة الطبية واكتشاف الأهداف الجوية والفحص الصناعي استخدام صور كبيرة تستهلك خرائط سماتها ذاكرة تفوق ما تستهلكه أوزان النموذج. ويمكن لنقاط التحقق الموضوعة في مراحل مختارة من الشبكة الأساسية الحفاظ على دقة الصور أو إتاحة عينات إضافية لكل دفعة، بدلًا من خفض دقة المدخلات بشدة.
-
تدريب Transformer على تسلسلات طويلة: يزداد تخزين التفعيلات بسرعة مع زيادة طول التسلسل وعدد الطبقات. ويمكن لإعادة حساب كتل Transformer أن تتيح معالجة سياقات أطول أو دفعات صغيرة أكبر على المسرّع نفسه. ويوضح دليل NVIDIA لإعادة حساب التفعيلات إعادة الحساب الكاملة والانتقائية لطبقات Transformer.
إرشادات عملية#
استخدم تقنية نقاط التحقق للتدرجات عندما يُظهر تحليل الأداء أن التفعيلات، لا المعلمات أو حالة المحسّن، هي المهيمنة على استهلاك الذاكرة. ابدأ بكتل كبيرة متكررة، وقارن استهلاك الذاكرة الأقصى ووقت التكرار وسلوك التحقق قبل توسيع نطاق استخدامها.
في إعدادات التدريب الموثّقة لـ Ultralytics YOLO، تشمل عناصر التحكم الأولية بالذاكرة الدقة المختلطة التلقائية وحجم الصورة والحجم الفعلي للدفعة. ويشرح مرجع Ultralytics AutoBatch الاختيار التلقائي لحجم الدفعة استنادًا إلى ذاكرة GPU المتاحة. وعندما لا تكفي الأجهزة المحلية، توفر خدمة التدريب السحابي في منصة Ultralytics وحدات GPU سحابية قابلة للتهيئة لعمليات التدريب المُدارة. ويمكن أن تكمل تقنية نقاط التحقق للتدرجات عناصر التحكم هذه عندما تتطلب بنية PyTorch مخصصة إدارة أدق لذاكرة التفعيلات.









