Skip to content
Published on

LLM Quantization 완벽 비교 — GPTQ vs AWQ vs GGUF

Authors
  • Name
    Twitter
LLM Quantization

1. 양자화(Quantization)란?

양자화는 모델의 가중치를 낮은 정밀도로 표현하여 메모리 사용량과 추론 속도를 개선하는 기술입니다. FP16(16bit) 가중치를 INT4(4bit)로 줄이면 메모리가 약 4배 절약됩니다.

양자화 유형

  • PTQ (Post-Training Quantization): 학습 후 양자화. GPTQ, AWQ, GGUF 모두 PTQ
  • QAT (Quantization-Aware Training): 학습 중 양자화 시뮬레이션

비트 폭에 따른 메모리

정밀도7B 모델 메모리70B 모델 메모리
FP3228 GB280 GB
FP1614 GB140 GB
INT87 GB70 GB
INT43.5 GB35 GB

2. GPTQ (GPU 최적화 양자화)

GPTQ는 **Optimal Brain Quantization(OBQ)**를 기반으로 레이어별 양자화를 수행합니다. 캘리브레이션 데이터를 사용하여 양자화 오차를 최소화합니다.

GPTQ 양자화 실행

from transformers import AutoModelForCausalLM, AutoTokenizer
from optimum.gptq import GPTQQuantizer

# 모델 로드
model_id = "meta-llama/Llama-3.1-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id, torch_dtype="auto", device_map="auto"
)

# 캘리브레이션 데이터 준비
from datasets import load_dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="train")
calibration_data = [tokenizer(text["text"]) for text in dataset.select(range(128))]

# GPTQ 양자화
quantizer = GPTQQuantizer(
    bits=4,
    group_size=128,
    desc_act=True,       # activation order로 양자화
    damp_percent=0.01,
    dataset=calibration_data,
)
quantized_model = quantizer.quantize_model(model, tokenizer)

# 저장
quantized_model.save_pretrained("./llama-3.1-8b-gptq-4bit")
tokenizer.save_pretrained("./llama-3.1-8b-gptq-4bit")

GPTQ 특징

  • GPU에 최적화된 커널 (ExLlama, Marlin)
  • 캘리브레이션 데이터 필요 (보통 128~256 샘플)
  • group_size가 작을수록 정확도 높지만 속도 감소

3. AWQ (Activation-aware Weight Quantization)

AWQ는 활성화 분포를 분석하여 중요한 가중치 채널을 보호하는 방식입니다. 모든 가중치를 동일하게 양자화하지 않고, 활성화 크기가 큰 채널의 가중치는 스케일링하여 정밀도를 유지합니다.

AWQ 양자화 실행

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_id = "meta-llama/Llama-3.1-8B-Instruct"
quant_path = "./llama-3.1-8b-awq-4bit"

# 모델 로드
model = AutoAWQForCausalLM.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)

# AWQ 양자화 설정
quant_config = {
    "zero_point": True,
    "q_group_size": 128,
    "w_bit": 4,
    "version": "GEMM"    # GEMM or GEMV
}

# 양자화 실행
model.quantize(tokenizer, quant_config=quant_config)

# 저장
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)

AWQ vs GPTQ 핵심 차이

항목GPTQAWQ
접근법레이어별 오차 최소화활성화 기반 채널 보호
캘리브레이션128+ 샘플 필요적은 샘플로 가능
양자화 속도느림 (수 시간)빠름 (수십 분)
추론 속도ExLlama 커널로 빠름GEMM 커널로 빠름
정확도높음비슷하거나 약간 우수

4. GGUF (llama.cpp 포맷)

GGUF는 llama.cpp에서 사용하는 양자화 포맷으로, CPU + GPU 혼합 추론을 지원합니다.

GGUF 양자화 방식 종류

방식비트설명
Q2_K2.5극한 압축, 품질 저하 큼
Q4_K_M4.8가장 인기있는 균형점
Q5_K_M5.5높은 품질 유지
Q6_K6.6FP16에 근접한 품질
Q8_08.0거의 무손실
IQ4_XS4.3importance matrix 기반

