딥러닝 모델을 경량화하는 데 있어 양자화(Quantization)는 가장 널리 쓰이는 기법 중 하나입니다.
그런데 "정적 양자화와 동적 양자화 차이는 activation 값이 양자화 유무인데, 왜 모델 용량이 줄어들까?"라는 질문, 많이들 하시죠?
이번 글에서는:
를 예시와 함께 명확하게 설명드리겠습니다.
먼저 핵심 개념부터 정리할게요.
예를 들어 ReLU, Linear를 통과한 결과는 항상 입력에 따라 달라지고, 이 값은 디스크에 저장되지 않습니다.
그 비밀은 바로 Calibration 단계에 있습니다.
Activation 값 범위: -2.0 ~ +2.0
→ int8로 변환:
-2.0 → -128
0.0 → 0
+2.0 → +127
즉, 실제 양자화는 실시간으로 되지만, 범위는 미리 정해져 있어 가능한 겁니다.
Dynamic 양자화는 구조가 훨씬 단순합니다.
그래서 Dynamic 양자화는 추론 속도는 빨라지지만, 모델 용량은 많이 줄지 않습니다.
비교표로 한눈에 보겠습니다.
항목 | 정적 양자화 | 동적 양자화 |
---|---|---|
Weight 저장 | ✅ int8 | ✅ int8 |
Activation 처리 | ✅ int8 | ❌ float32 (실시간 변환) |
모델 구조 | 경량 구조로 변형 | 원래 float 구조 유지 |
모델 용량 절감 | 🟢 큼 | 🟡 중간 (weight만 줄음) |
scale
, zero_point
정보를 함께 저장왜냐하면…
Activation은 실시간 연산 결과일 뿐, 저장되는 값이 아닙니다.
정적 양자화는 모델 구조가 int8로 최적화 되어서 모델 크기가 감소된 겁니다.
질문 | 답변 |
---|---|
Activation 값은 저장되나요? | ❌ 아니요. 계산 중에만 존재합니다 |
모델 용량에 영향을 주는 건 무엇인가요? | ✅ weight, bias 등 저장되는 값들입니다 |
Dynamic은 왜 용량이 거의 줄지 않나요? | ✅ 구조는 그대로, weight만 바뀌니까요 |
양자화 방식 | 비유 |
---|---|
동적 양자화 | 겨울옷 한 벌만 진공 포장한 상태 |
정적 양자화 | 옷장 전체를 압축팩으로 정리한 상태 |
→ 정적 양자화는 구조까지 바꿔서 전체 공간 절약,
→ 동적 양자화는 weight만 줄여서 부분 절약입니다.
항목 | 동적 양자화 | 정적 양자화 |
---|---|---|
Weight 저장 | ✅ int8 | ✅ int8 |
Activation 처리 방식 | ❌ float32 (변환 연산) | ✅ int8 |
Activation 저장 여부 | ❌ 저장 안됨 | ❌ 저장 안됨 |
구조 최적화 여부 | ❌ 아님 | ✅ yes |
모델 용량 절감 효과 | 🟡 제한적 | 🟢 큼 |
Calibration 필요 여부 | ❌ 불필요 | ✅ 필요 |
model.eval()
model_prepared = torch.quantization.prepare(model)
# Calibration: 실제 입력 데이터 여러 개 넣기
for input in calibration_data:
model_prepared(input)
# Quantization 적용
quantized_model = torch.quantization.convert(model_prepared)
양자화는 단순히 수치를 int8로 바꾸는 게 아니라,
모델 구조 전체를 경량화하는 과정입니다.
정적 양자화는 이 구조까지 바꾸기에, 모델 용량도 더 크게 줄일 수 있는 것이죠.