Jaxov sistem za ponovno uporabo pomnilnika je zasnovan za optimizacijo dodelitve pomnilnika in zmanjšanje nepotrebnih dodelitev pomnilnika, zlasti pri delu z obsežnimi izračuni na napravah za pospeševanje, kot sta GPU in TPUS. Evo, kako deluje:
1. sledenje življenjskim časom: Jax sledi življenjskim nizom, da ugotovi, kdaj je mogoče pomnilnik varno ponovno uporabiti. To pomeni, da ko matrika ni več potrebna, lahko njegov pomnilnik ponovno uporabite za druge operacije.
2. Mehanizem ponovne uporabe pomnilnika: Jax pri izvajanju izračunov poskuša ponovno uporabiti pomnilniške bloke iz vmesnih nizov, ki niso več potrebni. Na primer, če se vmesni niz uporabi pri izračunu in nato zavržen, bo Jax poskušal ponovno uporabiti svoj pomnilnik za nadaljnje operacije. To je še posebej učinkovito pri uporabi `jax.jit" za sestavljanje funkcij, saj pomaga zmanjšati dodelitve pomnilnika med večkratnimi izračuni.
3. Donacija medpomnilnika: Drugi vidik ponovne uporabe pomnilnika v Jaxu je darovanje medpomnilnika. To vključuje določitev, da je mogoče nekatere vhodne medpomnilnike ponovno uporabiti, da zadržijo izhodne vrednosti, če se ujemajo po obliki in vrsti. To dosežemo s parametrom `donate_argnums" v funkcijah, kot sta "jax.pmap" ali `jax.jit`. Z darovanjem medpomnilnikov se lahko Jax izogne dodeljevanju novega pomnilnika za izhode in tako zmanjša skupno porabo pomnilnika.
4. Dodelitev pomnilnika naprave: Jax dodeli pomnilnik na ciljni napravi (npr. GPU ali TPU) in ne na gostiteljski RAM. Ta strategija dodelitve je optimizirana za zmanjšanje razdrobljenosti pomnilnika in zmanjšanje režijskih stroškov, še posebej pri predhodni pomnilniku za operacije.
Na splošno Jaxov sistem za ponovno uporabo pomnilnika pomaga pri optimizaciji zmogljivosti z zmanjšanjem nepotrebnih dodelitev pomnilnika in zagotavljanjem učinkovite uporabe pomnilnika naprave, kar je ključnega pomena za obsežne izračune.
Navedbe:[1] https://app.studyraid.com/sl/read/11969/381958/memory-management-best-practices
[2] https://docs.jax.dev/sl/latest/faq.html
[3] https://stackoverflow.com/questions/74628777/why-does-gpu-memory-increase-when-recreating-and-reassigning-a-a-jax-numpy-array-t
[4] https://github.com/google/jax/discussions/8056
[5] https://docs.jax.dev/sl/latest/device_memory_profiling.html
[6] https://news.ycombinator.com/item?id=29128998
[7] https://jax.readthedocs.io/sl/latest/gpu_memory_allocation.html
[8] https://www.kaggle.com/code/goktugguvercin/automatic-differenciatiation-in-jax