Quantization-Aware Training (QAT)
양자화 인식 학습(QAT)은 학습 중 INT8 반올림을 시뮬레이션하여 내보내기 전에 가중치를 조정하므로, 일반적인 INT8 변환으로 손실되는 정확도를 유지합니다.
양자화 인식 학습(QAT)은 학습 중 양자화를 시뮬레이션하여 저정밀도 추론에 대비하도록 모델을 준비하는 학습 기법입니다. 모델은 일반적으로 32비트 부동소수점(FP32)으로 학습하고 가중치를 저장하며, 모델 양자화는 배포를 위해 가중치를 8비트 정수(INT8) 등의 형식으로 변환합니다. 이렇게 하면 가중치 크기가 4분의 1로 줄고 CPU, GPU 및 신경망 처리 장치(NPU)가 빠른 정수 연산을 사용할 수 있습니다. 변환 과정에서 각 값이 반올림되고 이상치가 잘리므로 정확도가 낮아집니다. QAT는 모델이 계속 학습되는 동안 순전파에 반올림을 삽입하므로, 경사 하강법은 양자화 후에도 성능을 유지하는 가중치를 찾습니다. 일반적으로 이미 학습된 모델에 짧은 미세 조정 단계를 적용합니다. Google의 모바일 CPU용 정수 연산 전용 추론 방식은 INT8 추론과 이러한 학습 절차를 결합했으며, 이후 QAT는 엣지 AI 배포의 표준 도구가 되었습니다.
양자화 인식 학습의 작동 방식#
QAT는 양자화-역양자화(Q/DQ) 쌍이라고도 하는 가짜 양자화 연산을 모델의 가중치와 활성화에 추가합니다. 각 연산은 스케일과 영점을 사용해 부동소수점 값을 가장 가까운 INT8 레벨로 매핑한 다음 즉시 다시 부동소수점 값으로 변환하므로, 네트워크는 부동소수점 연산을 계속 수행하면서 INT8 엔진과 동일하게 반올림된 값을 입력으로 받습니다. 스케일은 데이터 몇 배치에서 각 텐서의 일반적인 범위를 기록하는 보정 과정에서 얻으며, 일부 방법은 학습 중에 스케일도 함께 학습합니다.
반올림의 기울기는 거의 모든 지점에서 0이므로 학습이 중단됩니다. QAT는 직통 추정기(STE)를 사용해 역전파 중 반올림 단계를 항등 함수로 취급하므로, 기울기가 기본 FP32 가중치까지 전달됩니다:
import torch
# FP32 weights that training keeps and updates
w = torch.tensor([0.3137, -0.7214, 0.0521, 1.1800], requires_grad=True)
# Symmetric INT8 fake quantization: snap each weight to one of 255 levels, then map back to float
scale = w.detach().abs().max().item() / 127
w_q = torch.fake_quantize_per_tensor_affine(w, scale, 0, -127, 127)
print(f"Fake-quantized: {[round(v, 4) for v in w_q.tolist()]}")
# The forward pass sees the rounded weights; the straight-through estimator still delivers gradients to w
x = torch.tensor([1.0, 2.0, 3.0, 4.0])
loss = (w_q * x).sum()
loss.backward()
print(f"Gradient on FP32 weights: {w.grad.tolist()}")순전파에서는 반올림된 가중치 0.3159, −0.7247, 0.0557, 1.18을 사용합니다. 각 값은 FP32 값에서 양자화 단계(0.0046)의 절반 이내에 있지만, FP32 가중치에 전달되는 기울기는 반올림이 없었던 것처럼 입력값인 1.0, 2.0, 3.0, 4.0과 정확히 같습니다. 여러 단계에 걸쳐 옵티마이저는 반올림 오차가 가장 적은 영향을 미치는 위치로 가중치를 이동시키며, 학습된 모델은 학습된 스케일과 함께 INT8 형식으로 내보내집니다.
QAT와 학습 후 양자화 비교#
학습 후 양자화(PTQ)는 완성된 FP32 모델을 직접 변환하며, 수백 장의 보정 이미지를 사용해 범위를 설정합니다. 몇 분이면 완료되고 학습 파이프라인도 필요하지 않지만, 가중치가 반올림에 적응할 기회가 없으므로 민감한 모델은 정확도가 눈에 띄게 낮아질 수 있습니다. QAT는 전체 학습 데이터를 사용하는 미세 조정이 필요하지만, 그 대가로 정확도 손실 대부분을 회복합니다. 팀에서는 일반적으로 먼저 PTQ를 시도하고 INT8 정확도 저하가 너무 클 때만 QAT로 전환합니다:
학습에 quantize=8을 전달하면 Ultralytics YOLO는 QAT를 실행합니다. NVIDIA Model Optimizer를 통해 INT8 가짜 양자화를 보정하고, 이를 적용한 상태로 미세 조정하며, ONNX 및 TensorRT 내보내기에서 별도의 보정 데이터 없이 Q/DQ 노드로 기록할 범위를 저장합니다. COCO val2017의 TensorRT 엔진에서는 PTQ를 적용했을 때 중간 크기 YOLO26 모델의 mAP50-95가 0.527에서 0.470으로 떨어진 반면 QAT를 적용하면 0.514를 유지했습니다. 나노 모델은 PTQ로도 0.010만큼만 하락했으므로 QAT로 얻는 이점은 없었습니다.
from ultralytics import YOLO
# 학습된 FP32 YOLO26 체크포인트에서 시작합니다
model = YOLO("yolo26n.pt")
# 작은 학습률을 사용하고 INT8 가짜 양자화를 적용한 상태로 미세 조정합니다
model.train(data="coco8.yaml", epochs=5, quantize=8, optimizer="AdamW", lr0=0.00001, cos_lr=True)
# ONNX로 내보냅니다. 학습된 INT8 범위가 Q/DQ 노드가 되므로 보정 데이터가 필요하지 않습니다
model.export(format="onnx", quantize=8)QAT 사용 분야#
- 엣지 비전: 휴대폰, 스마트 카메라, 드론, NPU에서 사용하는 INT8 탐지기입니다. 정수 연산 전용 가속기는 부동소수점 모델을 전혀 실행할 수 없습니다.
- 추론 서버: TensorRT와 같은 GPU 엔진은 처리량을 높이기 위해 INT8 Tensor Core 커널을 실행하며, QAT는 정확도를 FP32에 가깝게 유지합니다.
- 언어 모델: 이제 QAT는 8비트 미만에도 적용됩니다. Google은 메모리를 훨씬 적게 사용하면서도 bfloat16에 가까운 품질을 유지하는 4비트 Q4_0 형식의 Gemma 3 QAT 체크포인트를 출시했습니다.
주요 프레임워크에는 QAT 도구가 포함되어 있습니다. PyTorch의 torchao, TensorFlow의 Model Optimization Toolkit, OpenVINO용 Intel NNCF가 그 예입니다.
QAT와 관련 용어 비교#
- 모델 양자화: 수치 정밀도를 낮추는 포괄적인 용어입니다. PTQ와 QAT는 대표적인 두 가지 워크플로입니다.
- 혼합 정밀도 학습: 메모리와 시간을 절약하기 위해 FP16 또는 BF16으로 학습하며, 모델을 INT8 추론용으로 준비하지는 않습니다.
- 반정밀도: FP16 추론은 대부분의 모델이 재학습 없이도 잘 처리하므로 QAT가 필요한 경우가 드뭅니다.
- 모델 가지치기: 정밀도를 낮추는 대신 가중치나 채널을 제거하며, 두 가지 압축 기법은 함께 적용할 수 있습니다.
- 지식 증류: 더 작은 아키텍처를 학습시켜 더 큰 아키텍처를 모방하게 합니다. QAT와 함께 사용하는 경우가 많으며, 이때 전체 정밀도 모델은 자체 양자화 사본의 교사 모델 역할을 합니다.










