JAX는 TPU에서 실행할 때 메모리 조각화를 최소화하기 위해 여러 기술을 사용합니다.
1. 메모리 계층 구조 활용 : TPU는 높은 대역폭 메모리 (HBM), 벡터 메모리, 스칼라 메모리 및 축적기 메모리를 포함한 정교한 메모리 계층을 가지고 있습니다. JAX는 데이터를 구조화하여 이러한 메모리 레벨 사이의 전송을 최소화하여 계산을 최적화하여 효율적인 메모리 사용을 보장하여 단편화를 줄이는 데 도움이됩니다 [3] [5].
2. 프리 페치 및 버퍼링 전략 : 프리 페치 데이터 메모리 액세스 대기 시간을 숨기고 원형 버퍼 및 이중 버퍼링과 같은 기술은 스트리밍 데이터 및 연속 계산에 사용됩니다. 이러한 전략은 메모리를보다 효율적으로 관리하여 단편화 가능성을 줄이는 데 도움이됩니다 [3].
3. 샤딩 및 병렬 처리 : JAX는 샤딩을 사용하여 TPU 코어를 가로 질러 계산을 분할하여 워크로드를 배포하여 메모리를보다 효과적으로 관리하는 데 도움이됩니다. 이 접근법은 단편화를 최소화하는 방식으로 메모리가 할당되고 거래되도록 보장합니다 [3] [7].
4. 효율적인 데이터 레이아웃 : JAX는 TPU 친화적 인 크기에 맞게 데이터 레이아웃을 최적화하며, 종종 최적의 크기의 배수로 패딩 크기를 패딩합니다 (예 : 128). 이를 통해 메모리가 인접한 블록에 할당되어 단편화가 줄어 듭니다 [3] [5].
5. JIT 컴파일 및 메모리 재사용 : JAX의 JIT (Just-In-Time) 컴파일 및 메모리 재사용 메커니즘은 불필요한 할당을 최소화하는 데 도움이됩니다. JAX는 가능한 경우 메모리 블록을 재사용함으로써 새로운 할당 주파수를 줄여 단편화로 이어질 수 있습니다 [1] [3].
이러한 기술은 총체적으로 메모리 조각화를 최소화하고 TPU의 성능을 최적화하는 데 기여합니다.
인용 :[1] https://app.studyraid.com/en/read/11969/381958/memory-management-best-practices
[2] https://www.datacamp.com/tutorial/combine-google-gemma-with-tpus-fine-tune-and-run-inference-with-enhanced-performance and-speed
[3] https://app.studyraid.com/en/read/11969/381956/tpu-comcomputation-srtrateings
[4] https://stackoverflow.com/questions/60871/how-to-tolve-memory-fragmentation
[5] https://cloud.google.com/tpu/docs/performance-guide
[6] https://www.kaggle.com/code/matthewdwatson/gemma-2-tpu-fine-tuning
[7] https://docs.jax.dev/en/latest/pallas/tpu/distributed.html
[8] https://jax.readthedocs.io/en/latest/gpu_memory_allocation.html