JAX의 메모리 재사용 시스템은 특히 GPU 및 TPU와 같은 가속기 장치에서 대규모 계산 작업을 수행 할 때 메모리 할당을 최적화하고 불필요한 메모리 할당을 줄 이도록 설계되었습니다. 작동 방식은 다음과 같습니다.
1. 배열 추적 수명 : JAX는 메모리가 안전하게 재사용 될 수있는시기를 결정하기 위해 배열의 수명을 추적합니다. 이는 배열이 더 이상 필요하지 않으면 다른 작업에 대한 메모리를 재사용 할 수 있음을 의미합니다.
2. 메모리 재사용 메커니즘 : 계산을 수행 할 때 JAX는 더 이상 필요하지 않은 중간 배열에서 메모리 블록을 재사용하려고 시도합니다. 예를 들어, 중간 배열이 계산에 사용 된 다음 폐기 된 경우 JAX는 후속 작업을 위해 메모리를 재사용하려고합니다. 이는 반복 계산 중에 메모리 할당을 최소화하는 데 도움이되므로`jax.jit`를 사용하여 함수를 컴파일 할 때 특히 효과적입니다.
3. 버퍼 기증 : JAX에서 메모리 재사용의 또 다른 측면은 완충 기부입니다. 여기에는 특정 입력 버퍼가 모양과 유형이 일치하는 경우 출력 값을 유지하도록 재사용 할 수 있음을 지정하는 것이 포함됩니다. 이것은`jax.pmap` 또는`jax.jit`와 같은 함수에서 'donate_argnums'매개 변수를 사용하여 달성됩니다. 버퍼를 기증함으로써 JAX는 출력에 새로운 메모리를 할당하지 않아 전체 메모리 사용을 줄일 수 있습니다.
4. 장치 메모리 할당 : JAX는 호스트 RAM이 아닌 대상 장치 (예 : GPU 또는 TPU)에 메모리를 할당합니다. 이 할당 전략은 특히 작업에 대한 메모리를 실망시킬 때 메모리 조각화를 최소화하고 할당 오버 헤드를 줄이기 위해 최적화됩니다.
전반적으로 JAX의 메모리 재사용 시스템은 불필요한 메모리 할당을 최소화하고 대규모 계산에 중요한 장치 메모리의 효율적인 사용을 보장하여 성능을 최적화하는 데 도움이됩니다.
인용 :[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---recreating-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