
Auto Mixed Precision 방법에 대해 알아보고 실제 적용했을 때 효과를 보고자 한다.AMP는 Mixed. 즉, 혼합이라는 단어 그대로 FP32(32bit)와 FP16(16bit) 자료형을 혼합하여 사용하는 기술
모델링 학습 과정에서 학습의 효율성과 연산 속도를 높이기 위해 사용한다.
autocast와 GradScalwer 필요torch.cuda.amp.autocast
autocast는 Forward Pass 중, FP32 연산을 FP16 연산으로 자동 변환하는 역할
모든 연산을 FP16으로 변환하는 것은 아님!
Trade-off🛡️
필요한 연산?
FP16으로 연산을 수행해도 정확도 손실이 적은 연산이고,- GPU 내
Tensor Core라는 특수 연산 장치가 속도를 극대화할 수 있는 연산을 의미
matmul,nn.Linear,Conv 연산이 주요 변환 대상🛡️
FP16변환 예외 대상
Log Softmax
- FP16의 경우 까지 표현할 수 있는데, 소프트맥스 출력이 이 값보다 작다면 0으로 처리되고,
log(0)은 음의 무한대가 되어 Nan이 되는 언더플로우현상 발생
torch.cuda.amp.GradScaler
FP16의 좁은 표현 범위로 인해 발생하는 언더플로우를 방지하여 안정성을 확보하는 역할
학습 과정에서 산출된 손실에 스케일 펙터를 사용하여 gradient를 인위적으로 키우는 역할
세 단계로 나눠진다.
손실 스케일링복구 및 파라미터 업데이트스케일 펙터 업데이트⚠️ Example ⚠️
실제 경사도 : `
바로 FP16 변환 시-> FP16 표현 범위를 벗어나, 0이 되는
언더플로우발생
- 스케일링을 통해 FP16 범위로 변환
- 파라미터 업데이트 위해 실제 값보다 커진 경사도를 다시 복구
(= unscale)+ 복구된 값으로마스터 가중치. 즉, 모델의 원 가중치 업데이트- 스케일 펙터 업데이트
(classification task로 BERT를 학습하는 코드 사용)
Case.01Case.02Case.03| - | case.01 | case.02 | case.03 |
|---|---|---|---|
에포크 당 소요시간 | 540초 | 240초 | 240초 |
성능(accuracy) | 0.861 | 0.796 | 0.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가 있는 환경에서만 사용 가능한 솔루션이 나눠져 있으니, 환경에 맞게 적절히 사용하면 시간 단축에 아주 유용할 것 같다.