تساعد تحديد التدرج من Jax ، الذي تم تنفيذه من خلال `jax.checkpoint` (المعروف أيضًا باسم` jax.remat`) ، في إدارة استخدام الذاكرة عن طريق التحكم في القيم المتوسطة التي يتم تخزينها أثناء التمريرة الأمامية للتمايز التلقائي. بشكل افتراضي ، تقوم Jax بتخزين جميع القيم الوسيطة (البقايا) لإعادة استخدامها أثناء المرور الخلفي ، مما قد يؤدي إلى ارتفاع تكاليف الذاكرة ، وخاصة على مسرعات الأجهزة حيث يكون الوصول إلى الذاكرة مكلفًا [1] [3].
آلية checkpointing التدرج:
1. استراتيجية Remingerialization: بدلاً من تخزين جميع الوسطيات ، يتيح `jax.checkpoint` إعادة حساب بعض الوسطيات (المعدلة) أثناء الممر الخلفي. هذا النهج يقلل من استخدام الذاكرة ولكنه يزيد من وقت الحساب [1] [3].
2. تقليل الذاكرة: في حين أن تحديد مُحسِّن لا يلغي الحاجة إلى الذاكرة أثناء التراجع بالكامل (حيث لا تزال التدرجات تتطلب ذاكرة للقيم المتوسطة) ، فإنها يمكن أن تقلل من استخدام ذاكرة الذروة عن طريق تجنب تخزين بعض الوسائط [8]. ومع ذلك ، تعتمد مدخرات الذاكرة الفعلية على كيفية تطبيق تحديد المخابرات داخل الرسم البياني للحساب.
3. تقليل تجزئة الذاكرة: على الرغم من أن `jax.checkpoint` يستهدف في المقام الأول تقليل استخدام ذاكرة الذروة بدلاً من معالجة تجزئة الذاكرة بشكل مباشر ، إلا أن الاستخدام الفعال ل checkpointing يمكن أن يساعد في إدارة أنماط تخصيص الذاكرة. من خلال التحكم عند تخزين الوسطيات وإعادة حسابها ، يمكن أن تخفف بشكل غير مباشر من التفتت عن طريق تقليل بصمة الذاكرة الإجمالية وربما تقليل الحاجة إلى التخصيصات المتكررة والمعدات [7].
باختصار ، في حين أن تحديد التدرج في Jax يهدف في المقام الأول إلى تقليل استخدام ذاكرة الذروة عن طريق تحديد الوسطيات ، فإنه يمكن أن يساهم بشكل غير مباشر في ممارسات إدارة الذاكرة بشكل غير مباشر والتي تساعد على تخفيف التفتت عن طريق تحسين أنماط تخصيص الذاكرة. ومع ذلك ، يتم تحقيق التخفيض المباشر لتفتيت الذاكرة بشكل أكثر فعالية من خلال استراتيجيات أخرى مثل عمليات التجميع ومراقبة استخدام الذاكرة [7].
الاستشهادات:[1] https://docs.jax.dev/en/latest/gradient-checkpointing.html
[2] https://discuss.pytorch.org/t/gradient-checkpointing-and-its-effect-on-memory-and-runtime/198437
[3] https://docs.jax.dev/en/latest/_autosummary/jax.checkpoint.html
[4] https://github.com/google/jax/discussions/20252
[5] https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html
[6] https://discuss.pytorch.org/t/gradient-checkpointing-does-not-reduce-memory-usage/71421
[7] https://app.studyraid.com/en/read/11969/381958/memory-management-best-practices
[8] https://github.com/google/jax/issues/19822