양자화
Quantization
모델 가중치의 정밀도를 낮춰 메모리와 연산량을 줄이는 기법. INT8, INT4 등.
Quantization
모델 가중치의 정밀도를 낮춰 메모리와 연산량을 줄이는 기법. INT8, INT4 등.
양자화(Quantization)는 딥러닝 모델의 가중치와 활성화 값을 낮은 정밀도(비트 수)로 변환하여 메모리 사용량과 연산량을 줄이는 최적화 기법입니다. 일반적인 모델이 32비트 부동소수점(FP32)을 사용하는 반면, 양자화된 모델은 16비트(FP16), 8비트(INT8), 4비트(INT4), 심지어 2비트까지 사용할 수 있습니다.
양자화 기술은 모바일과 엣지 디바이스에서의 모델 배포 요구로 발전했으며, 2023-2024년 LLM 시대에 들어 그 중요성이 폭발적으로 증가했습니다. 70B 파라미터 모델을 FP16으로 로드하면 140GB VRAM이 필요하지만, INT4 양자화를 적용하면 35GB로 줄어들어 소비자용 GPU에서도 실행이 가능해집니다.
양자화 방법은 크게 Post-Training Quantization(PTQ)과 Quantization-Aware Training(QAT)으로 나뉩니다. PTQ는 학습된 모델을 바로 양자화하고, QAT는 학습 과정에서 양자화 효과를 시뮬레이션합니다. 최신 기법으로는 GPTQ, AWQ, GGUF 등이 있으며, 특히 AWQ(Activation-aware Weight Quantization)는 중요한 가중치를 보존하여 4비트 양자화에서도 뛰어난 성능을 유지합니다.
2025년 현재 Hugging Face와 llama.cpp 생태계에서 양자화 모델이 표준이 되었습니다. Apple Silicon의 MLX, NVIDIA의 TensorRT-LLM 등 하드웨어별 최적화 도구도 양자화를 기본 지원합니다. 실무에서는 정확도와 속도/메모리 트레이드오프를 고려하여 적절한 양자화 수준을 선택해야 합니다.
# 양자화 - bitsandbytes를 활용한 4비트 양자화 예제
# pip install transformers bitsandbytes accelerate
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
# 4비트 양자화 설정 (NF4 + Double Quantization)
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # 양자화 파라미터도 양자화
bnb_4bit_quant_type="nf4" # Normal Float 4 (성능 우수)
)
# 모델 로드 (70B 모델도 단일 GPU에서 실행 가능!)
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=quantization_config,
device_map="auto",
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 메모리 사용량 확인
print(f"모델 메모리: {model.get_memory_footprint() / 1e9:.2f} GB")
# FP16: 14GB -> INT4: 3.5GB (4배 감소!)
# 추론 테스트
prompt = "인공지능의 미래는"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=100,
temperature=0.7,
do_sample=True
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# GPTQ 양자화 모델 직접 로드 (더 빠른 추론)
# from auto_gptq import AutoGPTQForCausalLM
# model = AutoGPTQForCausalLM.from_quantized("TheBloke/Llama-2-7B-GPTQ")
양자화 수준별 메모리/성능 비교 (Llama-2-70B 기준, 2025년 1월):
| 정밀도 | VRAM 필요량 | 추론 속도 | 성능 손실 |
|---|---|---|---|
| FP32 | 280 GB | 기준 | 0% |
| FP16/BF16 | 140 GB | 1.5x | ~0% |
| INT8 | 70 GB | 2x | 0.5-1% |
| INT4 (GPTQ) | 35 GB | 2.5x | 1-3% |
| INT4 (AWQ) | 35 GB | 2.5x | 0.5-2% |
"70B 모델을 서빙하려면 A100 80GB가 2장 필요한데, AWQ 4비트 양자화를 적용하면 단일 A100에서 돌릴 수 있습니다. 벤치마크 기준 성능 손실은 2% 미만이고, 추론 비용은 절반으로 줄어요."
"양자화에서 PTQ와 QAT의 차이는 학습 시점입니다. PTQ는 후처리로 빠르지만 성능 손실이 있고, QAT는 학습 중 양자화를 시뮬레이션해서 정확도가 더 좋습니다. 최근에는 AWQ처럼 활성화 분포를 고려한 방법이 PTQ에서도 좋은 결과를 냅니다."
"llama.cpp의 GGUF 포맷은 CPU 추론에 최적화되어 있고, GPTQ/AWQ는 GPU 추론에 적합합니다. 배포 환경에 따라 양자화 포맷을 선택해야 해요. Apple Silicon에서는 MLX 양자화가 가장 빠릅니다."
4비트 양자화가 항상 최선은 아닙니다. 수학 문제, 코딩 등 정밀도가 중요한 태스크에서는 INT8이나 FP16이 더 나은 결과를 낼 수 있습니다. 실제 태스크에서 평가 후 선택하세요.
GPTQ, AWQ, GGUF는 서로 호환되지 않습니다. 사용하는 추론 엔진(vLLM, llama.cpp, TGI 등)에 맞는 포맷을 선택해야 합니다.
양자화 후 반드시 벤치마크를 수행하세요. Hugging Face의 Open LLM Leaderboard에서 양자화 모델 성능을 비교하고, 실제 사용 케이스에서 A/B 테스트를 진행하는 것이 좋습니다.