본문 바로가기

Data/Data Science

[ML] bf16, fp16, fp32의 차이점

반응형

업무를 진행하면서 bf16, fp16, fp32에 대한 정보를 알게되었는데. 왜 사용하는지 그리고 언제 사용하는지에 대해서 좀 정리해보려고한다.

https://arxiv.org/abs/1905.12322 -> 관련논문

 

A Study of BFLOAT16 for Deep Learning Training

This paper presents the first comprehensive empirical study demonstrating the efficacy of the Brain Floating Point (BFLOAT16) half-precision format for Deep Learning training across image classification, speech recognition, language modeling, generative ne

arxiv.org

 

 

bf16, fp16의 사용이유는?

bf16과 fp16은 모두 수치 형식(numerical format)으로, 컴퓨터에서 부동 소수점 수(floating-point numbers)를 표현하는 방법 중 하나임.

 

bf16은 bfloat16의 준말로, 16비트 부동 소수점 형식을 나타냅니다. 이 형식은 인공지능 분야에서 널리 사용되며, 인텔의 최신 프로세서와 같은 하드웨어에서 지원됩니다. bf16은 32비트 부동 소수점 형식보다는 정확도가 떨어지지만, 메모리 요구 사항이 적으므로 모델 학습에 유용함.

 

fp16은 half-precision의 준말로, 16비트 부동 소수점 형식을 나타냄. 이 형식은 메모리를 적게 사용하므로 딥 러닝 분야에서 매우 인기가 있음. 그러나 16비트의 정밀도가 낮아서 모델의 정확도가 떨어질 수 있음. 따라서 모델을 훈련할 때는 일반적으로 fp32(32비트 부동 소수점 형식)를 사용하고, 추론(inference) 단계에서는 fp16을 사용하여 연산 속도를 높이는 경우가 많음.

 

간단히 말해서, bf16과 fp16은 모델을 더 빠르게 실행하고 메모리를 절약하는 데 도움이 되는 부동 소수점 형식임. 그러나 정확도는 낮아질 수 있으므로, 모델의 특성에 따라 사용 여부를 결정해야 합니다.

 

그렇다면 언제 bf16, fp16, fp32를 써야할까?

bf16, fp32, fp16은 각각 메모리 사용량과 연산 속도, 정밀도 등의 측면에서 서로 다른 특성을 가지고 있습니다. 따라서 사용하는 모델의 특성에 맞게 선택하는 것이 중요합니다.

- bf16: 인공지능 분야에서 주로 사용되는 부동 소수점 형식으로, fp32보다 메모리 사용량이 작지만 정밀도가 더 낮습니다. 모델 학습시 fp32 대비 메모리 사용량을 약 50% 줄일 수 있으며, 정확도 손실이 크지 않은 경우에 사용됩니다.

- fp32: 일반적으로 모델 학습에 사용되는 부동 소수점 형식입니다. fp16과 비교하여 정밀도가 높으며, 모델의 정확도를 높일 수 있습니다. 그러나 연산 속도가 느리고 메모리 사용량이 크기 때문에 대규모 모델 학습에는 제한적입니다.

- fp16: 딥 러닝 추론(inference) 분야에서 많이 사용되며, fp32 대비 연산 속도가 빠르고 메모리 사용량이 적습니다. 그러나 정밀도가 낮아서 모델의 정확도가 떨어질 수 있으며, 따라서 학습에는 적합하지 않습니다.

따라서, 모델 학습시에는 fp32를 사용하고, 추론시에는 fp16을 사용하는 것이 일반적입니다. 그러나 모델 특성에 따라 bf16이나 다른 형식을 선택할 수도 있습니다. 또한, 하드웨어나 프레임워크의 지원 여부에 따라 선택할 수 있는 형식이 제한될 수 있으므로, 이를 고려하여 선택해야 합니다.

 

Mixed Precision

위와같이 fp16, fp32를 혼합하면서 모델학습에 사용하는 방식이 있는데, 이를 Mixed Precison이라고함. 학습에 사용되는 메모리 사용량을 최적화하여 학습을 가속화 하면서도 모델의 정확도를 유지할수있음

 

일반적으로 Mixed precision은 다음과 같은 과정이 존재

1. 모델의 가중치(weight)는 fp32 형식으로 저장
2. 입력 데이터는 fp16 형식으로 변환하여 처리
3. fp16 형식으로 처리하는 도중에 정밀도가 손실될 가능성이 있으므로, 일정 주기마다 가중치를 fp32로 복사하여 정밀도를 보정
4. 역전파(backpropagation) 과정에서도 fp16을 사용하여 연산 속도를 높임
5. 학습이 끝나면, 모델의 가중치를 다시 fp32로 변환하여 저장함

fp32를 사용할때보다 많은 메모리 사용을 줄일수가있어서, 일반적으로 대규모 모델 학습에 사용됨.

3번에서 가중치를 복사하면 오히려 메모리 사용량이 커질수있지않을까? 라고 생각할수있는데 생각보다 이 복사하는것이 메모리가 크게 잡아먹지않는다고함.

반응형