딥러닝 양자화 완전 정복: Static Quantization, Dynamic Quantization, QAT까지 한 번에 이해하기

Bean·2025년 7월 16일
0

인공지능

목록 보기
87/123

개요

딥러닝 모델을 작고 빠르게 만들기 위해 양자화(Quantization)는 필수 전략입니다. 하지만 종종 혼동되는 개념들 Float16 변환, INT8 양자화, QAT(Quantization-Aware Training) 이 정확히 어떻게 다르고, 각각 언제 쓰이는지 헷갈리기 쉽습니다.

이 글에서는 양자화의 개념부터 PyTorch 양자화 방식까지, 한 번에 이해할 수 있도록 정리해드릴게요.


1. 양자화란?

양자화(Quantization)는 연속적인 실수(float) 값을 이산적인 정수(int8 등)로 변환하는 기술입니다.

Float32 → Int8/UInt8

왜 하는가?

  • 모델 크기 감소
  • 연산 속도 향상
  • 메모리 사용량 절약
  • 모바일/엣지 디바이스 대응

2. 그럼 Float16은 양자화일까?

아니요. Float16은 "양자화"가 아니라 정밀도를 줄인 부동소수점 표현입니다.

구분양자화 (Quantization)Float16 변환 (Half precision)
표현 형식실수 → 정수 (int8)float32 → float16
계산 방식정수 연산부동소수점 연산
주요 목적메모리 절약 + 추론 최적화GPU 성능 최적화
대표 사용 예모바일 모델 추론Mixed precision training

즉, Float16은 모델 경량화 방법 중 하나일 뿐, 일반적인 양자화로 보지는 않습니다.


3. PyTorch 양자화 방식 3종 비교

PyTorch는 세 가지 양자화 방식을 제공합니다.

A. 동적 양자화 (Dynamic Quantization)

  • 가중치만 int8, 활성값은 추론 시 실시간 양자화
  • 적용 간단, Calibration 불필요
quantized_model = torch.quantization.quantize_dynamic(model, ...)

추천: LSTM, Linear 위주 CPU 추론 모델


B. 정적 양자화 (Static Quantization)

  • 가중치 + 활성값 모두 int8
  • Calibration 데이터 필요
model.eval()
model = torch.quantization.prepare(model)
torch.quantization.convert(model)

추천: 모바일, 엣지 최적화


C. QAT (양자화 인식 훈련)

  • 학습 단계에서부터 양자화 환경 반영
  • 정확도 손실 최소화
model.train()
model = torch.quantization.prepare_qat(model)
...
torch.quantization.convert(model)

추천: 정확도 중요할 때 (예: 얼굴 인식, 의료 이미지 등)


세 방식 비교표

항목동적 양자화정적 양자화QAT
가중치int8int8int8
활성값실시간 변환미리 양자화학습 중 시뮬레이션
정확도보통 유지다소 손실가장 높음
난이도매우 쉬움중간가장 높음
사용 추천간편 적용성능 최적화고정밀 모델

4. Activation, Weight, Bias 양자화 방식은?

항목설명양자화 방식dtype
Weight학습된 파라미터✅ int8 양자화int8 / uint8
Activation입력 따라 계산되는 중간값✅ 양자화됨 (정적 기준)int8 / uint8
Bias선형 함수의 상수 항✅ 하지만 int32 유지int32

왜 bias는 int32인가요?
int8 * int8 = int32 곱셈 후 누적 연산을 위한 정밀도 확보 때문입니다.


5. Softmax는 양자화되나요?

아니요. Softmax는 정확한 부동소수점 연산이 필요한 함수라 일반적으로 float32 환경에서 수행됩니다.
PyTorch에서도 양자화 가능한 연산자 목록에 포함되지 않습니다. 우리가 아는 Activation function은 양자화 연산에 포함하지 않습니다.


마무리 요약

  • 양자화 = float → int 변환, Float16은 별개
  • ✅ PyTorch는 동적 / 정적 / QAT 세 가지 방식 지원
  • ✅ bias는 항상 int32로 처리됨
  • ❌ Activation function은 양자화되지 않음

profile
AI developer

0개의 댓글