검색
← 모듈 로드맵

수치 형식 · 혼합 정밀도 · 양자화

강의 · 준전문가 · KAITABASE 정리

원제 · Number Formats, Mixed Precision and Quantization

FP16 · BF16 · FP8 구조, 혼합 정밀도 · 손실 스케일링, INT8 · INT4 양자화를 손계산하는 수업

먼저 알아야 할 것

2진수와 비트학습 메모리 16바이트 규칙행렬 곱반올림 오차

다루는 내용

부동소수점의 지수 · 가수가 범위와 정밀도를 정하는 원리로 FP32 · FP16 · BF16 · FP8을 비교합니다. 혼합 정밀도 학습의 FP32 원본 가중치와 손실 스케일링을 숫자로 확인하고, absmax · 영점 양자화와 이상치 문제를 손계산합니다. LLM.int8() · GPTQ · AWQ의 핵심 아이디어를 정리합니다.

해설

수치 형식 · 혼합 정밀도 · 양자화

같은 모델이라도 숫자 하나를 몇 비트로 저장하느냐에 따라 메모리와 속도가 몇 배씩 달라집니다. 70억 파라미터 모델은 32비트로 28GB, 16비트로 14GB, 4비트로 3.5GB입니다. 이 수업에서는 FP32 · FP16 · BF16 · FP8이 무엇이 다른지, 학습을 16비트로 하면서도 정확도를 지키는 혼합 정밀도 의 두 장치(FP32 원본 가중치 · 손실 스케일링), 그리고 추론용으로 8비트 · 4비트로 줄이는 양자화 를 손계산으로 익힙니다.

항목내용
참고 출처Hugging Face 양자화 문서 · 혼합 정밀도 학습(arXiv 1710.03740) · FP8 형식(arXiv 2209.05433) · LLM.int8()(arXiv 2208.07339) · GPTQ(arXiv 2210.17323) · AWQ(arXiv 2306.00978)
트랙 · 수준스케일링·효율 · 중급
이 수업이 다루는 범위부동소수점 구조(부호 · 지수 · 가수), FP32 · FP16 · BF16 · FP8, 혼합 정밀도, 손실 스케일링, 대칭(absmax) · 비대칭(영점) 양자화, 이상치 문제, 그룹 단위 양자화, LLM.int8() · GPTQ · AWQ 개요

들어가기 전에

한눈에 보기

  • 부동소수점의 지수 비트는 범위, 가수 비트는 정밀도 를 정한다는 것을 압니다.
  • BF16이 FP16보다 학습에 편한 이유(같은 16비트지만 범위가 FP32와 같음)를 설명할 수 있습니다.
  • 손실 스케일링이 아주 작은 기울기를 0이 되지 않게 지키는 원리를 숫자로 봅니다.
  • absmax · 영점 양자화를 직접 계산하고, 이상치 하나가 양자화를 망치는 이유를 확인합니다.
  • LLM.int8() · GPTQ · AWQ가 각각 어떤 문제를 푸는지 구분합니다.

1. 부동소수점: 범위와 정밀도

직관(해설용 비유). 과학적 표기 1.23×1051.23\times10^{5} 를 떠올립니다. 앞의 1.231.23 이 가수(유효숫자), 10510^5 의 5가 지수 입니다. 유효숫자 칸이 많으면 촘촘하게(정밀하게), 지수 칸이 넓으면 아주 크고 작은 수까지(넓은 범위) 쓸 수 있습니다. 컴퓨터는 이것을 2진수로 하고, 정해진 비트를 부호 · 지수 · 가수에 나눠 줍니다.

형식전체부호지수가수특징
FP32321823기준. 범위 넓고 정밀
FP16161510정밀도는 괜찮지만 범위가 좁음(최댓값 65,504)
BF1616187FP32와 같은 범위, 정밀도는 낮음
FP8 E4M38143최댓값 448. 가중치 · 활성화용
FP8 E5M28152최댓값 57,344. 기울기용

