Skip to main content

모델 양자화

양자화(Quantization)는 모델의 가중치와 활성화 값을 더 낮은 정밀도(FP32 -> INT8)로 변환하여 모델 크기를 줄이고 추론 속도를 높이는 기법입니다.
1
양자화 유형 이해
2
3
방식설명정확도 손실추천 상황PTQ (Post-Training)학습 후 바로 양자화약간빠른 배포QAT (Quantization-Aware)양자화를 고려한 재학습최소정밀도 중시Dynamic Quantization추론 시 동적 양자화약간CPU 추론
4
PTQ (Post-Training Quantization)
5
import torch
from torch.quantization import quantize_dynamic
import timm

# 모델 로드
model = timm.create_model('resnet50', pretrained=True, num_classes=5)
model.eval()

# Dynamic Quantization (CPU 전용)
quantized_model = quantize_dynamic(
    model,
    {torch.nn.Linear, torch.nn.Conv2d},  # 양자화 대상 레이어
    dtype=torch.qint8,
)

# 모델 크기 비교
import os

torch.save(model.state_dict(), 'fp32_model.pth')
torch.save(quantized_model.state_dict(), 'int8_model.pth')

fp32_size = os.path.getsize('fp32_model.pth') / (1024 * 1024)
int8_size = os.path.getsize('int8_model.pth') / (1024 * 1024)
print(f"FP32 크기: {fp32_size:.1f} MB")
print(f"INT8 크기: {int8_size:.1f} MB")
print(f"압축률: {fp32_size / int8_size:.1f}x")
6
Static PTQ (캘리브레이션 기반)
7
from torch.quantization import prepare, convert, get_default_qconfig

# 양자화 설정
model.qconfig = get_default_qconfig('x86')  # CPU용
prepared = prepare(model)

# 캘리브레이션: 대표 데이터로 통계 수집
with torch.no_grad():
    for images, _ in calibration_loader:  # 100~1000개 이미지
        prepared(images)

# 양자화 적용
quantized = convert(prepared)
8
ONNX + INT8 양자화
9
from onnxruntime.quantization import quantize_dynamic, QuantType

# ONNX 모델 Dynamic 양자화
quantize_dynamic(
    model_input='model.onnx',
    model_output='model_int8.onnx',
    weight_type=QuantType.QInt8,
)
10
Ultralytics YOLO INT8 Export
11
from ultralytics import YOLO

model = YOLO('best.pt')

# INT8 TensorRT Export (캘리브레이션 자동)
model.export(
    format='engine',
    imgsz=640,
    int8=True,
    data='dataset.yaml',  # 캘리브레이션 데이터
)

정밀도별 성능 비교

정밀도비트 수모델 크기추론 속도정확도
FP3232기준기준기준
FP161650%2x거의 동일
INT8825%3~4x약간 감소
INT4412.5%4~8x감소
INT8 양자화 후에는 반드시 검증 세트에서 정확도를 확인하세요. 특히 소형 모델이나 특정 도메인 데이터에서는 정확도 저하가 클 수 있습니다. 허용 범위를 벗어나면 QAT나 FP16을 검토하세요.
FP16은 정확도 손실이 거의 없고 설정이 간단하여 첫 번째 시도로 적합합니다. INT8은 추가 속도 향상이 필요할 때 선택하며, 캘리브레이션 데이터와 정확도 검증이 필요합니다.
QAT는 양자화 효과를 시뮬레이션하면서 학습하므로, PTQ보다 정확도 손실이 적습니다. 다만 학습 시간이 추가로 소요되며, 구현 복잡도가 높아집니다.