`jax.checkpoint` (`jax.remat`라고도 함)를 사용하여 구현 된 Jax의 그라디언트 체크 포인트는 기계 학습 모델에서 그라디언트 계산 중에 메모리 사용량을 줄이기 위해 설계된 기술입니다. 이 방법은 계산의 순방향 패스 중에 중간 값을 선택적으로 저장하고 모든 중간 값을 저장하지 않고 후진 패스 중에 필요에 따라 다시 컴퓨팅하여 작동합니다.
작동 방식 :
1. 메모리 감소 : 모든 중간 값을 저장하지 않음으로써 그라디언트 체크 포인트는 그라디언트 계산에 필요한 피크 메모리 사용을 줄입니다. 이것은 중간 활성화가 중요한 기억을 소비 할 수있는 대형 모델에 특히 유리합니다.
2. 트레이드 오프 : 메모리 사용의 감소는 계산 시간이 증가하는 비용으로 발생합니다. 뒤로 패스 동안, 일부 중간 값은 메모리에서 검색되는 대신 재 계산되어 추가 계산 오버 헤드로 이어질 수 있습니다.
3. 효과 성 : 메모리 사용을 줄이는 데있어 기울기 체크 포인트의 효과는 모델 크기와 복잡성에 따라 다릅니다. 소규모 모델의 경우 XLA 및 JIT 컴파일과 같은 기본 최적화로 인해 영향이 제한 될 수 있습니다 [2] [3]. 그러나 상당한 중간 활성화를 갖는 더 큰 모델의 경우 체크 포인팅은 메모리 요구 사항을 크게 줄일 수 있습니다.
4. 구현 : JAX에서는 모델 내의 특정 기능에`jax.checkpoint '를 적용하여 저장되는 중간체와 재 계산 된 중간체를 제어 할 수 있습니다. 이것은 메모리 효율과 계산 비용 사이의 균형을 허용한다 [1] [3].
전반적으로 JAX의 그라디언트 체크 포인트는 대규모 기계 학습 계산에서 메모리 사용을 관리하는 데 유용한 도구이지만, 특정 모델 아키텍처 및 계산 환경에 따라 효과가 다를 수 있습니다.
인용 :[1] https://app.studyraid.com/en/read/11969/381948/memory-optimization-methods
[2] https://github.com/google/jax/issues/19822
[3] https://docs.jax.dev/en/latest/gradient-checkpointing.html
[4] https://proceedings.mlsys.org/paper_files/paper/2023/file/8a27bb69950c0b46cdb36d10e5514cc8-paper-mlsys2023.pdf
[5] https://arxiv.org/abs/2412.11810
[6] https://stackoverflow.com/questions/52795440/memory-saving-gradients-or-memory-pointing-in-keras
[7] https://discuss.pytorch.org/t/gradient-checkpointing-does-not-reduce-memory-usage/71421
[8] https://openreview.net/forum?id=qhxjqomddf