„Jax“ atminties pakartotinio naudojimo sistema yra skirta optimizuoti atminties paskirstymą ir sumažinti nereikalingą atminties paskirstymą, ypač dirbant su didelio masto skaičiavimais akceleratoriaus įrenginiuose, tokiuose kaip GPU ir TPU. Štai kaip tai veikia:
1. Stebėjimo masyvo gyvenimo laikas: Jax seka masyvų eksploatavimo laiką, kad nustatytų, kada atmintį galima saugiai panaudoti. Tai reiškia, kad kai masyvas nebereikia, jo atmintis gali būti pakartotinai panaudota kitoms operacijoms.
2. Atminties pakartotinio naudojimo mechanizmas: Atlikdamas skaičiavimus, Jax bando pakartotinai naudoti atminties blokus nuo tarpinių masyvų, kurių nebereikia. Pvz., Jei skaičiavime naudojamas tarpinis masyvas ir tada išmestas, Jax bandys pakartotinai panaudoti savo atmintį vėlesnėms operacijoms. Tai ypač efektyvu naudojant „jax.jit“ funkcijas, nes tai padeda sumažinti atminties paskirstymą pakartotinių skaičiavimų metu.
3. Buferio paaukojimas: Kitas atminties pakartotinio naudojimo „Jax“ aspektas yra buferio aukojimas. Tai reiškia, kad nurodoma, kad tam tikri įvesties buferiai gali būti pakartotinai naudojami norint išlaikyti išvesties vertes, jei jos atitiktų formą ir tipą. Tai pasiekiama naudojant „donate_argnums“ parametrą tokiose funkcijose kaip „Jax.pmap“ arba „jax.jit“. Paaukodamas buferius, Jax gali išvengti naujos atminties paskirstymo išėjimams, taip sumažindamas bendrą atminties naudojimą.
4. Įrenginio atminties paskirstymas: „Jax“ paskirsto atmintį tiksliniame įrenginyje (pvz., GPU arba TPU), o ne pagrindinio kompiuterio RAM. Ši paskirstymo strategija yra optimizuota siekiant sumažinti atminties suskaidymą ir sumažinti paskirstymo pridėtines išlaidas, ypač kai operacijų atmintis yra išankstinė.
Apskritai, „Jax“ atminties pakartotinio naudojimo sistema padeda optimizuoti našumą, sumažinant nereikalingą atminties paskirstymą ir užtikrinant efektyvų įrenginio atminties naudojimą, kuris yra labai svarbus didelio masto skaičiavimams.
Citatos:[1] https://app.studyraid.com/en/read/11969/381958/memory-management-best-praktices
[2] https://docs.jax.dev/en/latest/faq.html
[3] https://stackoverflow.com/questions/74628777/why-does-gpu-memory-increase-when recreating ir reassigning-a-ax-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