Bit Quantization 을 할때 알아야 할 precision 개념을 알아보자.
일단 Bit Quantization 이란 computation 과 메모리 cost를 줄이기 위해 모델의 weight 와 activation 를 표현하는 bit 수를 low-precision 으로 표현하는 방법이다.
bit 를 이용해 수를 2진수로 표현한다.
Float32
일반적으로 모델 학습에 사용되는 부동 소수점 default precision 은 32 이다. 그리고 inference 에서는 속도를 높이기 위해서 사용된다고 한다.
Float16
fp 는 floating point 라는 뜻이고 bf 는 bfloat 이다.
bf16은 주로 인공지능 분야에서 사용하는 단위로 모델 학습시 fp32 와 비교했을때 약 50% 정도 메모리 사용량을 줄일 수 있다.
fp16은 정밀도(precision, 얼마나 많은 bit 를 이용해 표현할 것인지) 이 낮기 때문에 모델 학습의 정확도가 떨어질 수 있고 학습으로는 적합하지않다. 그래서 inference 에서 많이 사용된다.
fp 와 bf 의 차이점은 같은 16bit 이지만 exponent 와 mantissa (fraction이라고도한다) 의 비율차이이다.
Exponent는 지수부이고 Mantissa 는 실수부이다.
bf16 은 원래 사용하던 fp32 와 같은 범위 exponent 를 사용하기 때문에 fp16 보다 더 넓은 (fp32와 같은) 범위의 수를 표현할 수 있다. 하지만 수 자체의 정밀도는 떨어진다.
예를 들면, (이거는 진짜로 fp32, bf16, fp16 이 아래 수 까지만 표현할 수 있다는 것은 아니다. 나도 모른다. 이진수를 계산하기 귀찮아서 그냥 대충 랜덤 수를 사용하였다..)
0.32423432443 x 10^12 까지 fp32가 표현할 수 있다면,
fp16 는 0.324234 x 10^12로 표현할 수 있다. 그렇지 10^12 이 너무 커서 위의 수를 표현할 수 없을 수 있는 단점이 있고,
bf16 은 0.324 x 10^12 로 근사해서 표현할 수 있다.
Mixed precision
Huggingface 에서는 mixed precision 이라는 옵션이 있는데,
이는 큰 모델을 효율적으로 사용(학습 및 Inference)하기 위해 32 bit 와 16 bit 를 함께 사용하는 방식이다. 초기 방법은 아래와 같은 방식을 사용한다고 한다. (현재는 더 발전했을 것이다)
- 모델의 가중치는 fp32형식으로 저장하고
- 입력 데이터는 fp16으로 변환한다.
- fp16으로 처리하면 정밀도가 손실될 개능성이 있으므로 일장 주기마다 가중치를 fp32로 복사하여 정밀도를 보정한다.
- Back propagation 과정에서도 fp16을 사용한다.
- 학습이 끝나면 다시 fp32 를 사용한다.
Reference
https://jaeyung1001.tistory.com/m/entry/bf16-fp16-fp32%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
https://bo-10000.tistory.com/32
'머신러닝 이모저모' 카테고리의 다른 글
[이화여대 강의] 2. Deep Learning Software Stack 1 (1) (0) | 2024.09.20 |
---|---|
[이화여대 강의] Orientation (0) | 2024.09.20 |
VScode 에서 tmux 사용하기 (0) | 2024.01.03 |
UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount() 에러 처리 (0) | 2024.01.03 |
GPT-2 를 seq2seq 방식으로 학습시키기 (0) | 2023.12.07 |