양자화, 정밀도를 깎으면 품질은 얼마나 떨어지나
요약
- 양자화는 16비트 실수로 저장하던 가중치와 활성값을 8비트나 4비트 정수, FP8 같은 저정밀 형식으로 바꿔 메모리와 대역폭을 줄이는 압축 기법입니다.
- 효과가 큽니다. 7B 모델을 FP16으로 두면 약 14GB라 소비자 GPU에 안 들어가지만, 4비트로 낮추면 약 3.5GB가 되어 노트북에서도 돕니다.
- 두 축으로 갈립니다. 언제 하느냐(학습 후 PTQ, 학습 중 QAT)와 무엇을 낮추느냐(가중치만, 가중치와 활성 둘 다)입니다.
- 핵심 난제는 활성값의 outlier입니다. LLM.int8부터 SmoothQuant, AWQ, GPTQ, 회전 기반 기법까지 전부 이 문제 하나를 푸는 계보입니다.
- 흔한 오해 하나. 비트를 줄인다고 항상 빨라지지 않습니다. 가중치만 양자화하면 메모리와 decode에 이득이고, 연산 자체를 빠르게 하려면 활성까지 정수로 만들어야 합니다.
왜 비트를 줄이면 이득인가
모델 크기는 대략 파라미터 수 곱하기 파라미터당 바이트입니다. 양자화는 이 바이트를 줄입니다.
| 정밀도 | 7B 모델 메모리 | 특징 |
|---|---|---|
| FP16 / BF16 | 약 14 GB | 파라미터당 2바이트, 기본 저장 형식 |
| INT8 | 약 7 GB | 거의 무손실 |
| INT4 | 약 3.5 GB | 품질과 크기 균형의 단골 |
메모리만 주는 게 아닙니다. 메모리에서 읽는 양이 줄어 토큰 생성 속도도 오릅니다. decode는 토큰 하나를 만들려고 가중치 전체를 읽는 구조라 메모리 대역폭에 묶여 있는데, 읽을 바이트가 절반이면 그만큼 빨라집니다.
가지치기(pruning)와 헷갈리면 안 됩니다. 양자화는 모든 가중치를 더 거칠게 표현하는 것이고(정밀도 감소), 가지치기는 일부 가중치를 아예 제거하는 것입니다(개수 감소). 목표는 비슷하지만 방식이 다르고 함께 쓸 수도 있습니다.
흔한 오해가 하나 있습니다. "비트를 줄이면 항상 빨라진다"가 아닙니다. 가중치만 양자화하면 실제 곱셈은 여전히 실수로 풀어서 합니다. 메모리와 decode에는 이득이지만 연산 자체는 그대로입니다. 연산을 빠르게 하려면 활성값까지 정수로 만들어 정수 텐서코어를 써야 합니다.
어떻게 동작하나
핵심은 스케일(scale)과 영점(zero-point) 한 쌍입니다. 정수축과 실수축을 잇는 변환 규칙을 이 두 값이 정합니다.
1. 범위 측정 한 묶음의 가중치 최댓값과 최솟값을 본다
2. 양자화 실수 x를 정수 q로 바꾼다
q = round(x / s) + z
3. 저장 정수 q와 scale, zero-point만 저장 → 용량 감소
4. 역양자화 계산할 때 다시 실수로 복원
x ≈ s × (q - z)
s는 한 칸의 크기고, z는 정수축에서 실수 0이 놓인 위치입니다.
전체 흐름은 이렇습니다.
FP16 가중치 x
│
▼
범위 측정 (max, min)
│
▼
양자화 q = round(x/s) + z
│
▼
저장 q(INT4) + scale, zero-point ← 여기서 용량이 준다
│
▼
역양자화 x ≈ s(q - z)
│
▼
계산에 사용
설계 손잡이가 둘 있습니다.
대칭이냐 비대칭이냐. 0을 기준으로 좌우 대칭이면 zero-point가 0이라 간단하고 빠릅니다. 분포가 한쪽으로 치우쳤으면 영점을 따로 둡니다.
세밀도를 어디까지 잡느냐. 텐서당보다 채널당이, 채널당보다 그룹당이 정밀합니다. 대신 저장할 scale 메타데이터가 늘어납니다. LLM 4비트는 보통 그룹당으로 하고 그룹 크기는 128을 씁니다. Llama 3.2는 32를 씁니다.
두 축으로 나누면 깔끔합니다
축 1. 언제 하나.
PTQ(Post-Training Quantization) 는 학습이 끝난 모델을 소량의 보정 데이터로 사후 양자화합니다. 싸고 빠릅니다. 수 분에서 수십 분이면 끝나고 재학습이 필요 없습니다. GPTQ, AWQ, SmoothQuant가 여기 속합니다.
QAT(Quantization-Aware Training) 는 학습 중에 양자화를 흉내 내며 모델이 저정밀에 적응하게 합니다. 정확도는 높지만 비쌉니다. BitNet처럼 처음부터 저비트로 학습하는 방식이 대표적입니다.
축 2. 무엇을 낮추나.
weight-only(W4A16 등) 는 가중치만 저정밀로 두고 활성은 그대로 둡니다. 메모리와 decode에 이득입니다.
weight와 activation 둘 다(W8A8, W4A4) 는 활성까지 정수화해서 정수 연산으로 계산을 빠르게 합니다. 대신 훨씬 어렵습니다. 그 이유가 바로 outlier입니다.
핵심 난제는 outlier입니다
대형 언어모델의 활성값에는 일부 채널에 극단적으로 큰 값이 생깁니다.
이런 채널이 하나라도 있으면 범위를 그 큰 값에 맞춰야 합니다. 그러면 나머지 대다수 값의 해상도가 뭉개집니다. 단순히 반올림해서 정수화하면 품질이 무너지는 이유가 여기 있습니다.
LLM 양자화 연구의 절반은 사실상 이 outlier를 어떻게 다루느냐의 이야기입니다.
outlier를 푸는 방법의 계보
활성 outlier 문제
│
┌───────────┬───────────┼───────────┬───────────┐
▼ ▼ ▼ ▼ ▼
LLM.int8() SmoothQuant GPTQ AWQ QuaRot/SpinQuant
(2022) (2022) (2022) (2023) (2024)
│ │ │ │ │
outlier 어려움을 Hessian로 중요 채널만 회전으로
채널만 가중치로 오차 보상 스케일 보호 outlier 분산
FP16으로 이전
분해 → W8A8 → W4 → W4 → W4A4
LLM.int8() 은 문제 있는 outlier 채널만 FP16으로 따로 계산하고 나머지는 INT8로 처리합니다. "예외만 고정밀로 빼두는" 가장 직관적인 대응입니다.
SmoothQuant 는 활성 쪽의 어려움을 수학적으로 동등한 변환으로 가중치 쪽에 넘깁니다. 활성과 가중치의 난이도를 고르게 나눠서 둘 다 양자화하기 쉬운 W8A8을 만듭니다.
GPTQ 는 층마다 근사 2차 정보를 써서, 한 가중치를 양자화하며 생긴 오차를 아직 양자화하지 않은 다음 가중치들이 보상하게 합니다. 3비트에서 4비트 구간에서 손실이 작아 사실상 표준이 됐습니다.
AWQ 는 출발점이 다릅니다. "가중치가 다 똑같이 중요하지는 않다"는 관찰에서 시작합니다. 상위 1퍼센트의 중요 채널만 보호해도 오차가 크게 줄어드는데, 어떤 채널이 중요한지를 활성 분포로 판단합니다. 그 채널만 스케일로 보호하고 나머지는 4비트로 낮춥니다. MLSys 2024 Best Paper입니다.
QuaRot과 SpinQuant 는 회전을 씁니다. 가중치와 활성을 연산상 등가인 회전 변환으로 돌려서, 특정 채널에 몰린 outlier를 여러 차원으로 골고루 분산시킨 뒤 4비트화합니다. SpinQuant는 이 회전 행렬 자체를 학습해서 최적화합니다.
정리하면 이렇습니다. GPTQ, AWQ, SmoothQuant는 보정 데이터 수백에서 수천 샘플로 수십 분 안에 끝나는 PTQ라 재학습이 필요 없습니다. 8비트는 거의 무손실이고, 4비트는 방법이 좋으면 작은 손실이며, 2비트에서 3비트는 방법이 아주 좋아야 버팁니다.
그리고 weight-only는 decode와 메모리에, W8A8이나 FP8은 prefill과 연산에 이득입니다. 무엇이 병목이냐로 고르면 됩니다.
비트폭 스펙트럼
얼마나 낮출지에 따라 형식이 갈립니다.
| 형식 | 비트 | 특징 |
|---|---|---|
| INT8 | 8 | 거의 무손실. 가장 안전한 선택 |
| FP8 (E4M3, E5M2) | 8 | 8비트 실수. 지수와 가수 배분이 다른 두 형식. Hopper와 Ada 세대 GPU가 하드웨어로 지원 |
| INT4 | 4 | weight-only 기준 품질과 크기 균형의 단골 |
| NF4 | 4 | 정규분포를 따르는 가중치에 정보이론적으로 맞춘 형식. QLoRA에서 제안 |
| MXFP4 | 4 | 블록 스케일을 가진 4비트 실수. gpt-oss가 네이티브로 씀 |
| ternary | 1.58 | 가중치를 -1, 0, +1 세 값으로 표현. 곱셈을 덧셈으로 바꿈. QAT가 필요 |
로컬 실행에서 자주 보는 GGUF의 Q4_K_M 은 평균 약 4.5bpw입니다. 품질과 크기 균형의 기본 추천값이고, Q8_0은 거의 무손실입니다.
DeepSeek-V3는 특이하게 학습 자체를 FP8 혼합정밀로 수행했습니다. 다만 임베딩, 출력, 게이팅, 정규화, 어텐션 같은 민감한 부분은 고정밀을 유지했습니다. 전부 낮추는 게 아니라 견딜 수 있는 곳만 낮춘 겁니다.
실제로는 어떻게 쓰나
| 도구 | 용도 |
|---|---|
bitsandbytes |
BitsAndBytesConfig로 8비트, 4비트(NF4) 로딩. QLoRA의 기반 |
GPTQModel |
GPTQ 양자화. 구 AutoGPTQ의 후속 |
llm-compressor |
AWQ. vLLM이 네이티브 지원 |
llama.cpp / GGUF |
Q4_K_M, Q8_0 같은 K-quant 레벨로 CPU와 Mac에서 실행 |
| vLLM FP8 | Hopper와 Ada에서 W8A8 지원 |
양자화된 채로 출고되는 모델도 늘고 있습니다.
Meta는 Llama-3.2-1B-Instruct-SpinQuant_INT4_EO8을 공식 배포합니다. 4비트 그룹 가중치에 8비트 동적 활성입니다. OpenAI의 gpt-oss-20b와 120b는 MXFP4로 네이티브 출고되어 120b가 단일 80GB GPU에 올라갑니다.
가장 흔한 실수는 활성 outlier를 무시하고 단순 반올림하는 것입니다. 품질이 붕괴합니다. SmoothQuant나 AWQ가 필요한 이유가 이겁니다.
발전사
| 시기 | 발전 | 대표 |
|---|---|---|
| 2017 | 정수 전용 추론과 QAT의 원조 | Jacob et al. |
| 2022 | LLM.int8() outlier 분해, SmoothQuant W8A8, FP8 형식 표준화 | Dettmers, Xiao, Micikevicius |
| 2022~23 | GPTQ Hessian PTQ, AWQ 중요 채널 보호, QLoRA/NF4 | Frantar, Lin, Dettmers |
| 2024 | BitNet b1.58, QuaRot/SpinQuant 회전 4비트, DeepSeek-V3 FP8 학습 | Ma, Ashkboos, Liu, DeepSeek |
마치며
핵심 세 가지로 정리합니다.
- 양자화는 scale과 zero-point로 실수와 정수를 오가며 정밀도를 낮춰 크기와 속도를 얻는 압축입니다.
- 방법은 언제(PTQ, QAT) 와 무엇을(가중치만, 활성까지) 두 축으로 갈리고, 최대 난제는 활성 outlier입니다.
- LLM.int8부터 SmoothQuant, AWQ, GPTQ, 회전 기반까지가 그 outlier를 푸는 하나의 계보이며, GPTQ와 AWQ가 사실상 4비트 표준입니다.
용어 정리
| 용어 | 한 줄 뜻 |
|---|---|
| 양자화 (Quantization) | 가중치와 활성을 적은 비트수로 표현해 크기와 속도를 얻는 압축 |
| scale / zero-point | 정수와 실수 변환의 칸 크기와 0의 위치 |
| PTQ / QAT | 사후 양자화(싸다) / 양자화 인지 학습(정확하다) |
| weight-only / W8A8 | 가중치만 저정밀 / 가중치와 활성까지 저정밀 |
| 세밀도 (granularity) | per-tensor, per-channel, group-wise. 정밀도와 메타데이터의 트레이드오프 |
| outlier | 활성의 극단값. LLM 양자화의 핵심 난제 |
| GPTQ | 근사 2차 정보로 오차를 보상하는 3~4비트 PTQ |
| AWQ | 활성 기준 중요 채널을 보호하는 weight-only 양자화 |
| SmoothQuant | 활성의 어려움을 가중치로 옮겨 W8A8을 쉽게 만듦 |
| NF4 | 정규분포에 최적화된 4비트 자료형 (QLoRA) |
| FP8 (E4M3, E5M2) | 8비트 실수 형식 두 가지. 지수와 가수 배분이 다름 |
| MXFP4 | 블록 스케일을 가진 4비트 실수 형식 |
| bpw | bits per weight. 가중치 1개당 평균 비트수 |
참고자료
- Jacob et al., "Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference" (CVPR 2018)
- Dettmers et al., "LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale" (NeurIPS 2022)
- Xiao et al., "SmoothQuant: Accurate and Efficient Post-Training Quantization for LLMs" (ICML 2023)
- Frantar et al., "GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers" (ICLR 2023)
- Lin et al., "AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration" (MLSys 2024)
- Dettmers et al., "QLoRA: Efficient Finetuning of Quantized LLMs" (NeurIPS 2023)
- Micikevicius et al., "FP8 Formats for Deep Learning" (arXiv:2209.05433)
- Ma et al., "The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits" (arXiv:2402.17764)
- Ashkboos et al., "QuaRot: Outlier-Free 4-Bit Inference in Rotated LLMs" (NeurIPS 2024)
- Liu et al., "SpinQuant: LLM Quantization with Learned Rotations" (ICLR 2025)
- DeepSeek-AI, "DeepSeek-V3 Technical Report" (arXiv:2412.19437)
'Inference > Quantization' 카테고리의 다른 글
| Quantization Formats (GGUF, GPTQ, AWQ, bitsandbytes) (0) | 2026.08.09 |
|---|
댓글