GGUF 변환 실행

# llama.cpp 빌드
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make -j$(nproc)

# HuggingFace 모델을 GGUF로 변환
python convert_hf_to_gguf.py \
  ../Llama-3.1-8B-Instruct \
  --outfile llama-3.1-8b-f16.gguf \
  --outtype f16

# 양자화 적용
./llama-quantize \
  llama-3.1-8b-f16.gguf \
  llama-3.1-8b-Q4_K_M.gguf \
  Q4_K_M

# importance matrix로 더 정확한 양자화 (IQ 시리즈)
./llama-imatrix \
  -m llama-3.1-8b-f16.gguf \
  -f calibration.txt \
  -o imatrix.dat

./llama-quantize \
  --imatrix imatrix.dat \
  llama-3.1-8b-f16.gguf \
  llama-3.1-8b-IQ4_XS.gguf \
  IQ4_XS

5. vLLM에서 양자화 모델 사용

# GPTQ 모델
vllm serve ./llama-3.1-8b-gptq-4bit \
  --quantization gptq \
  --max-model-len 8192

# AWQ 모델
vllm serve ./llama-3.1-8b-awq-4bit \
  --quantization awq \
  --max-model-len 8192

# GGUF 모델 (vLLM 0.6+)
vllm serve ./llama-3.1-8b-Q4_K_M.gguf \
  --max-model-len 8192

llama.cpp 서버

./llama-server \
  -m llama-3.1-8b-Q4_K_M.gguf \
  --host 0.0.0.0 \
  --port 8080 \
  -ngl 99 \          # GPU 레이어 수
  -c 8192 \          # 컨텍스트 길이
  --n-predict 2048

6. 벤치마크 비교

7B 모델 기준 벤치마크 (RTX 4090):

방식VRAMtok/s (생성)Perplexity양자화 시간
FP1614 GB955.12-
GPTQ-4bit4.2 GB1455.282-4시간
AWQ-4bit4.0 GB1505.2530분
GGUF Q4_K_M4.5 GB1305.305분
GGUF Q5_K_M5.3 GB1205.185분

7. 실전 선택 가이드

GPU 전용 서빙 (vLLM) → AWQ (빠른 양자화 + 좋은 성능)
GPU 전용 서빙 (정확도 중시) → GPTQ (desc_act=True)
CPU + GPU 혼합 → GGUF Q4_K_M
MacBook / CPU 전용 → GGUF Q4_K_M 또는 Q5_K_M
극한 압축 → GGUF IQ4_XS (imatrix 사용)

8. 퀴즈

Q1: AWQ가 GPTQ보다 양자화 속도가 빠른 이유는?

GPTQ는 레이어별로 Hessian 역행렬을 계산하며 순차적으로 가중치를 양자화하므로 계산량이 많습니다. AWQ는 활성화 분포만 분석하여 중요 채널을 식별하고 스케일링하므로, 복잡한 최적화 과정 없이 빠르게 양자화할 수 있습니다.

Q2: GGUF Q4_K_M에서 K와 M은 각각 무엇을 의미하나요?

K: K-quant 방식을 의미합니다. 레이어의 중요도에 따라 서로 다른 비트 폭을 적용하는 혼합 양자화입니다. M: Medium 품질을 의미합니다. S(Small), M(Medium), L(Large) 변형이 있으며, L로 갈수록 더 많은 레이어에 높은 비트를 할당합니다.

Q3: vLLM에서 GPTQ와 AWQ 중 어떤 것을 선택해야 하나요?

대부분의 경우 AWQ를 추천합니다:

양자화 속도가 훨씬 빠릅니다 (30분 vs 수 시간) 추론 성능이 비슷하거나 약간 우수합니다 Perplexity 차이가 거의 없습니다

다만 최고 정확도가 필요하면 GPTQ(desc_act=True)가 소폭 유리할 수 있습니다.