Gradient Accumulation
تعرّف على كيفية تمكين تراكم التدرجات لأحجام دفعات فعالة أكبر مع ذاكرة GPU محدودة، مع إرشادات عملية حول PyTorch وتدريب Ultralytics YOLO.
تراكم التدرجات هو أسلوب تدريب يضيف التدرجات من عدة دفعات صغيرة، تُسمى الدفعات المصغّرة، قبل إجراء تحديث واحد لأوزان النموذج. وهو يقرّب التدريب باستخدام حجم دفعة أكبر عندما لا تتسع ذاكرة GPU المتاحة للدفعة الكاملة دفعةً واحدة. وهذا يجعل الانحدار المتدرج كثيف استهلاك الذاكرة عمليًا من دون تغيير بنية النموذج أو تقليل دقة الإدخال.
كيفية عمل تراكم التدرجات#
أثناء التدريب العادي، تتبع كل دفعة ثلاث خطوات رئيسية: حساب الخسارة، واستخدام الانتشار العكسي لحساب التدرجات، والسماح للمُحسِّن بتحديث أوزان النموذج. ثم تُمسح التدرجات قبل الدفعة التالية.
يؤخر تراكم التدرجات تحديث المُحسِّن. تُجري كل دفعة مصغّرة تمريرة أمامية وخلفية، لكن تدرجاتها تبقى في الذاكرة وتُضاف إلى تدرجات الدفعات المصغّرة اللاحقة. وينشأ هذا السلوك طبيعيًا من عملية PyTorch الخلفية، التي تراكم القيم في حقل التدرج الخاص بكل مُعامِل.
بعد العدد المُهيّأ من خطوات التراكم:
- يُحدّث المُحسِّن أوزان النموذج.
- تُصفّر التدرجات باستخدام عملية مثل Optimizer.zero_grad.
- تبدأ نافذة تراكم جديدة.
يكون حجم الدفعة الفعّال:
microbatch size x accumulation steps x number of training devices
على سبيل المثال، تتصرف دفعة مصغّرة مكوّنة من 4 صور جرى تراكمها على مدى 8 خطوات تقريبًا مثل دفعة مكوّنة من 32 صورة على GPU واحدة. ومع أربع وحدات GPU، يصبح حجم الدفعة العالمي الفعّال 128.
التأثيرات في الذاكرة والسرعة والتعلّم#
يقلل تراكم التدرجات من ذروة الذاكرة المطلوبة للتنشيطات، لأن دفعة مصغّرة واحدة فقط تمر عبر الشبكة في كل مرة. لكنه لا يقلل بدرجة كبيرة الذاكرة المستخدمة لمعاملات النموذج أو التدرجات أو حالة المُحسِّن.
كما أنه لا يسرّع التدريب عادةً. فمعالجة ثماني دفعات مصغّرة لا تزال تتطلب ثماني تمريرات أمامية وخلفية، وقد تستخدم الدفعات الأصغر GPU بكفاءة أقل. وتتمثل الفائدة الرئيسية في استيعاب دفعة فعّالة مرغوبة ضمن ذاكرة محدودة. وقد تظهر فائدة ثانوية في التدريب الموزّع، حيث قد تتجنب عمليات التنفيذ مزامنة التدرجات حتى نهاية نافذة التراكم باستخدام ميزات مثل DistributedDataParallel no_sync.
يقسم التنفيذ اليدوي عادةً خسارة كل دفعة مصغّرة على عدد خطوات التراكم، بحيث يمثل التدرج الناتج متوسطًا بدلًا من مجموع. وقد تتولى أدوات التدريب عالية المستوى التطبيع تلقائيًا، لذا فإن تطبيق تحجيم إضافي قد ينتج عنه تحديثات غير صحيحة.
يمكن للتراكم أن يقرّب نتائج الدفعة الكبيرة الحقيقية، لكن النتائج لا تكون متطابقة دائمًا. إذ تُحسب إحصاءات تطبيع الدفعة من الدفعات المصغّرة الفردية، كما يمكن للعمليات العشوائية وترتيب العمليات بالفاصلة العائمة أن يتسببا في اختلافات أيضًا. ولذلك قد يتطلب معدل التعلّم التحقق منه بدلًا من تحجيمه تلقائيًا.
التقنيات ذات الصلة والاختلافات الرئيسية#
غالبًا ما يُخلط بين تراكم التدرجات وتقنيات أخرى للذاكرة أو الاستقرار:
- يقلل تدقيق التدرجات ذاكرة التنشيطات من خلال إعادة حساب عمليات مختارة من التمريرة الأمامية أثناء الانتشار العكسي. وتصف وثائق تدقيق التنشيطات في PyTorch هذه المفاضلة بين الحساب والذاكرة. أما التراكم فيقسم الدفعة الكبيرة إلى دفعات مصغّرة أصغر.
- يخزّن التدريب بدقة مختلطة عمليات مختارة أو يحسبها باستخدام أنواع بيانات أقل دقة. ويمكنه تقليل الذاكرة وتحسين معدل المعالجة، بينما يغيّر التراكم وتيرة تحديث المُحسِّن. ويمكن الجمع بين التقنيتين باتباع سير عمل تراكم الدقة المختلطة التلقائية الصحيح.
- يحدّ قصّ التدرجات من مقدار التدرج لتقليل عدم الاستقرار الناتج عن التحديثات الكبيرة بصورة غير معتادة. ولا ينشئ دفعة فعّالة أكبر. وعند دمجه مع التراكم، ينبغي إجراء القص عادةً بعد تراكم التدرج الكامل، باستخدام عملية مثل clip_grad_norm.
التطبيقات الواقعية#
في تجزئة الصور الطبية عالية الدقة، قد لا تتمكن وحدة GPU بسعة 12 GB من استيعاب أكثر من مسحين كبيرين في آن واحد. ويؤدي تراكم التدرجات عبر ثماني دفعات مصغّرة إلى إنتاج دفعة فعّالة مكوّنة من 16 مسحًا مع الحفاظ على الدقة اللازمة لتحديد البنى التشريحية الصغيرة. وتتمثل المفاضلة في إطالة الفاصل الزمني بين تحديثات المُحسِّن.
في اكتشاف الأجسام الجوية، قد يدرّب فريق هندسي نموذجًا عبر أربع وحدات GPU، مع ست صور لكل جهاز وأربع خطوات تراكم. وتكون الدفعة العالمية الفعّالة 96 صورة. ويمكن لذلك تثبيت التحديثات في المشاهد التي تحتوي على العديد من المركبات أو المباني الصغيرة، مع إبقاء كل جهاز ضمن حد الذاكرة الخاص به. ويمكن للفرق إدارة التجارب السحابية ومجموعات البيانات وعمليات التدريب من خلال التدريب السحابي في Ultralytics Platform.
تراكم التدرجات مع Ultralytics YOLO#
يستمد سير عمل تدريب النماذج في Ultralytics سلوك التراكم من إعدادَي batch الفعلي وnbs الاسميين. ومع batch=4 وnbs=64، يستهدف المُدرِّب دفعة اسمية مكوّنة من 64 عينة من خلال تأجيل تحديثات المُحسِّن عبر عدة دفعات مصغّرة.
from ultralytics import YOLO
# Load a pretrained YOLO26 detection model
model = YOLO("yolo26n.pt")
# Use a small physical batch and a larger nominal batch
results = model.train(
data="coco8.yaml",
epochs=10,
batch=4,
nbs=64,
)يدير المُدرِّب عالي المستوى الانتشار العكسي والتراكم وخطوات المُحسِّن ومسح التدرجات. وقد وُثّق سلوكه في مرجع Ultralytics BaseTrainer. عمليًا، اختر أكبر دفعة مصغّرة يمكن تشغيلها بصورة موثوقة، واحسب الدفعة الفعّالة المقصودة، وقارن نتائج التحقق عند تغيير خطوات التراكم أو معدل التعلّم أو عدد الأجهزة.