FP32 · FP16의 비트 배치와 최댓값은 IEEE 754 표준이며 넘파이(np.finfo)로 확인했습니다. BF16은 FP32의 위쪽 16비트를 그대로 쓴 형식이라 지수가 8비트로 같고, 구글 클라우드 문서도 BF16과 FP32의 동적 범위가 같다고 설명합니다. FP8 두 형식과 최댓값(448, 57,344), 용도 권장(순전파에는 E4M3, 기울기에는 E5M2 변형)은 FP8 형식 논문(Micikevicius 외, 2022)의 내용입니다.

숫자로 해 보기(코드로 확인).

  • π≈3.14159\pi\approx3.14159 는 FP16에서 3.1403.140, BF16에서 3.14063.1406 으로 저장됩니다. 둘 다 소수 셋째 자리쯤에서 오차가 납니다.
  • 100,000100{,}000 은 FP16에서 표현 범위를 넘어 무한대(inf)가 되지만, BF16에서는 문제없습니다(103810^{38} 근처까지 가능).
  • 10−810^{-8} 은 FP16에서 0이 됩니다(가장 작은 양수가 약 6×10−86\times10^{-8}).

왜 BF16이 학습에 편한가. 학습 중 기울기와 활성화는 크기가 아주 넓게 퍼집니다. FP16은 범위가 좁아 넘침(overflow) · 사라짐(underflow)을 따로 관리해야 하지만, BF16은 FP32와 범위가 같아 그런 관리가 덜 필요합니다. 대신 가수가 7비트라 정밀도가 낮습니다.

2. 혼합 정밀도 학습

문제. 16비트로 학습하면 메모리와 대역폭이 반으로 줄고 텐서 코어로 빨라집니다. 그런데 그냥 바꾸면 정확도가 떨어집니다. Micikevicius 외(2017)는 두 가지 장치로 이를 해결했습니다.

장치 1: FP32 원본 가중치(master weights). 순전파 · 역전파는 FP16으로 하되, 가중치의 FP32 사본을 따로 두고 업데이트는 거기에 합니다. 이유: 업데이트 크기(학습률 × 기울기)가 아주 작으면 FP16에서는 0이 되거나 큰 가중치에 더해도 반올림으로 사라집니다. 논문은 FP16에서 2−242^{-24} 보다 작은 값은 0이 되고, 한 음성 인식 모델에서는 가중치 기울기의 약 5%가 이 범위였다고 보고합니다.

장치 2: 손실 스케일링(loss scaling). 역전파 전에 손실에 큰 수 SS 를 곱하면 연쇄 법칙에 따라 모든 기울기도 SS 배가 됩니다. 작은 기울기가 FP16의 표현 범위 안으로 올라옵니다. 업데이트 직전에 FP32에서 SS 로 다시 나눕니다.

∇θ(S⋅L)=S⋅∇θL⇒gFP32=(FP16로 계산한 S∇L)S\nabla_\theta (S\cdot L) = S\cdot \nabla_\theta L \quad\Rightarrow\quad g_\text{FP32} = \frac{\text{(FP16로 계산한 } S\nabla L)}{S}

숫자로 해 보기(코드로 확인). 기울기 10−810^{-8} 은 FP16에서 0입니다. S=1024S=1024 를 곱하면 1.024×10−51.024\times10^{-5} 로 FP16에 담기고(저장값 1.025×10−51.025\times10^{-5}), FP32로 옮겨 1024로 나누면 약 1.0012×10−81.0012\times10^{-8} 으로 거의 되살아납니다. 논문은 SSD 객체 탐지 모델이 스케일링 없이는 발산했지만 8배 스케일링으로 FP32 정확도를 맞췄다고 보고합니다. SS 가 너무 크면 이번엔 넘침이 생기므로, 실제 프레임워크는 inf가 나오면 SS 를 줄이고 한동안 괜찮으면 늘리는 '동적 스케일링'을 씁니다.

