출처: https://ngrok.com/blog/quantization
주요 주제
이 글은 대형 언어 모델(LLM)의 양자화(Quantization) 를 기초부터 자세히 설명합니다. LLM이 너무 커서 일반 PC나 노트북에서 돌리기 어려운 문제를 해결하기 위해, 모델 크기를 줄이면서도 성능을 최대한 유지하는 방법을 다룹니다. 독자가 로컬 환경에서 강력한 LLM을 실제로 실행할 수 있도록 돕는 것이 목적입니다.
왜 양자화가 중요한가?
- 최신 LLM은 수십억~수조 개의 매개변수(Weights) 를 가짐 → 예: 80B 모델 = 약 159GB (float32 기준)
- 1T(조) 매개변수 모델은 2TB RAM 이 필요해 단일 머신에서 거의 불가능
- 양자화로 모델을 4배 작게 , 최대 2배 빠르게 만들 수 있음 (정확도 손실은 5~10% 수준)
핵심 개념
- 양자화(Quantization) : 고정밀 부동소수점(float32 등)을 낮은 비트(8비트, 4비트 등)로 변환하는 손실 압축 기법
- 부동소수점 비교:
- float32: 32비트 (높은 정확도, 큰 메모리)
- bfloat16 / float16: 16비트 (메모리 절반)
- 8비트, 4비트: 더 극단적 압축
LLM 매개변수는 대부분 0 근처 에 몰려 있지만, 소수의 아웃라이어(Outliers) 가 존재해 양자화 시 주의가 필요합니다.
양자화 방법과 기술
- Post-Training Quantization (PTQ) : 학습이 끝난 모델을 나중에 양자화 (글의 주요 내용)
- Quantization Aware Training (QAT) : 학습 단계부터 양자화를 고려
대칭(Symmetric) vs 비대칭(Asymmetric) 양자화
- 대칭: 0을 중심으로 압축 (간단하지만 오차가 큼, 평균 18%)
- 비대칭: 실제 데이터 범위에 맞춰 zero-point 사용 (오차가 적음, 평균 8.5%)
블록 단위 양자화: 전체가 아닌 32~256개 매개변수씩 블록으로 나눠 양자화 → 아웃라이어 영향 최소화
주요 형식
- GGUF (llama.cpp): Q8_0, Q4_1, Q4_0, Q2_K 등
- AWQ, GPTQ 등도 언급
성능 영향 (벤치마크)
- 메모리 : 16비트 → 4비트 시 4배 감소
- 속도 (tokens/sec):
- MacBook Pro M1 Max: bfloat16 (19.45) → 4비트 비대칭 (43.32, 2.2배 빠름 )
- H100 GPU: bfloat16 (106.85) → 4비트 (175.70, 1.6배 빠름 )
- 정확도 : 8비트는 거의 손실 없음, 4비트는 5~10% 손실, 2비트는 모델이 거의 붕괴
실전 예시
- 모델: Qwen3.5-9B
- llama.cpp를 사용한 양자화 명령어 예시 제공 (BF16 → Q8_0 등)
결론
양자화는 LLM을 실생활에서 실용적으로 쓰기 위한 핵심 기술입니다. 특히 4비트 양자화는 크기·속도·정확도 의 균형이 좋아 가장 많이 사용됩니다. 아웃라이어 처리와 블록 단위 양자화 같은 기법이 품질을 유지하는 데 중요하다는 점을 강조합니다.
원문: Quantization