왜 가중치 양자화가 필요한가

70B 파라미터 모델을 FP16으로 서빙하면 가중치만 약 140GB가 필요하다. A100 80GB 한 장에 올릴 수 없고, 여러 GPU로 분산하면 통신 비용과 비용 부담이 커진다. 추론 단계에서 LLM은 대부분 메모리 대역폭에 병목이 걸리기 때문에, 가중치를 4비트로 줄이면 로딩할 바이트 수가 줄어 지연 시간과 메모리가 함께 개선된다. GPTQ와 AWQ는 이 4비트 가중치 양자화(weight-only quantization)를 정확도 손실을 최소화하며 수행하는 대표적인 두 방법이다.

GPTQ: 오차 보정 기반 접근

GPTQ는 레이어별로 가중치를 하나씩 양자화하면서, 이미 양자화된 가중치가 만든 출력 오차를 아직 남은 가중치로 보정한다. 헤시안(입력 활성값의 2차 정보)을 이용해 "어떤 가중치를 먼저, 어떻게 반올림해야 최종 출력 오차가 작은가"를 계산한다. 즉 반올림 방향 자체를 오차 최소화 방향으로 조정하는 방식이다.

캘리브레이션 데이터가 필요하고, 헤시안 계산과 역행렬 갱신 때문에 양자화 자체는 다소 무겁다. 대신 3~4비트 극저비트에서도 비교적 안정적이다.

AWQ: 중요 채널 보호 접근

AWQ의 관찰은 "모든 가중치가 동등하게 중요하지 않다"는 점이다. 활성값이 큰 소수 채널(전체의 약 1%)이 출력 품질을 좌우한다. AWQ는 이 채널들을 FP16으로 남기지 않고, 활성값 통계에 따라 채널별 스케일을 곱해 중요한 가중치의 양자화 오차를 줄인다. 반올림 방식을 바꾸는 대신 스케일링으로 해상도를 배분하는 셈이다.

헤시안 역행렬 갱신이 없어 양자화가 빠르고, 스케일이 곱셈으로 흡수되므로 커널 구현이 단순하다.

핵심 차이 비교

항목GPTQAWQ
핵심 아이디어오차 보정(반올림 조정)중요 채널 스케일링
캘리브레이션필요필요
양자화 속도상대적으로 느림빠름
데이터 민감도다소 높음상대적으로 낮음
극저비트(3bit)비교적 견고4bit에 최적화

실제 양자화 코드 예시

AWQ는 autoawq로 캘리브레이션 후 저장한다.

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_path = "meta-llama/Llama-3.1-8B-Instruct"
quant_config = {
    "zero_point": True,
    "q_group_size": 128,   # 그룹 단위 스케일
    "w_bit": 4,
    "version": "GEMM",
}

model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)

# 기본 캘리브레이션 데이터로 양자화
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized("./llama3-8b-awq")
tokenizer.save_pretrained("./llama3-8b-awq")

서빙 설정과 검증

양자화 모델은 vLLM으로 바로 서빙할 수 있다. quantization 인자에 방법을 명시한다.

# AWQ 모델 서빙
vllm serve ./llama3-8b-awq \
  --quantization awq \
  --dtype float16 \
  --max-model-len 8192

# GPTQ 모델은 방법만 교체
vllm serve ./llama3-8b-gptq --quantization gptq

양자화 후에는 반드시 자체 태스크로 정확도를 재측정한다. 공개 벤치마크 점수만 보지 말고, 실제 서비스 프롬프트로 perplexity와 정답률을 비교해야 한다.

선택 기준과 주의점

4비트 그룹 양자화로 GEMM 커널을 활용해 처리량 중심으로 서빙한다면 AWQ가 무난하다. 3비트까지 내려 메모리를 극단적으로 줄여야 하거나 오차 보정 특성이 필요하면 GPTQ를 고려한다. 두 방법 모두 캘리브레이션 데이터가 실제 도메인과 다르면 특정 입력에서 품질이 떨어질 수 있으므로, 운영 트래픽과 유사한 데이터로 캘리브레이션하는 것이 중요하다.

또한 group_size가 작을수록(예: 64) 정확도는 오르지만 메모리 절감폭과 커널 효율은 떨어진다. 마지막으로 양자화는 가중치만 줄이고 KV 캐시는 그대로이므로, 긴 컨텍스트 서빙에서는 KV 캐시 양자화를 별도로 검토해야 전체 메모리 이득을 얻을 수 있다.