BF16이면? 범위가 FP32와 같아 작은 기울기가 0이 되는 문제가 훨씬 적습니다. 그래서 BF16 학습에서는 손실 스케일링을 생략하는 경우가 많습니다. 다만 FP32 원본 가중치는 여전히 둡니다. 이것이 16바이트 규칙 의 'FP32 사본 4바이트'입니다.

3. 양자화: 추론용으로 더 줄이기

직관. 실수 가중치를 정수 몇 단계로 '반올림'해 저장합니다. 저울 눈금을 256칸(8비트)이나 16칸(4비트)으로 줄이는 것과 같습니다. 저장할 때는 정수와 '눈금 간격(스케일)'만 두고, 계산할 때 되돌립니다.

3-1. 대칭(absmax) 양자화

LLM.int8() 논문의 정의대로, 벡터의 절댓값 최댓값이 127이 되도록 스케일을 정합니다.

s=127max⁡i∣xi∣,qi=round(s xi),x^i=qi/ss = \frac{127}{\max_i |x_i|},\qquad q_i=\mathrm{round}(s\,x_i),\qquad \hat x_i = q_i/s
기호뜻
xix_i원래 값(FP16 등)
ss스케일(눈금 간격의 역수)
qiq_i저장되는 정수(−127~127)
x^i\hat x_i되돌린 값(역양자화)

숫자로 해 보기(코드로 확인). x=(0.52, −1.23, 0.31, 2.54)x=(0.52,\ -1.23,\ 0.31,\ 2.54).

  • INT8: s=127/2.54=50s=127/2.54=50 → q=(26, −62, 16, 127)q=(26,\ -62,\ 16,\ 127) → x^=(0.52, −1.24, 0.32, 2.54)\hat x=(0.52,\ -1.24,\ 0.32,\ 2.54). 오차는 최대 0.01입니다.
  • INT4(−7~7): s=7/2.54≈2.756s=7/2.54\approx2.756 → q=(1, −3, 1, 7)q=(1,\ -3,\ 1,\ 7) → x^≈(0.363, −1.089, 0.363, 2.54)\hat x\approx(0.363,\ -1.089,\ 0.363,\ 2.54). 평균 절대 오차가 약 0.088로, 8비트(0.005)보다 훨씬 큽니다.

3-2. 이상치(outlier) 문제

같은 벡터의 마지막 값이 60이라면? s=127/60≈2.117s=127/60\approx2.117 → q=(1, −3, 1, 127)q=(1,\ -3,\ 1,\ 127) → x^≈(0.47, −1.42, 0.47, 60)\hat x\approx(0.47,\ -1.42,\ 0.47,\ 60). 큰 값 하나 때문에 눈금이 성겨져 나머지 작은 값들이 거의 뭉개집니다. LLM.int8() 논문은 67억(6.7B) 파라미터 규모부터 모든 트랜스포머 층에 크기가 아주 큰 '창발적 이상치 특징'이 나타나 단순한 8비트 양자화의 정밀도를 망친다고 보고했습니다.

3-3. 비대칭(영점) 양자화

ReLU 뒤의 값처럼 0 이상만 있으면 absmax는 음수 칸을 낭비합니다. 영점 양자화는 최솟값~최댓값을 정수 범위 전체에 펼치고, 실수 0이 어느 정수에 대응하는지(영점)를 함께 저장합니다.

숫자로 해 보기(해설용, 0~255 부호 없는 8비트). y=(0, 0.5, 1.0, 3.0)y=(0,\ 0.5,\ 1.0,\ 3.0) 이면 스케일 255/3=85255/3=85, 영점 0 → q=(0, 42, 85, 255)q=(0,\ 42,\ 85,\ 255), 되돌리면 (0, 0.494, 1.0, 3.0)(0,\ 0.494,\ 1.0,\ 3.0). 같은 값에 absmax를 쓰면 q=(0,21,42,127)q=(0,21,42,127) 로 눈금의 절반만 씁니다.

