🤖 AI/ML

양자화

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 테스트를 진행하는 것이 좋습니다.

🔗 관련 용어

📚 더 배우기