본문 바로가기
info : 유용한 정보, 체험기

파이썬 숫자 정밀도 FP32와 FP16 차이점 및 딥러닝과의 연관성

by 퇴근길에 삼남매가 알려드림 2024. 12. 14.

파이썬이나 코딩을 하시는 분들은 FP32, FP16등에 대해서 들어보셨을거에요. 오늘은 관련 개념을 정리하고 딥러닝과의 연관성에 대해서 이야기해보겠습니다.

FP32 (32-bit Floating Point)

FP32는 32비트 부동소수점 숫자를 표현하는 방식으로, 다음과 같은 구성 요소로 이루어집니다:

  • 1비트: 부호 (Sign)
  • 8비트: 지수 (Exponent)
  • 23비트: 가수 (Mantissa) 또는 유효숫자

FP32는 높은 정밀도를 제공하여, 다양한 범위의 숫자를 정확하게 계산할 수 있습니다. 이 형식은 과학적 계산 및 고정밀 계산에 적합합니다. 표현 가능한 수는 [2^-149, ~3,4 x10^38] 입니다.

FP16 (16-bit Floating Point)

FP16은 16비트 부동소수점 숫자를 표현하는 방식으로, 구성 요소는 다음과 같습니다:

  • 1비트: 부호 (Sign)
  • 5비트: 지수 (Exponent)
  • 10비트: 가수 (Mantissa) 또는 유효숫자

표현 가능한 수는 [2^-24, 65,504] 입니다. FP32보다 표현 가능한 숫자 범위가 적은 것을 확인할 수 있습니다. FP16은 FP32보다 정밀도가 낮지만, 메모리 사용량이 적고 계산 속도가 빠릅니다. 특히 GPU에서 성능 최적화에 유리합니다.

FP32와 FP16의 주요 차이점

  • 정밀도: FP32는 더 높은 정밀도를 제공하여, 작은 오차도 놓치지 않도록 합니다. FP16은 정밀도가 상대적으로 낮습니다.
  • 메모리 효율성: FP16은 FP32보다 절반의 메모리만 사용하므로, 더 많은 데이터를 처리할 수 있습니다.
  • 속도: FP16은 FP32보다 계산 속도가 빠를 수 있습니다. 최신 GPU는 FP16 연산을 최적화하여 더 빠르게 처리할 수 있습니다.


기존 FP32와 FP16의 사용

FP 32의 사용

  • 정밀도: FP32는 훈련 과정에서 작은 오차가 누적될 수 있는 문제를 방지합니다.
  • 안정성: FP32는 훈련 중 수치적 안정성을 제공합니다.

FP16의 사용

  • 메모리 절약: FP16은 메모리를 절약할 수 있어, 더 큰 모델을 처리할 수 있습니다.
  • 속도 향상: FP16을 사용하면 훈련 속도가 빨라지고, 더 많은 계산을 병렬로 처리할 수 있습니다.
  • 혼합 정밀도 훈련: FP16과 FP32를 혼합하여 사용함으로써 훈련 속도를 높이면서도 정밀도를 유지할 수 있습니다.

 이런 특징 때문에 예전에는 주로 FP32를 학습에 이용해서 정밀도를 높이려고 했다고 합니다. 물론 그만큼 오래 걸렸지만요. 

딥러닝에서의 활용

딥러닝에서는 모델 학습 시 대규모 데이터를 처리하고 수많은 계산을 수행해야 합니다. FP32와 FP16은 각기 다른 방식으로 딥러닝에 이용되는데 NVIDIA는 FP16과 FP32를 합쳐서 연산 속도를 늘리는 개발을 했습니다. 관련 내용은 2018년 ICML 학회에서 발표 되었습니다. 논문과 리뷰 당시의 논평 등은 오픈리뷰 기사를 통해서 확인해주세요. ICML Mixed Precision Training 논문 링크 

 

혼합 정밀도를 이용한 학습(Mixed-Preicision Training)은 FP16의 연산 결과를 누적해서 FP32의 정밀도를 보여주는 방법입니다. 그래서 중간에 모델을 FP16 데이터 타입으로 바꾸고, 작은 gradient 값을 보존하기 위해서 loss scaling (일정 값을 곱해서 작은 값을 FP16데이터 타입으로도 표현할 수 있게 하는 것) 이 필요합니다. 관련 내용은 2017년 기사에도 잘 나와있습니다. https://developer.nvidia.com/blog/mixed-precision-training-deep-neural-networks/

 

