„Jax“ gradiento kontrolės taškas, įgyvendintas per „Jax.CheckPoint“ (dar žinomą kaip „Jax.remat“), padeda valdyti atminties naudojimą kontroliuodama, kurios tarpinės vertės yra saugomos automatinio diferenciacijos į priekį. Pagal numatytuosius nustatymus „Jax“ saugo visas tarpines vertes (likučius), kad pakartotinai jas panaudotų atgalinio leidimo metu, o tai gali sukelti dideles atminties sąnaudas, ypač aparatinės įrangos greitintuvams, kur prieiga prie atminties yra brangi [1] [3].
Gradiento patikrinimo mechanizmas:
1. Rematerializacijos strategija: Užuot saugoję visus tarpinius produktus, „Jax.CheckPoint“ leidžia kai kuriuos tarpinius produktus pakartotinai apskaičiuoti (rematerializuoti) atgalinio leidimo metu. Šis metodas sumažina atminties naudojimą, tačiau padidina skaičiavimo laiką [1] [3].
2. Atminties mažinimas: Nors patikrinimo taškas nepašalina atminties poreikio, kai visiškai atkuriant atgal (nes gradientams vis tiek reikia atminties tarpinėms vertėms), ji gali sumažinti maksimalios atminties sunaudojimą vengdama tam tikrų tarpinių produktų laikymo [8]. Tačiau faktinės atminties sutaupymas priklauso nuo to, kaip kontrolės taškas taikomas skaičiavimo grafike.
3. Atminties suskaidymo sumažinimas: nors „Jax.CheckPoint“ pirmiausia skirtas mažinti didžiausios atminties naudojimą, o ne tiesiogiai spręsti atminties suskaidymą, efektyvus kontrolės taškų naudojimas gali padėti valdyti atminties paskirstymo modelius. Kontroliuodamas, kai tarpiniai produktai yra kaupiami ir pakartotinai apskaičiuojami, jis gali netiesiogiai sušvelninti suskaidymą, sumažindama bendrą atminties pėdsaką ir galbūt sumažinti poreikį dažnai paskirstyti ir išspręsti [7].
Apibendrinant galima pasakyti, kad nors „Jax“ gradiento kontrolės taškas pirmiausia skirtas sumažinti maksimalios atminties sunaudojimą, atmintinant tarpinius produktus, jis gali netiesiogiai prisidėti prie geresnės atminties valdymo praktikos, padedančios sušvelninti suskaidymą, optimizuojant atminties paskirstymo modelius. Tačiau tiesioginis atminties suskaidymo sumažinimas efektyviau pasiekiamas naudojant kitas strategijas, tokias kaip paketo operacijos ir atminties naudojimo stebėjimas [7].
Citatos:[1] https://docs.jax.dev/en/latest/gradient-checkpointing.html
[2] https://discuss.pytorch.org/t/gradient-checkpointing-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/gradient-checkpointing-does-not-reduce-memory-usage/71421
[7] https://app.studyraid.com/en/read/11969/381958/memory-management-best-praktices
[8] https://github.com/google/jax/issues/19822