b__ono__ng

Onnxruntime-DirectML 정확도 유지하며 추론 성능 개선 시도 본문

IT/AI

Onnxruntime-DirectML 정확도 유지하며 추론 성능 개선 시도

b__ono__ng 2026. 3. 4. 13:16

테스트 환경

모델

- onnxruntime-DirectML
- YOLOv8m

환경

- Intel Core i5-12600
- 32GB RAM
- RTX 3070

비디오

- 1920x1080
- 30FPS


최적화 단계별 변경 요약


Step 1: SessionOptions 최적화
create_ort_session()에서 기본 옵션 대신 튜닝된 SessionOptions 적용

옵션 기존 변경
graph_optimization_level ORT_ENABLE_BASIC (기본값) ORT_ENABLE_ALL
enable_mem_pattern False (기본값) True
execution_mode ORT_PARALLEL (기본값) ORT_SEQUENTIAL


- ORT_ENABLE_ALL: operator fusion, constant folding 등 그래프 수준 최적화 전부 활성화
- enable_mem_pattern: 추론 간 메모리 재사용 패턴 활성화 (할당/해제 감소)
- ORT_SEQUENTIAL: DirectML은 자체적으로 GPU 병렬화하므로 호스트 측은 sequential이 오버헤드 적음

결과: -4.7% (55.5 → 58.3 FPS)



Step 2: I/O Binding
session.run() 대신 io_binding으로 입출력을 GPU 디바이스에 직접 바인딩

- bind_cpu_input() → GPU로 입력 전송
- bind_output('dml') → GPU에 출력 버퍼 사전 할당
- run_with_iobinding() → 매 프레임 메모리 할당 없이 추론

결과: 노이즈 수준 차이 (0.03ms), 코드 복잡도만 증가 → 제거


Step 3: Warm-up 추론
ONNXModel.__init__() 마지막에 더미 입력으로 1회 추론 실행

dummy = np.zeros((1, 3, self.height, self.width), dtype=np.float32)
self.session.run(None, {self._input_name: dummy})


- DirectML은 첫 추론 시 GPU 셰이더를 컴파일함 (JIT)
- 모델 로딩 시점에 미리 컴파일해두면 실제 추론 시 지연 없음

결과: Std 1.01→0.70ms, Max 24.05→20.81ms (안정성 개선)


Summary

지표 Baseline 최종 변화
Avg 18.01ms 17.77ms -1.4%
FPS 55.5 56.3 +1.4%
Std 1.01ms 0.70ms -30.7%
Max 24.05ms 20.81ms -13.5%
정확도 유지 유지 유지

bbox 기존 성능을 유지하면서 다른 전처리를 바꿔서 성능을 개선할 수 있을까 해서 해봤는데 생각보다 별 차이는 없다..