Mixed-Precision Training of Deep Neural Networks | NVIDIA Technical Blog

Deep Neural Networks (DNNs) have lead to breakthroughs in a number of areas, including image processing and understanding, language modeling, language translation, speech processing, game playing…

developer.nvidia.com

 

 

 

보통 학습 과정에서 Mixed precision training 방법은 1,3,5번을 추가하게 됩니다.

  1.  모델 가중치 (model weight)을 FP16 타입으로 복사합니다
  2. Forward propagation을 FP16 타입 weight, activation 으로 실시합니다
  3. loss 값에 S 라는 상수를 곱해서 (scaling factor,S) FP16값으로도 표현할 수 있도록 합니다.
  4. FP16으로 backward propagation을 합니다. weights, activations, graidents 를 계산합니다.
  5. 다시 값에 1/S 을 곱합니다. 즉, 3번째 단계에서 곱한 값으로 나누어 원래 값을 계산합니다.
  6. 기타 weight gradients와 관련된 단계들을 수행합니다 (gradient clipping, weight decay, etc).
  7. 이제 최종 가중치 (master copy of weights)을 FP32로 표현해서 업데이트 합니다. 

 

amp 효과
amp 효과

 

 

더 나아가서 2018년부터는 텐서플로우(TensorFlow 1.14 버전 이후 )Pytorch (파이토치 1.6버전 이후)에 자동으로 Mixed precision이 가능하게 하는 AMP (Automatic Mixed Precision, 자동화된 혼합 정밀도) 기능이 포함되었습다. 이 방법으로 학습 (또는 훈련, training) 에 필요한 메모리를 줄이고 최대 3배 까지 학습시간을 단축했습니다. 물론 모든 모델에 적합하지는 않을 수 있어서 이 방법으로 학습이 안 되면 그냥 기본값인 FP32으로 학습시키는 걸 추천합니다.

 

AMP 적용은 몇 줄의 코드만 추가하면 됩니다. 파이토치 기준으로는 아래 내용이 포함되어야 합니다. 파이토치 홈페이지에서 관련 코드를 가져왔습니다.

import torch
# Creates once at the beginning of training
scaler = torch.cuda.amp.GradScaler()

for data, label in data_iter:
   optimizer.zero_grad()
   # Casts operations to mixed precision
   with torch.cuda.amp.autocast():
      loss = model(data)

   # Scales the loss, and calls backward()
   # to create scaled gradients
   scaler.scale(loss).backward()

   # Unscales gradients and calls
   # or skips optimizer.step()
   scaler.step(optimizer)

   # Updates the scale for next iteration
   scaler.update()
   # 출처 : https://pytorch.org/blog/accelerating-training-on-nvidia-gpus-with-pytorch-automatic-mixed-precision/

 

만약 이때 model.half()를 한다면 모델 매개변수들 (model parameter)를 모두 FP16으로 바꾸게 됩니다. 학습 속도는 빨라지더라도 불안정해지거나 에러가 커질 수 있습니다.  torch.cuda.amp.autocast()를 이용하면 필요한 레이어에만 FP16으로 바꾸어주고 또한 모델 가중치값은 최종적으로 FP32로 저장되게 됩니다. 

 

단, 일부 프레임에서 AMP가 적용이 안되는 경우들이 있습니다.

  • 체크포인트 파일은 AMP를 통해서 저장되었는데 파인튜닝 (Fine tuning, 추가 학습)을 AMP를 활성화하지 않고 (AMP disabled) 학습시킬 때
  • 체크포인트 파일은 AMP를 활성화하지 않고 저장하고 AMP를 활성화하고 파인튜닝(Fine tuning) 시키는 것
  • AMP를 활성화하고 GPU 1개로 훈련시키고, 파인튜닝은 여러개의 GPU로 학습시키는 것.

즉, AMP를 활성화하고 학습시킬 경우에는 일관성 있게 적용이 되어야 합니다.

 

관련 내용을 아래 블로그에서도 잘 설명해주고 있습니다 : 관련 내용을 다룬 블로그

지금까지 알아본 AMP(자동화된 혼합 정밀도, automatic mixed precision) 방법은 모델 학습을 효율적으로 하는데 이용되는 방법 중 하나입니다. 이 외에도 asynchronous data loading, buffer checkpointing, distributed data parallization을 이용하면 보다 빠르게 학습시킬 수 있습니다. 나중에 기회가 되면 다루어 볼께요.

 

 

댓글


TOP