Auto Mixed Precision(AMP)

JunD·2025년 12월 9일
post-thumbnail
  • 오늘은 Pytorch에서 학습 효율성을 증대시키기 위해 사용하는 Auto Mixed Precision 방법에 대해 알아보고 실제 적용했을 때 효과를 보고자 한다.

AMP

  • AMP는 Mixed. 즉, 혼합이라는 단어 그대로 FP32(32bit)와 FP16(16bit) 자료형을 혼합하여 사용하는 기술

    • AMP를 사용하지 않을 때보다 더 적은 bit를 사용
  • 모델링 학습 과정에서 학습의 효율성연산 속도를 높이기 위해 사용한다.

  • AMP를 구현하기 위해서는 autocastGradScalwer 필요

autocast

  • torch.cuda.amp.autocast

  • autocast는 Forward Pass 중, FP32 연산을 FP16 연산으로 자동 변환하는 역할

  • 모든 연산을 FP16으로 변환하는 것은 아님!

    • 필요한 연산만 변환
    • 효율성과 안정성 Trade-off

🛡️ 필요한 연산?

  • FP16으로 연산을 수행해도 정확도 손실이 적은 연산이고,
  • GPU 내 Tensor Core라는 특수 연산 장치가 속도를 극대화할 수 있는 연산을 의미
    • matmul, nn.Linear, Conv 연산이 주요 변환 대상

🛡️ FP16변환 예외 대상

  • Log Softmax
    • FP16의 경우 10510^{-5}까지 표현할 수 있는데, 소프트맥스 출력이 이 값보다 작다면 0으로 처리되고, log(0)은 음의 무한대가 되어 Nan이 되는 언더플로우현상 발생


GradScaler

  • torch.cuda.amp.GradScaler

  • FP16의 좁은 표현 범위로 인해 발생하는 언더플로우를 방지하여 안정성을 확보하는 역할

  • 학습 과정에서 산출된 손실에 스케일 펙터를 사용하여 gradient를 인위적으로 키우는 역할

  • 세 단계로 나눠진다.

    • 손실 스케일링
    • 복구 및 파라미터 업데이트
    • 스케일 펙터 업데이트

⚠️ Example ⚠️

  • 실제 경사도 : 5×1065 \times 10^{-6}`

  • 바로 FP16 변환 시-> FP16 표현 범위를 벗어나, 0이 되는 언더플로우 발생

    • 스케일링을 통해 FP16 범위로 변환
    • 파라미터 업데이트 위해 실제 값보다 커진 경사도를 다시 복구(= unscale) + 복구된 값으로 마스터 가중치. 즉, 모델의 원 가중치 업데이트
    • 스케일 펙터 업데이트


vanila vs AMP

(classification task로 BERT를 학습하는 코드 사용)

  • Case.01
    • AMP를 적용하지 않은 기존 방식을 사용했을 때
  • Case.02
    • autocast, GradScaler 사용할 때
  • Case.03
    • case.02에 gradient_clip 추가 했을 때

Result

-case.01case.02case.03
에포크 당 소요시간540초240초240초
성능(accuracy)0.8610.7960.859
  • AMP를 적용한 case 02, case 03에서 적용하지 않을 떄보다 월등한 학습 속도 차이를 보임

  • case 02의 경우 성능이 크게 떨어진 결과를 보이는데, 이는 앞서 설명한 FP16의 표현 범위로 인해 발생하는 오버플로우 때문에 기울기 폭발이 발생하여 학습이 되지 않은 결과를 보임

    • 오버플로우 : FP16 표현 범위보다 큰 경우를 말함
  • AMP에 gradient_clip을 적용하여 FP16범위 안에 있지만 기울기가 튀는 경우를 보완

  • case.01과 case.03을 비교했을 때 정확도는 감소했지만 학습 속도는 2배 이상 빨라진 것으로 보아,

  • 정확도를 조금 양보하더라도 속도가 중요하다면 AMP를 적용하고, 정확도가 높은 게 최우선이라면 기존 방법을 사용하는 게 맞는 것 같다.


  • 학습 속도를 향상 위해 AMP를 비롯한 DeepSpeed, 데이터병렬화(DDP) 등 여러 솔루션 사용
  • 단일 GPU에서 사용할 수 있거나 여러 GPU가 있는 환경에서만 사용 가능한 솔루션이 나눠져 있으니, 환경에 맞게 적절히 사용하면 시간 단축에 아주 유용할 것 같다.
profile
Data Scientist & Data Analyst

0개의 댓글