모델 양자화의 핵심 원리, 부동소수점과 정수 표현, 양자화 형식(대칭/비대칭, 채널/그룹), 품질-크기 트레이드오프를 체계적으로 다룹니다.
1장에서 온디바이스 AI의 전체 지형을 조망했습니다. 이 장에서는 온디바이스 추론의 가장 핵심적인 기술인 모델 양자화(Model Quantization) 의 원리를 다룹니다. 수십 GB의 모델을 몇 GB로 줄이면서도 품질을 유지하는 방법을 이해합니다.
신경망의 가중치(weight)와 활성화(activation)는 부동소수점 숫자로 표현됩니다. 양자화는 이 숫자들을 더 낮은 정밀도로 변환하는 과정입니다.
FP32 (32비트 부동소수점):
부호(1) + 지수(8) + 가수(23) = 32비트
범위: ±3.4 × 10^38, 정밀도: ~7자리
FP16 (16비트 부동소수점):
부호(1) + 지수(5) + 가수(10) = 16비트
범위: ±6.5 × 10^4, 정밀도: ~3자리
BF16 (Brain Float 16):
부호(1) + 지수(8) + 가수(7) = 16비트
범위: FP32와 동일, 정밀도: ~2자리
INT8 (8비트 정수):
범위: -128 ~ 127 (또는 0 ~ 255)
256개의 이산 값
INT4 (4비트 정수):
범위: -8 ~ 7 (또는 0 ~ 15)
16개의 이산 값
양자화는 연속적인 부동소수점 값을 이산적인 정수 값으로 매핑합니다.
양자화: q = round((x - zero_point) / scale)
역양자화: x_approx = q * scale + zero_point
여기서:
x: 원본 FP 값
q: 양자화된 정수 값
scale: 스케일 팩터 (범위 매핑)
zero_point: 영점 오프셋
대칭 양자화 (zero_point = 0):
범위: [-max_abs, max_abs] → [-128, 127] (INT8)
장점: 계산이 단순
단점: 비대칭 분포에서 비효율적
비대칭 양자화 (zero_point ≠ 0):
범위: [min, max] → [0, 255] (UINT8)
장점: 분포에 더 잘 적응
단점: 계산이 약간 복잡
LLM의 가중치 분포는 대체로 0을 중심으로 대칭이므로, 가중치에는 대칭 양자화가 효과적입니다. 반면 활성화(activation) 값은 비대칭 분포를 가질 수 있어 비대칭 양자화가 유리한 경우가 있습니다.
각 출력 채널(뉴런)마다 독립적인 scale과 zero_point를 사용합니다.
채널 0: scale=0.02, zero_point=0
채널 1: scale=0.05, zero_point=0
채널 2: scale=0.01, zero_point=0
...
가중치를 고정 크기 그룹(예: 128개)으로 나누어 각 그룹에 독립적인 양자화 파라미터를 적용합니다.
그룹 크기 128:
[w0, w1, ..., w127] → scale_0, zero_point_0
[w128, w129, ..., w255] → scale_1, zero_point_1
...
그룹 크기가 작을수록 정밀도가 높아지지만, 메타데이터(scale, zero_point) 저장 비용이 증가합니다.
| 세분화 | 정밀도 | 메타데이터 비용 | 사용처 |
|---|---|---|---|
| 텐서별 | 낮음 | 최소 | INT8 가속기 |
| 채널별 | 중간 | 적음 | 일반적 양자화 |
| 그룹별 (128) | 높음 | 중간 | GGUF, AWQ |
| 그룹별 (32) | 매우 높음 | 많음 | 고정밀 양자화 |
학습이 완료된 모델에 양자화를 적용합니다. 추가 학습이 필요 없어 빠르고 간편합니다.
# 1. 학습된 FP16 모델 로드
model = load_model("model_fp16.bin")
# 2. 캘리브레이션 데이터로 분포 분석
calibration_data = load_calibration_dataset(num_samples=512)
statistics = analyze_weight_distributions(model, calibration_data)
# 3. 양자화 파라미터 결정 및 적용
quantized_model = quantize(model, statistics, bits=4, group_size=128)
# 4. 양자화된 모델 저장
save_model(quantized_model, "model_q4.gguf")학습 과정에서 양자화 효과를 시뮬레이션하여, 양자화에 강건한 가중치를 학습합니다.
순전파: FP 가중치 → 양자화 시뮬레이션 → FP 활성화 → 손실 계산
역전파: 그래디언트 → STE(Straight-Through Estimator) → FP 가중치 업데이트
QAT는 PTQ보다 높은 품질을 달성하지만, 추가 학습이 필요하므로 비용이 높습니다.
| 방식 | 품질 | 비용 | 시간 | 사용 시기 |
|---|---|---|---|---|
| PTQ | 양호 | 낮음 | 분~시간 | 대부분의 경우 |
| QAT | 우수 | 높음 | 일~주 | 극한 양자화(2~3비트) |
| 양자화 | 모델 크기 | Perplexity | 체감 품질 |
|---|---|---|---|
| FP16 | 16 GB | 기준 (1.0x) | 최상 |
| Q8_0 | 8.5 GB | ~1.01x | 거의 무손실 |
| Q6_K | 6.6 GB | ~1.02x | 미세한 차이 |
| Q5_K_M | 5.7 GB | ~1.03x | 약간의 차이 |
| Q4_K_M | 4.9 GB | ~1.05x | 실용적 |
| Q3_K_M | 3.9 GB | ~1.10x | 눈에 띄는 차이 |
| Q2_K | 3.2 GB | ~1.25x | 상당한 품질 저하 |
실무에서 가장 많이 사용되는 양자화 수준은 Q4_K_M (4비트, K-quants, 중간 크기)입니다. FP16 대비 약 30%의 크기로 줄이면서도 대부분의 작업에서 실용적인 품질을 유지합니다. Q5_K_M이 품질 대비 가장 좋은 균형점이라는 의견도 많지만, 메모리 제약이 있는 환경에서는 Q4_K_M이 합리적인 선택입니다.
큰 모델의 낮은 양자화 vs 작은 모델의 높은 양자화
예시:
Llama 3.1 70B Q4_K_M (~40GB): 높은 추론 품질
Llama 3.1 8B FP16 (~16GB): 중간 추론 품질
→ 메모리가 충분하다면 "큰 모델 + 낮은 비트"가
"작은 모델 + 높은 비트"보다 대체로 우수
모든 레이어를 같은 비트로 양자화하지 않고, 레이어의 중요도에 따라 다른 비트를 적용합니다.
Attention 레이어: Q6 (높은 정밀도 — 품질에 민감)
FFN 레이어: Q4 (낮은 정밀도 — 파라미터 수가 많음)
임베딩 레이어: Q8 (높은 정밀도 — 입출력 품질)
이 접근법은 같은 평균 비트에서 균일 양자화보다 높은 품질을 달성합니다. GGUF의 K-quants(Q4_K_M, Q5_K_S 등)가 이 원리를 적용한 대표적 형식입니다.
모델 양자화는 FP32/FP16 가중치를 INT8/INT4 등으로 변환하여 모델 크기와 메모리 사용량을 줄이는 핵심 기술입니다. 대칭/비대칭 양자화, 채널/그룹별 세분화, PTQ/QAT 시점, 혼합 정밀도 등의 기법을 이해하면 작업과 하드웨어에 맞는 최적의 양자화 전략을 선택할 수 있습니다.
다음 장에서는 온디바이스 LLM 추론의 사실상 표준인 GGUF 형식과 llama.cpp 생태계를 다룹니다.
이 글이 도움이 되셨나요?
관련 주제 더 보기
온디바이스 LLM 추론의 핵심인 GGUF 형식과 llama.cpp의 아키텍처, 설치와 사용법, 성능 최적화, 그리고 주요 프론트엔드 도구를 다룹니다.
온디바이스 AI의 필요성, 클라우드 추론 대비 장단점, 핵심 기술 스택, 그리고 현재 기술 수준과 한계를 조망합니다.
GPU 추론에 최적화된 AWQ와 GPTQ 양자화 기법의 원리, 차이점, 그리고 GGUF와의 비교를 통해 상황별 최적 양자화 전략을 제시합니다.