3-4. 그룹(블록) 단위로 나누기

스케일을 행렬 전체에 하나만 두면 이상치 영향이 넓게 퍼집니다. 그래서 행 · 열마다(벡터 단위), 또는 64개 · 128개씩 묶은 블록마다 스케일을 따로 둡니다. 스케일 저장 비용이 조금 늘지만 오차가 크게 줄어듭니다. QLoRA 의 4비트 NF4도 블록마다 스케일을 둡니다.

4. LLM 양자화 기법 세 가지

기법핵심 아이디어논문이 보고한 것
LLM.int8() (Dettmers 외, 2022)벡터 단위 INT8 + 이상치 차원만 16비트로 따로 계산(혼합 정밀도 분해)99.9% 이상의 값은 8비트로 곱하면서, 175B 모델까지 성능 저하 없이 추론 메모리를 절반으로
GPTQ (Frantar 외, 2022)근사 2차 정보(헤시안)를 써서 한 층씩, 반올림 오차를 남은 가중치가 보상하도록 양자화175B 모델을 GPU 약 4시간에 가중치당 3~4비트로, 정확도 손실은 무시할 수준. A100에서 FP16 대비 약 3.25배 속도
AWQ (Lin 외, 2023)중요한 가중치 채널은 활성화 크기 로 찾고, 그 채널을 미리 키워(스케일) 보호중요한 가중치 1%만 보호해도 양자화 오차가 크게 줄어듦. 역전파 · 재구성 없이 동작

공통점과 차이. 셋 다 "모든 가중치가 똑같이 중요하지 않다"는 관찰에서 출발합니다. LLM.int8()은 이상치를 따로 빼고, GPTQ는 오차를 다른 가중치로 메우고, AWQ는 중요한 채널을 미리 키워 반올림 피해를 줄입니다. GPTQ · AWQ는 보통 가중치만 4비트로 줄이는 방식(가중치 전용 양자화)이라, 계산할 때는 다시 16비트로 펴서 곱합니다. 이득은 주로 메모리와 메모리 대역폭 에서 나옵니다(→ 추론 최적화).

mermaid
flowchart LR
  W[FP16 가중치] --> G[블록으로 나누기]
  G --> S[블록마다 스케일 계산<br/>absmax 또는 영점]
  S --> Q[정수로 반올림<br/>INT8 · INT4]
  Q --> ST[(정수 + 스케일 저장)]
  ST --> DQ[추론 때 역양자화]
  DQ --> MM[16비트 행렬 곱]
  X[입력 활성화] --> MM
  MM --> Y[출력]

실무 감각. 7B 모델은 FP16 14GB, INT8 7GB, INT4 3.5GB(가중치만)입니다. 노트북 · 소비자용 GPU에서 LLM을 돌릴 때 4비트 양자화 모델을 많이 쓰는 이유입니다. 비트를 줄일수록 품질 손실 위험이 커지므로, 자신의 과제로 평가해 보고 고르는 것이 원칙입니다.

연습 문제

  1. x=(1.0, −0.5, 4.0)x=(1.0,\ -0.5,\ 4.0) 을 INT8 absmax로 양자화하세요.
    • 풀이: s=127/4=31.75s=127/4=31.75 → q=round(31.75, −15.875, 127)=(32, −16, 127)q=\mathrm{round}(31.75,\ -15.875,\ 127)=(32,\ -16,\ 127) → x^≈(1.008, −0.504, 4.0)\hat x\approx(1.008,\ -0.504,\ 4.0) 입니다.
  2. 13B 모델의 가중치를 INT4로 저장하면 몇 GB?
    • 풀이: 13×109×0.513\times10^9\times0.5 바이트 =6.5=6.5 GB입니다(스케일 저장분 제외).
  3. FP16 학습에서 기울기가 3×10−93\times10^{-9} 이면 어떻게 되며, 손실 스케일 S=4096S=4096 이면?
    • 풀이: 그대로는 0이 됩니다. SS 를 곱하면 약 1.2×10−51.2\times10^{-5} 로 FP16에 담깁니다.
  4. 같은 16비트인데 BF16이 FP16보다 정밀도가 낮은 이유는?
    • 풀이: 지수에 8비트를 써서 가수가 7비트뿐이기 때문입니다(FP16은 지수 5 · 가수 10).

