Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Jax'ın bellek yeniden kullanım sisteminin nasıl çalıştığını açıklayabilir misiniz?


Jax'ın bellek yeniden kullanım sisteminin nasıl çalıştığını açıklayabilir misiniz?


JAX'in bellek yeniden kullanım sistemi, özellikle GPU'lar ve TPU'lar gibi hızlandırıcı cihazlarda büyük ölçekli hesaplamalarla çalışırken bellek tahsisini optimize etmek ve gereksiz bellek tahsislerini azaltmak için tasarlanmıştır. İşte böyle çalışıyor:

1. Diziyi izleme Yaşamları: JAX, belleğin ne zaman güvenli bir şekilde yeniden kullanılabileceğini belirlemek için dizilerin ömrünü izler. Bu, bir diziye artık ihtiyaç duyulmadığında, belleğinin diğer işlemler için yeniden kullanılabileceği anlamına gelir.

2. Bellek Yeniden Kullanım Mekanizması: Hesaplamalar yaparken JAX, bellek bloklarını artık gerekli olmayan ara dizilerden yeniden kullanmaya çalışır. Örneğin, bir hesaplamada bir ara dizi kullanılır ve sonra atılırsa, JAX sonraki işlemler için belleğini yeniden kullanmaya çalışacaktır. Bu, tekrarlanan hesaplamalar sırasında bellek tahsislerini en aza indirmeye yardımcı olduğu için işlevleri derlemek için `` Jax.jit '' kullanılırken özellikle etkilidir.

3. Tampon Bağışı: JAX'ta bellek yeniden kullanımının bir başka yönü tampon bağıştır. Bu, belirli giriş tamponlarının şekil ve tipte eşleşirse çıkış değerlerini tutmak için yeniden kullanılabileceğini belirtir. Bu, `jax.pmap` veya` jax.jit` gibi işlevlerde `Donate_Argnums'un parametresi kullanılarak elde edilir. Tamponlar bağışlayarak JAX, çıkışlar için yeni bellek tahsis etmekten kaçınabilir, böylece genel bellek kullanımını azaltabilir.

4. Cihaz Bellek Tahsisi: JAX, ana bilgisayar RAM'ından ziyade hedef cihaza (örn., GPU veya TPU) bellek tahsis eder. Bu tahsis stratejisi, özellikle operasyonlar için belleğin önceden oluşturulması sırasında bellek parçalanmasını en aza indirmek ve tahsis ek yükünü azaltmak için optimize edilmiştir.

Genel olarak, JAX'in bellek yeniden kullanım sistemi, gereksiz bellek tahsislerini en aza indirerek ve büyük ölçekli hesaplamalar için çok önemli olan cihaz belleğinin verimli kullanımını sağlayarak performansın optimize edilmesine yardımcı olur.

Alıntılar:
[1] https://app.studyraid.com/en/read/11969/381958/memory-manemation-best-practices
[2] https://docs.jax.dev/en/latest/faq.html
[3] https://stackoverflow.com/questions/74628777/why-does-gpu-memory-ncrease-when-recreating-and-seassigning-a-jax-bumpy-array-t-n
[4] https://github.com/google/jax/discussions/8056
[5] https://docs.jax.dev/en/latest/device_memory_profiling.html
[6] https://news.ycombinator.com/item?id=29128998
[7] https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html
[8] https://www.kaggle.com/code/goktugguvercin/automatic-ifferentiation-in-jax