[ultralytics] RT-DETR의 OpenVINO INT8 양자화 정확도 문제 해결: NNCF Transformer 모드 적용
PR 링크: ultralytics/ultralytics#26191 상태: Merged | 변경: +6 / -1
들어가며
최근 Ultralytics 레포지토리에서 RT-DETR 모델을 OpenVINO INT8 형식으로 내보낼 때(export) 발생하는 심각한 정확도 저하 문제가 보고되었습니다. 기존 방식에서는 모델 전체를 INT8로 양자화하려 시도했는데, 이는 RT-DETR의 복잡한 디코더 구조에서 정보 손실을 유발하여 mAP50-95가 0.0002 수준으로 떨어지는 결과를 초래했습니다. 본 PR은 디코더를 FP32로 유지하고 NNCF(Neural Network Compression Framework)의 Transformer 전용 양자화 모드를 활용하여 정확도를 복구한 사례를 다룹니다.
코드 분석
1. ultralytics/engine/exporter.py
가장 먼저, RTDETRDecoder를 Detect 레이어와 동일하게 취급하여 INT8 양자화 대상에서 제외하도록 설정했습니다.
- int8_detect=isinstance(self.model.model[-1], Detect),
+ int8_detect=isinstance(self.model.model[-1], (Detect, RTDETRDecoder)),
이를 통해 OpenVINO 변환 과정에서 디코더가 양자화되지 않고 원본 정밀도를 유지하게 됩니다.
2. ultralytics/utils/export/openvino.py
NNCF를 통한 양자화 설정 시 nncf.ModelType.TRANSFORMER를 명시적으로 지정했습니다.
+ from ultralytics.nn.modules import RTDETRDecoder
...
+ model_type=nncf.ModelType.TRANSFORMER
+ if any(isinstance(m, RTDETRDecoder) for m in model.modules())
+ else None,
Transformer 기반 모델은 일반적인 CNN과 다른 양자화 특성을 가지므로, NNCF의 Transformer 모드를 사용하는 것이 정확도 보존에 필수적입니다.
왜 이게 좋은가
이번 최적화의 핵심은 '모든 레이어를 동일하게 양자화하는 것이 항상 정답은 아니다'라는 점을 시사합니다.
- 정확도 복구: mAP50-95 기준 0.0002에서 0.6513으로 비약적인 성능 향상을 보였습니다. 이는 FP32 원본 모델의 성능(0.6513)과 거의 동일합니다.
- 성능 유지: Intel CPU 기준 추론 속도는 57.6ms에서 58.5ms로 미미한 차이만 발생하여, 실질적인 속도 저하 없이 정확도를 확보했습니다.
- 교훈: 특정 아키텍처(Transformer)는 일반적인 INT8 양자화 시 정보 손실이 큽니다. 따라서 모델의 특정 부분(디코더)을 FP32로 남겨두는 'Mixed Precision' 전략이 실무에서 매우 효과적임을 보여줍니다.
리뷰 과정에서 Glenn Jocher는 Apple Silicon 환경에서의 INT8 체크가 유효하지 않음을 지적하며, 반드시 x86 CPU 환경에서 검증할 것을 강조했습니다. 이는 하드웨어 가속기마다 양자화 지원 범위가 다를 수 있음을 시사하는 중요한 기술적 통찰입니다.
참고 자료
- https://docs.openvino.ai/latest/index.html
- https://github.com/openvinotoolkit/nncf
- https://docs.ultralytics.com/modes/export/
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [ultralytics] Ultralytics YOLO에 INT8 Quantization-Aware Training(QAT) 도입하기
- [flashinfer] FlashInfer의 DiT 최적화: SageAttention과 Int8/FP8 혼합 정밀도 커널 도입 분석
- [onnxruntime] ONNX Runtime CUDA EP, 2-bit 양자화 GEMM/GEMV 지원 추가로 모델 경량화 가속
- [sglang] sglang, DeepSeek V4.1 모델을 위한 Paged KV Cache 최적화: V41 및 FP4 포맷 도입
- [onnxruntime] ONNX Runtime: INT4 Paged KV Cache 도입을 통한 메모리 최적화
PR Analysis 의 다른글
- 이전글 [onnxruntime] ONNX Runtime, SM90 GPU를 위한 네이티브 FP8 행렬 곱셈 최적화 도입
- 현재글 : [ultralytics] RT-DETR의 OpenVINO INT8 양자화 정확도 문제 해결: NNCF Transformer 모드 적용
- 다음글 [flashinfer] Blackwell 아키텍처를 위한 MoE All-Reduce Fusion 최적화: FlashInfer의 'Cake' 백엔드 분석
댓글