pytorch로 데이터나 모델을 다루다 보면 float32타입(single precision)을 많이 볼 수 있다.
이는 실수 하나를 저장할 때 32bit를 사용하고, 그 중에서 1bit는 부호를, 8bit는 지수를, 나머지 23bit는 소수를 표현한다.

모델 추론을 하거나 연산 속도를 올릴 필요가 있다면, float32타입이 아니라 보통 16bit를 사용하는 bfloat16을 사용한다.
그런데 왜 float16이 아닌 bfloat16일까?

이 궁금증을 해결할려면 float16과 bfloat16의 차이를 보면 알 수 있다.
float16과 bfloat16 모두 16bit을 사용하나, 지수와 소수 부분에 사용되는 bit의 수가 아래 그림과 같이 다르다는 것을 알 수 있다.

왜 bfloat16을 사용하는지는 이 논문을 보면 되겠다. https://arxiv.org/abs/1905.12322
논문에서는 bfloat16이 float32와 동일한 동적 범위(Dynamic Range)를 유지하여 수렴을 위한 하이퍼파라미터 조정이 필요 없다 말한다.

하지만 numpy에서는 bfloat16타입을 지원하지 않으니 numpy로 변환할 때 float32등 다른 타입으로 변환하고 numpy로 바꾸자.

참고자료

https://cloud.google.com/tpu/docs/bfloat16?hl=ko
https://arxiv.org/abs/1905.12322

profile
딥러닝을 공부하는 학생입니다

0개의 댓글