تقنية

إعادة حساب التفعيلات: ماذا نوفر وماذا نكرر؟

مساران في ورقة حساب يلتقيان في مشتقة 84: حفظ القيمة الوسيطة 7 أو إعادة إنتاجها من المدخل 2 مع القاعدة الثابتة
مخطط من إعداد بحر العلوم؛ يشرح اختيارًا حسابيًا، لا مخازن تنفيذ أو قياس ذاكرة.

إعادة حساب التفعيلات تستبدل حفظ بعض القيم الوسيطة بإنتاجها مجددًا عند الحاجة أثناء الحساب الخلفي. توثق PyTorch هذا التبادل بين عمل حسابي إضافي وذاكرة التفعيلات. [1]

الخلاصة السريعة

حدد القيم المحفوظة والقيم المعاد إنتاجها، وتحقق أن إعادة الحساب توافق المرور الأصلي؛ هذه نقطة حساب داخل التدريب، وليست ملف أوزان محفوظًا لاستئناف لاحق.

  • توثق الواجهة عدم حفظ تفعيلات داخل جزء مختار وإعادة إنتاج ما يلزم في المرور الخلفي، مع الاحتفاظ بمدخلات الجزء؛ لا تحذف كل ذاكرة التدريب. [1]
  • في ورقتنا اليدوية: a = 3x + 1، ثم y = 2a²؛ عند x = 2، تكون a = 7 وy = 98 ومشتقة y بالنسبة إلى x تساوي 84.
  • يمكن لورقتنا الاحتفاظ بالقيمة 7، أو حفظ المدخل 2 وإعادة حساب 7 عند طلب المشتقة؛ التطابق هنا مشروط بثبات القاعدة والبيانات، وليس تجربة autograd.
  • تحذر الوثائق من اختلاف الدالة أثناء إعادة الحساب، بما قد يسبب خطأ أو تدرجات غير صحيحة؛ في مثالنا تغيير المعامل إلى 4 يعيد a = 9 ويغير السؤال. [1]

أي ذاكرة نقصد في هذا الاختيار؟

التوثيق يصف حفظ مدخلات الجزء مع عدم حفظ بعض تفعيلاته المنتجة، ثم إعادة الحساب حسب الحاجة في المرور الخلفي؛ التوفير يأتي مقابل تكرار حساب. [1]

لا نحول كلمة checkpoint هنا إلى أرشيف نموذج على قرص. السؤال هو أي قيم مؤقتة يبقيها مسار الحساب، وأي جزء يعيد تنفيذه عند طلب المشتقة. أما ملف للاستئناف فيحتاج إلى وصف حالة مختلفة، مثل الأوزان وحالة المحسن.

وليس معنى عدم حفظ تفعيل داخل جزء أن كل الذاكرة اختفت. في ورقة مثالنا يبقى المدخل وتعريف القاعدة. وعند وصف تنفيذ حقيقي لا بد من تحديد ما يدخل قياس الذاكرة؛ لا نقسم رقمًا مجهولًا إلى نصفين لمجرد اختيار جزء واحد.

ورقة حساب يمكن مراجعة مشتقتها

نختار x عددًا واحدًا. ننتج a بضرب x في 3 ثم إضافة 1، ونعرف الخرج y بأنه ضعف مربع a. عند x = 2 تصبح a = 7، ومربعها 49، ثم y = 98. جميع المعاملات من اختيارنا.

مشتقة y بالنسبة إلى a هي 4a، ومشتقة a بالنسبة إلى x هي 3. لذلك مشتقة الخرج بالنسبة إلى المدخل هي 12a، وتساوي 84 عند القيمة المعلنة. نحن نشتق خرجًا، لا خسارة لم نعرفها.

يمكننا كتابة a = 7 بجانب الورقة لنستعملها لاحقًا. لا نزعم أن هذا رسم مخازن PyTorch الفعلية أو قائمة كاملة بالقيم التي تحفظها مكتبة؛ هو حساب مستقل يعزل الحاجة إلى قيمة وسيطة.

ما الذي يعاد إنتاجه عند الطلب؟

في خطة ثانية لورقتنا، نبقي x = 2 وتعريف a، ولا نكتب قيمة a في قائمة القيم المحفوظة. عندما نحتاجها للمشتقة، نعيد 3 × 2 + 1، فنحصل على 7 ثم المشتقة 84 نفسها.

وفرت الخطة الثانية حفظ قيمة a في تلك القائمة، وأضافت إنتاجها مرة أخرى. لم ننتج مدخلًا جديدًا ولم ندرب معاملات. تطابق القيم يخص دالة ثابتة بلا اختيار عشوائي في مثالنا، ولا يكفي لإثبات التطابق لكل تنفيذ ذي حالة متغيرة.

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

ماذا لو تغيرت القاعدة بين المرورين؟

تنبه الواجهة إلى أن اختلاف استدعاء الدالة أثناء إعادة الحساب عن المرور الأصلي قد يسبب خطأ أو تدرجات غير صحيحة. [1]

إذا بدلنا معامل 3 إلى 4 قبل إعادة ورقتنا، ينتج المدخل 2 قيمة a = 9. تصبح القاعدة الجديدة y = 2(4x + 1)²، وخرجها 162 ومشتقتها 144 عند x = 2. ليست 144 مشتقة القاعدة الأصلية ذات الخرج 98؛ لقد عرفنا دالة أخرى.

راجع المدخلات والمعاملات وأي حالة تؤثر في الجزء المعاد حسابه. مثالنا يوضح لماذا يلزم حفظ معنى الدالة، ولا يختبر خيارات حفظ الحالة العشوائية أو سلوك واجهة بعينها. لم نشغل تفاضلًا تلقائيًا أو نثبت توفيرًا محددًا للذاكرة.

المصادر ومتابعة القراءة

  1. PyTorch 2.14: activation checkpoint (يفتح في نافذة جديدة)docs.pytorch.org

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.