FP16·bfloat16·FP32 변환 쉽게 이해하기 — 개념과 원리
머신러닝과 그래픽 하드웨어는 메모리와 대역폭을 아끼려고 수를 16비트로 저장하는 경우가 많습니다. 대표적인 16비트 형식은 비트를 나누는 방식이 다릅니다. IEEE 반정밀도(FP16)는 가수 비트를 더 많이 두고, bfloat16(bf16)은 FP32와 같은 지수 범위를 유지합니다. 이 도구는 10진수를 FP32, bfloat16, FP16에서 가장 가까운 값으로 반올림하고, FP16 비트 패턴과 각 형식의 기계 엡실론을 보여 주어 실제로 남는 정밀도를 확인하게 해 줍니다.
계산 방법
- FP32: 부호 1비트, 지수 8비트(바이어스 127), 가수 23비트이며 값은 (−1)ˢ × 1.f × 2^(e − 127)입니다.
- bfloat16: FP32의 상위 16비트(부호 1, 지수 8, 가수 7)입니다. 버리는 하위 16비트는 최근접 짝수 반올림으로 처리합니다.
- FP16: 부호 1비트, 지수 5비트(바이어스 15), 가수 10비트입니다. 크기가 65520 이상이면 무한대가 되고, 2⁻¹⁴보다 작은 수는 2⁻²⁴ 간격의 비정규수로 저장합니다.
- 기계 엡실론: 1과 그다음 큰 수의 간격으로 FP16 2⁻¹⁰ ≈ 9.77 × 10⁻⁴, bf16 2⁻⁷ ≈ 7.81 × 10⁻³, FP32 2⁻²³ ≈ 1.19 × 10⁻⁷입니다.
원리
부동소수점 수는 2진법의 과학적 표기법으로, 지수가 크기를, 가수가 정밀도를 정합니다. 가수가 p비트이면 2ᵉ과 2ᵉ⁺¹ 사이의 수는 2^(e − p) 간격으로 놓이므로 상대 반올림 오차는 엡실론의 절반 이하입니다. FP16은 유효 숫자가 10진수로 약 3자리이지만 최댓값이 65504에 그칩니다. bf16은 유효 숫자가 2~3자리로 적지만 FP32처럼 약 3.4 × 10³⁸까지 표현하므로, 신경망 학습에서 넘침을 줄여 줍니다.
예제 풀이
- 입력 3.14159는 2와 4 사이에 있으므로 지수는 1입니다.
- FP32는 가수 23비트를 유지해 패턴 0x40490FD0, 값 3.141590118이 됩니다.
- bf16은 상위 절반 0x4049를 남기고, 버리는 절반 0x0FD0이 0x8000보다 작아 내림하므로 2 × (1 + 73/128) = 3.140625입니다.
- FP16의 가수는 round((3.14159 ÷ 2 − 1) × 1024) = round(584.29) = 584 = 0x248, 지수는 1 + 15 = 16이므로 비트는 0 10000 1001001000 = 0x4248입니다.
- 값은 2 × (1 + 584/1024) = 3.140625입니다. 584/1024가 73/128과 정확히 같아 두 16비트 형식이 같은 값이 되었습니다.
| 10진수 | FP32 저장값 |
|---|---|
| 0.785 | 0.7853969932 |
| 1.57 | 1.570790052 |
| 2.36 | 2.356189966 |
| 3.14 | 3.141590118 |
| 3.93 | 3.926990032 |
| 4.71 | 4.712379932 |
| 6.28 | 6.283180237 |
결과 해석
입력값과의 차이가 반올림 오차입니다. 3.14159 − 3.140625 ≈ 0.000965로 상대 오차는 약 3 × 10⁻⁴입니다. 3 부근에서 FP16 값은 2⁻⁹ ≈ 0.00195, bf16 값은 2⁻⁶ ≈ 0.0156 간격이므로 다른 입력에서는 bf16 오차가 더 크게 나타납니다.
흔한 실수
- 범위가 넓은 bf16이 더 정밀하다고 여기는 것
- 65504를 넘는 값을 FP16에 넣어 무한대가 되는 것
- 큰 수에 작은 수를 더하는 것(FP16에서 2048 + 1은 2048입니다)
자주 묻는 질문
FP16의 최댓값은 얼마입니까?
65504이고, 가장 작은 양의 정규수는 2⁻¹⁴ ≈ 6.10 × 10⁻⁵입니다.
GPU가 bfloat16을 지원하는 이유는 무엇입니까?
메모리는 FP16처럼 절반으로 줄이면서 FP32의 지수 범위를 유지해 학습이 안정적이기 때문입니다.
FP16은 반정밀도와 같은 말입니까?
네. IEEE 754의 binary16 형식입니다.
출처: IEEE 754-2019, IEEE Standard for Floating-Point Arithmetic · Intel, BFLOAT16 – Hardware Numerics Definition, 2018