Systém opätovného použitia pamäte spoločnosti JAX je navrhnutý tak, aby optimalizoval pridelenie pamäte a znížil zbytočné alokácie pamäte, najmä pri práci s rozsiahlymi výpočtami na zariadeniach akcelerátora, ako sú GPU a TPU. Takto to funguje:
1. Sledovanie poľa LifeMess: Jax sleduje životnosti polí, aby sa určilo, kedy je možné pamäť bezpečne znovu použiť. To znamená, že akonáhle už nie je potrebné pole, jeho pamäť sa môže znovu použiť na iné operácie.
2. Mechanizmus opätovného použitia pamäte: Pri výpočtoch sa JAX pokúša znovu použiť pamäťové bloky zo stredných polí, ktoré už nie sú potrebné. Napríklad, ak sa stredné pole použije pri výpočte a potom sa vyradí, Jax sa pokúsi znova použiť svoju pamäť na ďalšie operácie. Toto je obzvlášť efektívne pri použití `jax.jit` na kompiláciu funkcií, pretože pomáha minimalizovať pridelenie pamäte počas opakovaných výpočtov.
3. Darovanie vyrovnávacej pamäte: Ďalším aspektom opätovného použitia pamäte v Jax je dar vyrovnávacej pamäte. Zahŕňa to špecifikovanie, že určité vstupné vyrovnávacie pamäte sa dajú znovu použiť na zadržiavanie výstupných hodnôt, ak sa zhodujú s tvarom a typom. Toto sa dosiahne pomocou parametra `darte_argnums` vo funkciách ako` jax.pmap` alebo `jax.jit`. Darovaním vyrovnávacích pamätí sa JAX môže vyhnúť prideľovaniu novej pamäte na výstupy, čím sa zníži celkové využitie pamäte.
4. Prideľovanie pamäte zariadenia: Jax prideľuje pamäť na cieľovom zariadení (napr. GPU alebo TPU), a nie na RAM hostiteľa. Táto stratégia prideľovania je optimalizovaná tak, aby minimalizovala fragmentáciu pamäte a znížila režijné náklady na pridelenie, najmä pri predvídaní pamäte na operácie.
Celkovo pomáha systém opätovného použitia pamäte spoločnosti JAX pri optimalizácii výkonu minimalizáciou nepotrebných prideľovaní pamäte a zabezpečením efektívneho používania pamäte zariadenia, čo je rozhodujúce pre rozsiahle výpočty.
Citácie:[1] https://app.studyraid.com/en/read/11969/381958/memory-management-best-practices
[2] https://docs.jax.dev/en/latest/faq.html
[3] https://stackoverflow.com/questions/74628777/why-does-gpu-memory-increase-wen-reating-and-reassigning-a-Jax-numpy-array-t
[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-differentiation-in-jax