[ultralytics] Ultralytics YOLO에 INT8 Quantization-Aware Training(QAT) 도입하기
PR 링크: ultralytics/ultralytics#26083 상태: Merged | 변경: +258 / -28
들어가며
딥러닝 모델을 엣지 디바이스에 배포할 때, INT8 양자화는 성능 향상을 위한 필수적인 과정입니다. 하지만 일반적으로 사용되는 PTQ(Post-Training Quantization)는 학습이 끝난 후 양자화를 수행하기 때문에 필연적으로 정확도 손실이 발생합니다. 이번 Ultralytics의 업데이트에서는 quantize=8 옵션을 통해 학습 루프 내에서 가중치를 INT8 환경에 적응시키는 Quantization-Aware Training(QAT)을 도입하여, 배포 시 정확도 저하를 획기적으로 줄였습니다.
코드 분석
1. engine/trainer.py: QAT 상태 관리 및 복원
학습 중 QAT를 적용하기 위해 모델을 준비하고, 체크포인트 재개 시 양자화 상태를 복원하는 로직이 추가되었습니다. 특히 restore_qat 함수는 체크포인트에 저장된 양자화 범위를 모델에 다시 적용합니다.
# Before: 체크포인트 로드 시 양자화 상태 복원 로직 부재
# After: 체크포인트 로드 후 QAT 상태 복원
if is_qat(model):
restore_qat(model, ckpt["modelopt"])
2. engine/exporter.py: QAT 모델 전용 내보내기
QAT 모델은 이미 학습 과정에서 양자화 범위가 고정되어 있으므로, 내보내기 단계에서 별도의 보정(Calibration) 과정이 필요 없습니다. 이를 위해 is_qat를 확인하여 불필요한 과정을 생략합니다.
# Before: 모든 모델에 대해 보정 데이터 요구
# After: QAT 모델은 보정 단계 생략 및 Q/DQ 노드 생성
self.qat = is_qat(model)
if self.qat:
assert fmt in {"onnx", "engine"}
self.args.quantize = 8
왜 이게 좋은가
QAT는 단순히 양자화를 수행하는 것이 아니라, 모델이 INT8 환경에서 최적의 성능을 내도록 가중치를 미세 조정(Fine-tuning)합니다. 실제 RTX PRO 6000 환경에서 yolo26s 모델을 테스트한 결과, PTQ 대비 정확도 손실을 약 3%p 이상 개선하는 성과를 보였습니다.
- 정확도 유지: PTQ에서 발생하는 급격한 정확도 하락을 방지합니다.
- 배포 편의성: 학습된 체크포인트에 양자화 범위가 포함되어 있어, 별도의 보정 데이터셋 없이 즉시
onnx나engine으로 내보낼 수 있습니다. - 교훈: 모델의 크기가 커질수록 양자화로 인한 손실이 커지므로, QAT는 특히 대형 모델이나 정밀도가 중요한 환경에서 필수적인 최적화 전략입니다.
결론
이번 업데이트를 통해 Ultralytics는 사용자가 복잡한 양자화 지식 없이도 quantize=8 옵션 하나만으로 고성능 INT8 모델을 확보할 수 있게 했습니다. torch.compile과의 호환성 제약은 존재하지만, 배포 성능 측면에서 얻는 이득이 훨씬 큽니다.
참고 자료
- https://pytorch.org/docs/stable/generated/torch.compile.html
- https://github.com/NVIDIA/TensorRT-Model-Optimizer
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [sglang] SGLang: LongCat-Image DiT의 FFN 연산 최적화 - Tanh-GELU 퓨전 적용
- [onnxruntime] [CUDA] QMoE MXFP4/NVFP4 가중치 역양자화 성능 최적화: Coalesced Memory Access의 힘
- [onnxruntime] ONNX Runtime: Blackwell (SM120+)에서 NVFP4 QMoE를 위한 네이티브 FP4xFP4 Prefill 최적화
- [sglang] SGLang LongCat-Flash Router GEMM 최적화: HPC-Ops bf16xfp32 커널로 H200에서 최대 4.31배 성능 향상
- [ultralytics] PyTorch EMA 업데이트 최적화: _foreach_lerp_를 활용한 성능 개선
PR Analysis 의 다른글
- 이전글 [sglang] LLM 서빙 최적화: Gumbel-max 트릭으로 CPU 병목 제거하기 (SGLang 사례)
- 현재글 : [ultralytics] Ultralytics YOLO에 INT8 Quantization-Aware Training(QAT) 도입하기
- 다음글 [sglang] H200 NVL에서 Qwen3.8-Flash-Next FP8 성능 극대화하기: Fused MoE Triton 설정 최적화
댓글