Jax'ın `jax.checkpoint` (` jax.remat` olarak da bilinir) aracılığıyla uygulanan gradyan kontrolü, otomatik farklılaşmanın ileri geçişi sırasında hangi ara değerlerin depolandığını kontrol ederek bellek kullanımının yönetilmesine yardımcı olur. Varsayılan olarak, JAX geri geçiş sırasında bunları yeniden kullanmak için tüm ara değerleri (artıklar) depolar, bu da özellikle bellek erişiminin pahalı olduğu donanım hızlandırıcılarında yüksek bellek maliyetlerine yol açabilir [1] [3].
Gradient Checking Mekanizması:
1. Yenidenlaştırma Stratejisi: Tüm ara maddeleri depolamak yerine, `Jax.Checkpoint` bazı ara maddelerin geri geçiş sırasında yeniden hesaplanmasına (yeniden oluşturulmasına) izin verir. Bu yaklaşım bellek kullanımını azaltır, ancak hesaplama süresini arttırır [1] [3].
2. Bellek Azaltma: Kontrol etme, geri çekilme sırasında bellek ihtiyacını tamamen ortadan kaldırmasa da (gradyanlar hala ara değerler için bellek gerektirdiğinden), belirli ara maddelerin depolanmasından kaçınarak tepe bellek kullanımını azaltabilir [8]. Ancak, gerçek bellek tasarrufu, hesaplama grafiğinde kontrolün nasıl uygulandığına bağlıdır.
3. Bellek parçalanmasını azaltma: `` jax.checkpoint '', bellek parçalanmasını doğrudan ele almak yerine en yüksek bellek kullanımını azaltmayı hedeflemesine rağmen, kontrolün verimli kullanımı bellek tahsisi kalıplarını yönetmeye yardımcı olabilir. Ara ürünler depolandığında ve yeniden hesaplandığında kontrol ederek, genel bellek ayak izini azaltarak ve sık sık tahsis ve dağıtma ihtiyacını potansiyel olarak en aza indirerek dolaylı olarak parçalanmayı azaltabilir [7].
Özetle, JAX'in gradyan kontrolü öncelikle ara maddeleri yeniden tasarlayarak pik bellek kullanımını azaltmayı amaçlarken, dolaylı olarak bellek tahsisi kalıplarını optimize ederek parçalanmayı azaltmaya yardımcı olan daha iyi bellek yönetimi uygulamalarına katkıda bulunabilir. Bununla birlikte, bellek parçalanmasının doğrudan azaltılması, toplu işleme ve izleme bellek kullanımı gibi diğer stratejilerle daha etkili bir şekilde elde edilir [7].
Alıntılar:[1] https://docs.jax.dev/en/latest/gradient-checkpointing.html
[2] https://discuss.pytorch.org/t/gradient-checkpoint-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/gradentient-checkpoint-does-not-reduce-lusage/71421
[7] https://app.studyraid.com/en/read/11969/381958/memory-manemation-best-practices
[8] https://github.com/google/jax/issues/19822