03. FP32, FP16, BF16, INT8, INT4
이 장의 핵심 연결: 02장의 "비트 폭 w"를 선택지로 엽니다. w를 정하는 것이 바로 정밀도(precision)이고, 이것이 storage 하한을 좌우했습니다.
다음 질문: 정밀도를 낮추면 무엇을 얻고(storage·대역폭), 무엇을 바꾸는가(수치 범위·정밀도·커널 지원·품질)? "낮은 정밀도가 더 낫다"는 왜 성급한가?
목표:
- 부동소수점과 정수 표현의 뼈대(부호·지수·가수)를 직관으로 잡는다.
- FP32/FP16/BF16/INT8/INT4를 우열이 아니라 절충으로 비교한다.
- 정밀도 라벨이 무엇을 보장하고 무엇을 보장하지 않는지의 경계를 읽는다.
먼저: 정밀도(precision)가 뭔가요?
숫자 하나를 몇 bit로, 어떤 방식으로 담을지의 규칙이 정밀도(또는 자료형, dtype)입니다. 02장에서 파라미터 하나당 비트 폭 w가 storage 하한을 정했죠. 그 w를 정하는 것이 이 장의 주제입니다.
라벨은 크게 두 갈래입니다.
- 부동소수점(floating point, FP): 소수를 "부호 × 가수 × 2^지수" 꼴로 담습니다. 넓은 범위의 크고 작은 수를 다룰 수 있습니다. 예: FP32, FP16, BF16.
- 정수(integer, INT): 정해진 간격의 정수만 담습니다. 양자화(quantization)로 실수 가중치를 정수 격자에 매핑해 씁니다. 예: INT8, INT4.
약어 풀이
- FP32/FP16: 32비트/16비트 부동소수점.
- BF16(bfloat16): 16비트지만 FP16과 비트 배분이 다른 부동소수점(아래 표).
- INT8/INT4: 8비트/4비트 정수.
- 양자화(quantization): 연속적인 실수값을 더 적은 비트의 이산 격자에 대응시키는 것. 서랍 칸을 줄이는 대신, 담을 수 있는 값의 "간격"이 성겨집니다.
일상 비유: 자의 눈금과 길이
숫자를 담는 것을 "자로 길이를 읽는 것"에 비유해 봅시다. 두 가지 성질이 있습니다.
- 범위(range): 이 자가 잴 수 있는 최대~최소 길이. 지수(exponent) 비트가 넓힙니다.
- 해상도(precision, 정밀도): 눈금이 얼마나 촘촘한가. 가수(mantissa) 비트가 촘촘하게 합니다.
같은 16 bit라도 이 둘을 어떻게 나눠 갖느냐가 다릅니다. FP16은 해상도에, BF16은 범위에 더 많이 배정합니다. 그래서 "16비트"라는 라벨이 같아도 성격이 다릅니다 — 비트 수만으로 우열을 말할 수 없는 첫 번째 이유입니다.
시각적 직관: 부동소수점의 비트 배분
flowchart TB
subgraph FP32["FP32 · 32 bit"]
S1[부호 1]:::sign --- E1[지수 8]:::exp --- M1[가수 23]:::man
end
subgraph FP16["FP16 · 16 bit"]
S2[부호 1]:::sign --- E2[지수 5]:::exp --- M2[가수 10]:::man
end
subgraph BF16["BF16 · 16 bit"]
S3[부호 1]:::sign --- E3[지수 8]:::exp --- M3[가수 7]:::man
end
classDef sign fill:#fef9c3,stroke:#ca8a04,color:#713f12
classDef exp fill:#cffafe,stroke:#0891b2,color:#164e63
classDef man fill:#ede9fe,stroke:#7c3aed,color:#4c1d95
읽는 법: BF16은 지수 8비트로 FP32와 같은 범위를 갖지만, 가수가 7비트로 해상도는 FP16보다 낮습니다. FP16은 반대로 범위는 좁지만 해상도가 높습니다. 같은 16비트지만 "무엇을 챙겼나"가 다릅니다. (구체적 지수/가수 비트 배분은 IEEE 754 등 표준·정의에 따른 것으로, 이는 안정적 원리입니다.)
핵심 비교표: 우열이 아니라 절충
아래 표는 순위표가 아닙니다. 각 라벨이 "무엇을 얻고 무엇을 바꾸는지"를 정리한 것입니다.
| 라벨 | 비트 폭 w | storage 하한(상대) | 얻는 것 | 바꾸는(잃을 수 있는) 것 |
|---|---|---|---|---|
| FP32 | 32 | 기준 (1.0×) | 넓은 범위 + 높은 해상도 | 메모리·대역폭 부담이 큼 |
| FP16 | 16 | 0.5× | 메모리·대역폭 절반, 높은 해상도 | 범위가 좁아 매우 크거나 작은 값에서 오버/언더플로 위험 |
| BF16 | 16 | 0.5× | 메모리·대역폭 절반, FP32급 범위 | FP16보다 해상도 낮음 |
| INT8 | 8 | 0.25× | 메모리·대역폭 1/4, 정수 연산 이점 가능 | 양자화 간격이 성겨 정보 손실 가능, 스케일·보정 필요 |
| INT4 | 4 | 0.125× | 메모리·대역폭 1/8 | 손실이 더 커질 수 있음, 품질 영향 워크로드마다 다름 |
📌 핵심: 정밀도를 낮추면 02장의 storage 하한이 비트 폭에 비례해 줄어듭니다. 32→16이면 절반, 32→8이면 1/4. 대역폭 부담(06장)도 같이 줍니다. 하지만 그 대가로 수치 범위·해상도·품질이 바뀔 수 있고, 그 크기는 워크로드에 따라 다릅니다.
⚖️ 절충(tradeoff): 정밀도를 낮출 때
CODE
얻는 것 (대체로 예측 가능):
- storage 하한 ↓ (w에 비례, 02장 산술)
- 메모리 대역폭 부담 ↓ (같은 데이터를 더 적은 바이트로)
- 경우에 따라 연산 처리량 ↑ (하드웨어·커널이 그 dtype을 지원할 때)
바꾸는 것 (워크로드 의존, 단정 불가):
- 표현 가능한 수치 범위 (FP16의 경우 특히)
- 값의 해상도 (INT4로 갈수록 간격 성김)
- 최종 품질 (작업·모델·양자화 방법에 따라 영향이 다름)
성립을 위한 숨은 전제:
- 하드웨어·소프트웨어(커널·라이브러리)가 그 dtype을 실제로 지원해야
"속도 이득"이 실현됨. 지원 없으면 메모리만 줄고 속도 이득은 없을 수 있음.
⚠️ 흔한 오해 (이름 우열 함정)
- "낮은 정밀도 = 항상 빠르고 이득." — 아닙니다. 속도 이득은 하드웨어·커널이 그 dtype을 지원할 때만 실현됩니다. 지원이 없으면 메모리·storage만 줄고 연산 속도는 그대로일 수 있습니다.
- "BF16이 FP16보다 좋다 / FP16이 BF16보다 좋다." — 비트 수가 같아도 범위와 해상도의 배분이 다를 뿐 우열이 아닙니다. 어느 쪽이 맞는지는 값의 분포·워크로드에 달렸습니다.
- "INT4면 품질이 반드시 나빠진다." — 정도는 작업·모델·양자화 방법에 따라 다릅니다. "반드시"라고 단정할 수 없습니다(measured로 확인할 문제).
- "메모리가 절반이니 속도도 절반으로 빨라진다." — storage와 속도는 다른 축입니다. 메모리 감소가 곧 비례하는 속도 향상은 아닙니다(05·06장의 병목이 결정).
조건 명시
| 내용 | |
|---|---|
| 성립하는 조건 | "비트 폭이 절반이면 가중치 storage 하한도 절반"은 산술적으로 항상 참(calculated). 대역폭 부담이 주는 것도 데이터가 작아지므로 성립. |
| 성립하지 않는 결론 | "정밀도를 낮추면 항상 빨라진다/품질은 그대로다"는 성립하지 않습니다. 속도 이득은 dtype 지원 여부에, 품질 영향은 워크로드에 달렸습니다. 이것들은 measured로 확인할 문제이지, 라벨만 보고 단정할 수 없습니다. |
🔬 증거 읽기: 정밀도 관련 주장의 유형
- "FP16은 storage가 FP32의 절반" → calculated (02장 식에서 바로 나옴).
- "이 하드웨어는 INT8 연산을 지원한다" → vendor-reported (제품 사양 PRIMARY일 수 있으나, 독립 검증과는 다름).
- "이 모델을 INT4로 양자화해도 이 작업 품질이 X% 유지된다" → measured 여야 하며, 작업·데이터·양자화 방법 등 조건을 반드시 밝혀야 함. 조건이 다르면 "같은 결과"가 아니라 새 실험(REPRODUCTION의 원칙).
이 장에서 배운 것
- 정밀도는 파라미터 하나당 비트 폭 w를 정하고, 그래서 02장의 storage 하한을 좌우한다.
- 부동소수점은 범위(지수)와 해상도(가수)를 나눠 갖는다. 같은 16비트라도 FP16·BF16은 배분이 다르다.
- 정밀도를 낮추면 storage·대역폭은 예측 가능하게 줄지만, 범위·해상도·품질은 워크로드에 따라 바뀐다.
- 속도 이득은 dtype 지원이라는 숨은 전제를 필요로 한다. 라벨만으로 우열·속도를 단정할 수 없다.
🔎 이 장의 '지지하지 않는 결론'
- 이 장으로 "INT4가 FP16보다 낫다/못하다"를 일반적으로 말할 수 없다. 그건 작업·모델·양자화 방법에 따른 measured 문제다.
- "정밀도를 낮췄으니 이 모델이 더 빠를 것이다"를 단정할 수 없다. 속도는 하드웨어·커널 지원과 병목(05장)이 결정한다.
✍️ 확인 문제
- FP16과 BF16은 둘 다 16비트인데 왜 하나로 "16비트가 최고"라고 줄 세울 수 없나요? 각각 무엇을 챙기고 무엇을 포기하나요?
- "정밀도를 FP32에서 INT8로 낮췄으니 추론이 4배 빨라진다"는 주장에서 빠진 전제 두 가지를 지적하세요.
- [조건 묻기 / 주장 유형] "이 모델은 INT4로 양자화해도 품질이 유지된다"가 신뢰할 만한 주장이 되려면 어떤 조건을 함께 밝혀야 하나요? 이 주장은 measured/calculated/vendor-reported 중 어느 유형이어야 하나요?
다음 장: 04 · CPU, GPU, NPU — 지금까지의 숫자(비트·정밀도)가 흐르는 가속기를 엽니다. 이름의 우열이 아니라 실행 모델·메모리·소프트웨어 지원이라는 조건을 묻습니다. (다음 묶음에서 제작)