딥러닝 모델을 작고 빠르게 만들기 위해 양자화(Quantization)는 필수 전략입니다. 하지만 종종 혼동되는 개념들 Float16 변환, INT8 양자화, QAT(Quantization-Aware Training) 이 정확히 어떻게 다르고, 각각 언제 쓰이는지 헷갈리기 쉽습니다.
이 글에서는 양자화의 개념부터 PyTorch 양자화 방식까지, 한 번에 이해할 수 있도록 정리해드릴게요.
양자화(Quantization)는 연속적인 실수(float) 값을 이산적인 정수(int8 등)로 변환하는 기술입니다.
Float32 → Int8/UInt8
아니요. Float16은 "양자화"가 아니라 정밀도를 줄인 부동소수점 표현입니다.
구분 | 양자화 (Quantization) | Float16 변환 (Half precision) |
---|---|---|
표현 형식 | 실수 → 정수 (int8) | float32 → float16 |
계산 방식 | 정수 연산 | 부동소수점 연산 |
주요 목적 | 메모리 절약 + 추론 최적화 | GPU 성능 최적화 |
대표 사용 예 | 모바일 모델 추론 | Mixed precision training |
즉, Float16은 모델 경량화 방법 중 하나일 뿐, 일반적인 양자화로 보지는 않습니다.
PyTorch는 세 가지 양자화 방식을 제공합니다.
quantized_model = torch.quantization.quantize_dynamic(model, ...)
추천: LSTM, Linear 위주 CPU 추론 모델
model.eval()
model = torch.quantization.prepare(model)
torch.quantization.convert(model)
추천: 모바일, 엣지 최적화
model.train()
model = torch.quantization.prepare_qat(model)
...
torch.quantization.convert(model)
추천: 정확도 중요할 때 (예: 얼굴 인식, 의료 이미지 등)
항목 | 동적 양자화 | 정적 양자화 | QAT |
---|---|---|---|
가중치 | int8 | int8 | int8 |
활성값 | 실시간 변환 | 미리 양자화 | 학습 중 시뮬레이션 |
정확도 | 보통 유지 | 다소 손실 | 가장 높음 |
난이도 | 매우 쉬움 | 중간 | 가장 높음 |
사용 추천 | 간편 적용 | 성능 최적화 | 고정밀 모델 |
항목 | 설명 | 양자화 방식 | dtype |
---|---|---|---|
Weight | 학습된 파라미터 | ✅ int8 양자화 | int8 / uint8 |
Activation | 입력 따라 계산되는 중간값 | ✅ 양자화됨 (정적 기준) | int8 / uint8 |
Bias | 선형 함수의 상수 항 | ✅ 하지만 int32 유지 | int32 |
왜 bias는
int32
인가요?
→int8 * int8 = int32
곱셈 후 누적 연산을 위한 정밀도 확보 때문입니다.
아니요. Softmax는 정확한 부동소수점 연산이 필요한 함수라 일반적으로 float32 환경에서 수행됩니다.
PyTorch에서도 양자화 가능한 연산자 목록에 포함되지 않습니다. 우리가 아는 Activation function은 양자화 연산에 포함하지 않습니다.
int32
로 처리됨