GPU에 대한 JAX의 메모리 할당 전략은 사용 가능한 GPU 메모리의 상당 부분을 사전으로 전달함으로써 성능에 크게 영향을 미칩니다. 이 전략이 성능에 어떤 영향을 미치는지는 다음과 같습니다.
1. PrealLocation : JAX는 첫 번째 JAX 작업이 실행될 때 총 GPU 메모리의 75%를 Preallocates합니다. 이 접근법은 할당 오버 헤드 및 메모리 조각화를 최소화하여 메모리 관리 작업에 소요 된 시간을 줄임으로써 성능을 향상시킬 수 있습니다 [1] [3]. 그러나 할당 된 메모리가 워크로드에 불충분 한 경우 메모리 외 (OOM) 오류로 이어질 수 있습니다.
2. 메모리 조각화 : PrealLocation 비활성화 (`XLA_PYTHON_CLIENT_PREALLOCATE = FALSE`를 사용)는 메모리가 할당되고 동적으로 거래되므로 메모리 조각화로 이어질 수 있습니다. 이 단편화는 메모리가 인접하지 않기 때문에 전체 메모리가 충분한 경우에도 OOM 오류를 유발할 수 있습니다 [1] [3] [6].
3. 사용자 정의 : 사용자는`xla_python_client_mem_fraction = .xx`를 사용하여 Preallocated Memory Fraction을 조정하여보다 유연한 메모리 관리가 가능합니다. 이 분수를 낮추면 OOM 오류를 방지 할 수 있지만 메모리 조각화가 증가 할 수 있습니다 [1] [3].
4. Deallocation :`XLA_PYTHON_CLIENT_ALLOCATOR = 플랫폼 설정을 설정하면 JAX가 주문시 메모리를 할당하고 더 이상 필요하지 않은 경우 거래를 할 수 있습니다. 이 접근법은 느리게 진행되며 일반적인 사용에는 권장되지 않지만 메모리 풋 프린트를 디버깅하거나 최소화하는 데 유용 할 수 있습니다 [1] [3].
5. 성능 최적화 : JAX의 메모리 관리는 불필요한 할당을 최소화하고 가능한 경우 메모리 블록을 재사용하여 GPU의 성능에 최적화되었습니다. 반복 계산에`jax.jit`를 사용하고 구배 체크 포인팅 구현과 같은 기술은 메모리 사용량을 더욱 최적화 할 수 있습니다 [5].
6. GPU 아키텍처 고려 사항 : GPU에 대한 JAX의 성능은 특정 GPU 아키텍처에 따라 다릅니다. 예를 들어, AMD GPU는 고유 한 메모리 계층과 컴퓨팅 장치 구성으로 인해 맞춤형 메모리 관리 및 최적화 기술이 필요합니다 [2].
전반적으로 JAX의 메모리 할당 전략은 메모리 사용 및 조각화 균형을 유지하여 GPU의 성능을 최적화하도록 설계되었지만 OOM 오류를 피하고 효율성을 극대화하기 위해 신중한 튜닝이 필요합니다.
인용 :[1] https://kolonist26-jax-kr.readthedocs.io/en/latest/gpu_memory_allocation.html
[2] https://infohub.delltechnologies.com/fr-fr/p/running-grok-1-on-jax-multiple-gpus-on-the-dell-poweredge-xe9680-server/
[3] https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html
[4] https://neptune.ai/blog/optimizing-gpu-usage-during-model-training-with-neptune
[5] https://app.studyraid.com/en/read/11969/381958/memory-management-best-practices
[6] https://massedcompute.com/faq-answers/?question=how+ does+ the+memory+ allocation+process+impcact+performance+in+ +single-instance+ gpu+arachitecture%3f
[7] https://stackoverflow.com/questions/73322760/jax-gpu-memory-usage-even-with-cpu-allocation
[8] https://researchcomputing.princeton.edu/support/knowledge-base/gpu-computing
[9] https://github.com/jax-ml/jax/issues/23882