스스로 점검

  1. 혼합 정밀도에서 FP32 원본 가중치가 필요한 이유는?
    • 답: 학습률을 곱한 업데이트가 FP16에서는 0이 되거나 반올림으로 사라질 수 있어, 업데이트를 정밀한 FP32 사본에 누적해야 하기 때문입니다.
  2. 이상치 하나가 absmax 양자화를 망치는 원리는?
    • 답: 스케일이 최댓값으로 정해지므로 이상치가 눈금을 크게 벌려, 나머지 작은 값들이 몇 개의 정수로 뭉개집니다.
  3. 가중치만 4비트로 줄인 모델이 왜 빨라질 수 있나요?
    • 답: LLM 추론(특히 토큰을 하나씩 만드는 단계)은 가중치를 메모리에서 읽어 오는 시간이 병목인데, 읽을 바이트가 4분의 1로 줄기 때문입니다.

용어 정리

용어쉬운 뜻
지수 · 가수부동소수점의 범위를 정하는 칸 · 정밀도를 정하는 칸
BF16FP32의 범위를 유지한 16비트 형식
FP88비트 부동소수점(E4M3 · E5M2 두 종류)
혼합 정밀도계산은 16비트, 업데이트 누적은 32비트로 하는 학습
손실 스케일링손실에 큰 수를 곱해 작은 기울기가 0이 되지 않게 하는 기법
양자화실수를 적은 비트의 정수로 바꿔 저장 · 계산하는 것
absmax · 영점 양자화최댓값 기준 대칭 양자화 · 최소~최대를 펼치는 비대칭 양자화
이상치 특징값이 유난히 큰 소수의 차원
가중치 전용 양자화가중치만 줄이고 활성화는 16비트로 두는 방식

더 깊이 보려면

다음에 볼 것

라이선스

본문은 KAITABASE 자체 해설입니다. 수치 형식의 비트 구성은 IEEE 754(넘파이로 확인)와 각 원 논문 · 공식 문서에서, 기법별 결과는 각 arXiv 원문에서 확인한 것만 옮겼습니다. 양자화 · 손실 스케일링 숫자 예는 해설용이며 파이썬으로 검산했습니다.

출처

  • Micikevicius 외, Mixed Precision Training (2017): https://arxiv.org/abs/1710.03740
  • Micikevicius 외, FP8 Formats for Deep Learning (2022): https://arxiv.org/abs/2209.05433
  • Dettmers 외, LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale (2022): https://arxiv.org/abs/2208.07339
  • Frantar 외, GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers (2022): https://arxiv.org/abs/2210.17323
  • Lin 외, AWQ: Activation-aware Weight Quantization (2023): https://arxiv.org/abs/2306.00978
  • Google Cloud TPU, bfloat16 문서: https://docs.cloud.google.com/tpu/docs/bfloat16
  • Hugging Face Transformers 양자화 개요: https://huggingface.co/docs/transformers/main/en/quantization/overview

AI 원리부터 이해하기 · 스케일링·효율 모듈

스케일링·효율 모듈 학습

이 글은 스케일링·효율 모듈의 학습 자료입니다. 전체 19개 자료 중 5번째입니다.

AI 기초 과정은 현재 진도 저장을 지원하지 않습니다.

출처·원문

원문 보기

요약만

본문 자체 작성 · 참고 자료 Hugging Face 문서 · arXiv 원 논문