양자화 기법 정리: PTQ vs QAT
1. PTQ(Post-Training Quantization)
모델을 훈련 후(사후) 양자화하는 기법들의 상위 개념입니다.
여기에는 동적 양자화(Dynamic Quantization) 와 정적 양자화(Static Quantization) 가 모두 포함됩니다.
Dynamic Quantization
- 가중치(weight)만 int8로 미리 양자화해두고, 활성화(activation)는 fp32를 그대로 유지합니다.
- "동적"이라는 표현은 활성화를 양자화한다는 의미가 아니라, weight의 scale/zero_point를 런타임 시점에 계산한다는 의미입니다.
- 구현이 간단하며, CPU 추론 가속에 주로 쓰입니다.
주의: 프레임워크마다 Dynamic Quantization의 구현이 다소 다릅니다.
PyTorch 기준으로는 activation을 fp32로 유지하는 반면,
ONNX Runtime 기준으로는 activation을 실행 시점에 int8로 임시 변환하는 방식을 사용하기도 합니다.
따라서 사용하는 프레임워크의 공식 문서를 함께 확인하는 것이 좋습니다.
Static Quantization
- 가중치와 활성화 모두 int8로 양자화하고, 활성화 범위를 "캘리브레이션 데이터"로 미리 수집해 고정(fixed-point) 연산을 합니다.
- 정확도가 좀 더 좋지만 사전 캘리브레이션 단계가 필요합니다.
- Static Quantization은 PTQ뿐만 아니라 QAT에서도 사용되는 방식입니다. PTQ와 QAT의 차이는 적용 시점(훈련 후 vs 훈련 중)이며, Static Quantization은 두 방식 모두에서 내부적으로 활용됩니다.
2. QAT(Quantization-Aware Training)
훈련 과정에서 양자화 오차(Quantization Noise) 를 시뮬레이션하여 모델이 그 영향을 학습하도록 하는 방법입니다.
- PTQ처럼 "훈련 후"가 아니라, 학습 중에 fake-quant 양자화 연산 모듈을 삽입해 조정합니다.
- 내부적으로는 Static Quantization 방식(weight + activation 모두 양자화)을 훈련 중에 시뮬레이션합니다.
- 결과적으로 PTQ보다 정확도 손실이 작지만, 재훈련(fine-tuning)이 필요합니다.
비교 표
| 구분 | 수행 시점 | 필요 단계 | 실제 연산 |
|---|
| Dynamic Quantization | 사후 (PTQ) | 없음 (calibration 불필요) | weight int8, activation fp32 유지 (PyTorch 기준) |
| Static Quantization | 사후 (PTQ) | 캘리브레이션 | weight int8, activation int8 |
| Quantization-Aware Training | 학습 중 (QAT) | 재훈련 (fake-quant 삽입) | weight int8, activation int8 |
결론
- Dynamic Quantization 은 PTQ 기법입니다.
- Static Quantization 은 PTQ와 QAT 모두에서 사용되는 방식으로, PTQ에만 속하는 개념이 아닙니다.
- QAT 는 PTQ가 아니라, 양자화를 반영하면서 학습(fine-tuning)까지 수행하는 별도의 워크플로우입니다.
- 정확도 보존이 중요하다면 QAT, 빠르고 간편하게 적용하려면 PTQ(Dynamic/Static)를 선택하면 됩니다.