정적 vs 동적 양자화: 모델 용량 차이의 원인

Bean·2025년 7월 16일
0

인공지능

목록 보기
88/123

시작하며

딥러닝 모델을 경량화하는 데 있어 양자화(Quantization)는 가장 널리 쓰이는 기법 중 하나입니다.
그런데 "정적 양자화와 동적 양자화 차이는 activation 값이 양자화 유무인데, 왜 모델 용량이 줄어들까?"라는 질문, 많이들 하시죠?

이번 글에서는:

  • Activation은 왜 저장되지 않는지
  • 정적 양자화가 왜 더 효과적인지
  • PyTorch에서 어떤 방식으로 처리되는지

를 예시와 함께 명확하게 설명드리겠습니다.


목차

  1. Activation 값은 고정된 값이 아니다
  2. 정적 양자화에서 어떻게 Activation을 int8로 바꾸는가?
  3. Dynamic 양자화는 왜 용량이 덜 줄까?
  4. 정적 양자화가 더 많이 용량을 절약하는 이유
  5. Activation이 float인지 int8인지가 용량에 영향을 안 주는 이유
  6. 마무리 요약 및 비유 정리

1. Activation 값은 입력마다 달라집니다

먼저 핵심 개념부터 정리할게요.

  • Activation 값은 입력 데이터를 통과한 중간 계산 결과값입니다.
  • 따라서, 모델 안에 저장된 고정된 값이 아니라, 실시간으로 바뀌는 값이에요.

예를 들어 ReLU, Linear를 통과한 결과는 항상 입력에 따라 달라지고, 이 값은 디스크에 저장되지 않습니다.


2. 그런데 정적 양자화에서는 어떻게 미리 int8로 만들 수 있을까요?

그 비밀은 바로 Calibration 단계에 있습니다.

정적 양자화의 동작 순서

  1. 모델을 eval 모드로 설정
  2. 대표적인 입력 데이터를 여러 번 넣어봄 (Calibration dataset)
  3. 각 레이어의 activation 최소/최대값 범위를 기록
  4. 이를 기반으로 quantization scale, zero point를 설정
  5. 이후 입력값이 들어올 때 해당 범위 기준으로 int8로 매핑

예시

Activation 값 범위: -2.0 ~ +2.0
→ int8로 변환:

-2.0 → -128
 0.0 → 0
+2.0 → +127

즉, 실제 양자화는 실시간으로 되지만, 범위는 미리 정해져 있어 가능한 겁니다.


3. Dynamic 양자화에서는 Activation이 float로 유지됩니다

Dynamic 양자화는 구조가 훨씬 단순합니다.

  • Weight만 int8로 바뀝니다.
  • Activation은 계산 중 float32 → int8 변환 후 연산, 다시 float32로 돌아옵니다.
  • 결과적으로 모델 파일(.pt)은 float 버전의 구조를 그대로 유지하게 됩니다.

그래서 Dynamic 양자화는 추론 속도는 빨라지지만, 모델 용량은 많이 줄지 않습니다.


4. 왜 정적 양자화는 용량 절감 폭이 더 클까요?

비교표로 한눈에 보겠습니다.

항목정적 양자화동적 양자화
Weight 저장✅ int8✅ int8
Activation 처리✅ int8❌ float32 (실시간 변환)
모델 구조경량 구조로 변형원래 float 구조 유지
모델 용량 절감🟢 큼🟡 중간 (weight만 줄음)

💡 핵심 차이

  • 정적 양자화는 Conv, Linear, ReLU 등을 양자화 버전 연산자(예: QuantizedConv2d)로 바꿔 저장함
  • PyTorch는 양자화 시 필요한 scale, zero_point 정보를 함께 저장
  • 일부 연산자는 Conv+BN+ReLU 등으로 fused module 처리되어 더 작아짐

5. Activation이 int8로 계산된다고 해서 모델 크기가 줄진 않습니다

왜냐하면…

Activation은 실시간 연산 결과일 뿐, 저장되는 값이 아닙니다.
정적 양자화는 모델 구조가 int8로 최적화 되어서 모델 크기가 감소된 겁니다.

질문답변
Activation 값은 저장되나요?❌ 아니요. 계산 중에만 존재합니다
모델 용량에 영향을 주는 건 무엇인가요?✅ weight, bias 등 저장되는 값들입니다
Dynamic은 왜 용량이 거의 줄지 않나요?✅ 구조는 그대로, weight만 바뀌니까요

6. 비유로 쉽게 정리하면

양자화 방식비유
동적 양자화겨울옷 한 벌만 진공 포장한 상태
정적 양자화옷장 전체를 압축팩으로 정리한 상태

→ 정적 양자화는 구조까지 바꿔서 전체 공간 절약,
→ 동적 양자화는 weight만 줄여서 부분 절약입니다.


📝 최종 요약

항목동적 양자화정적 양자화
Weight 저장✅ int8✅ int8
Activation 처리 방식❌ float32 (변환 연산)✅ int8
Activation 저장 여부❌ 저장 안됨❌ 저장 안됨
구조 최적화 여부❌ 아님✅ yes
모델 용량 절감 효과🟡 제한적🟢 큼
Calibration 필요 여부❌ 불필요✅ 필요

덤: PyTorch 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로 바꾸는 게 아니라,
모델 구조 전체를 경량화하는 과정입니다.
정적 양자화는 이 구조까지 바꾸기에, 모델 용량도 더 크게 줄일 수 있는 것이죠.


profile
AI developer

0개의 댓글