ONNX Runtime(ORT)은 다양한 하드웨어를 사용해 추론을 가속할 수 있는 강력한 runtime이다.
이에 내가 개발하고 있는 Local Agent가 각 사용자의 디바이스에 맞게 GPU사용 및 토큰 생성을 최적화 하고 싶었다.
ONNX Runtime은 마침 Provider를 통해 각 환경에 맞는 ~~을 제공한다!
그래서 이번 글은 Intel / NVIDIA / AMD / CPU / OpenVINO / DML / TensorRT 등
각 Provider의 기능·제약·지원 플랫폼을 ~~
EP는 간단히 말해 “이 모델을 어떤 디바이스에서 실행할 것인가”를 정의한다.
| 용어 | 의미 |
|---|---|
| ORT Core | ONNX Runtime 자체 컴파일 옵션 |
| EP | 하드웨어별 추론 엔진(CUDA, OpenVINO 등) |
| Custom ops | ORT 기본 연산에 없는 커스텀 연산(MatMulNBits 등) |
핵심 포인트는 EP는 ORT Core에 없는 연산자를 추가해주지 않는다.
MatMulNBits 같은 LLM 전용 연산자가 빠져 있으면 어떤 EP를 선택해도 모델은 절대 로딩되지 않는다.
ONNX Runtime은 환경 별 다양한 하드웨어 백엔드를 Execution Provider(EP) 형태로 제공한다.
즉, 동일한 ONNX 모델이라도 어떤 EP를 선택하느냐에 따라 속도·메모리·호환성이 크게 달라진다.
CUDA와 cuDNN 기반으로 대부분의 딥러닝 연산을 GPU에서 처리하도록 해주며, 딥러닝 표준 연산(conv, matmul 등)도 안정적으로 지원하기에 가장 널리 사용되는 GPU 가속 옵션이라 할 수 있다.
- 장점
- FP32 / FP16 모두 지원
- Conv/MatMul 최적화 AI 엔진
- 설치 난이도 낮음 (onnxruntime-gpu wheel)
- CUDA Graph, Tensor Core 사용 가능
- 단점
- op(MatMulNBits 등) 미지원
- ONNX 같은 모델은 아예 로딩되지 않음
- DA, cuDNN 버전 맞추기 까다로움
- 지원 OS
- Windows
- Linux
표준 모델을 돌릴 때 가장 안정적이며, CUDA/cuDNN만 잘 맞추면 대부분의 딥러닝 모델이 문제 없이 가속된다.
CPU 대비 3~10배 이상 속도 향상을 보였다는 사례가 보고되고 대부분의 일반적인 ONNX operator에 대해 지원이 잘 되어 있어, custom op이 적고 표준 연산만을 쓴다면 안정적으로 작동한다.
OpenVINO란 Intel이 제공하는 딥러닝 최적화 툴킷으로, CPU·iGPU·NPU 등 Intel 계열 하드웨어에서 모델을 빠르게 실행하도록 만들어진 프레임워크이다.
Intel의 iGPU, Arc GPU, Movidius NPU 등에서 최적화된 연산을 제공하며, 특히 이미지/비전 모델에서 강한 성능을 보이기에 NVIDIA GPU가 없는 환경에서 좋은 대안이라 볼 수 있다.
- 장점
- CPU/iGPU 모두 가속
- NHWC 최적화 (영상 모델에 강함)
- 메모리 사용량이 비교적 적고, 경량 하드웨어에서도 작동 가능
- Windows / Linux / Mac 일부 지원
- 단점
- LLM 지원 미약. 최적화나 성능 면에서 한계
- RotaryEmbedding / MatMulNBits 같은 custom op 미지원
- 양자화 모델(Q8/Q4 기반 LLM)은 거의 불가
- 지원 디바이스
- Intel CPU (AVX/AVX2/AVX512)
- Intel GPU (Arc/iGPU)
- Movidius NPU
CPU 기반 환경에서 성능을 끌어올리고 싶을 때 매우 유용하며, 영상 처리나 이미지 모델처럼 데이터 포맷이 NHWC이거나 컨볼루션 중심인 경우, OpenVINO가 효율적인 경우가 많다.
CPU뿐 아니라 Intel iGPU / 내장 GPU 등을 활용할 수 있어서, GPU 없는 환경에서도 “하드웨어 가속 + 최적화” 가능성이 있다
DirectMLExecutionProvider는 Windows 환경을 위한 GPU 가속 API로, AMD·NVIDIA·Intel GPU를 모두 지원하는 통합 가속 백엔드다.
특히 AMD GPU를 온전히 지원하는 거의 유일한 EP이기에 Windows + AMD 환경에서 선택지가 사실상 이것뿐이다.
- 장점
- Windows에서 가장 범용적
- AMD도 지원되는 유일한 경로
- 설치가 쉬움
- 단점
- LLM 최적화 부족. 수준이 높지 않음
- ONNXRuntime GenAI와 호환성 낮음
- 성능 측면에서 제한이 존재
- 커스텀 op 거의 미지원
Windows + AMD 그래픽 환경에서 GPU 가속이 필요할 때 현실적으로 선택 가능한 유일한 EP다. NVIDIA가 아닌 환경에서 GPU 가속이 필요할 때 고려해볼 수 있는 “범용성” 선택지지만, 고성능이나 최신 LLM을 돌리기엔 무리가 있을 수 있다.
기본 EP이며 가장 안정적이고 호환성 높다. GPU가 없어도 모든 모델이 돌아가며, operator 지원 문제가 거의 없기에 ONNX 모델 디버깅에도 많이 쓰인다.
- 장점
- 모든 모델이 가장 안정적으로 로딩
- custom op 미포함 모델이라면 거의 100% 성공
- 설치 간편
- 환경 문제 거의 없음
- 단점
- 속도 느림
- 대형 모델 추론 현실적이지 않음
“모든 환경에서 동작 보장 + 최대 호환성”이 필요하거나, 가속기가 없는 서버/환경에서 가장 안전한 옵션이다. 다만 속도, 효율은 희생된다는 점을 감안해야 한다.
엔진 변환을 통해 모델 전처리를 한 번 수행한 뒤, GPU에서 최대 성능으로 실행하도록 설계되어 있다.
CUDA EP보다 훨씬 공격적인 최적화를 수행하기 때문에, commercial 환경이나 로우레이턴시 API에 적합하다.
- 장점
- FP16/INT8에서 최고 속도
- 동일 하드웨어에서 일반 GPU 가속(CUDA EP)보다 더 빠른 추론 성능
- FP16, INT8 등의 낮은 정밀도(quantization)나 mixed-precision을 잘 활용
- 메모리 사용량 줄이고 속도/효율 향상.
- 상용 서비스 환경이나 배포 시 “최고 속도”가 필요할 때 유리
- 단점
- 설치 난이도 최악
- 변환 과정(tensorrt engine) 필요
- Dynamic shape 모델은 별도 설정 필요
- 커스텀 op 미지원 -> 자동으로 CUDA EP나 CPU EP fallback
- 모델 전체 GPU/엔진 가속”이 항상 보장하지 않음
- 지원 OS / 환경
- TensorRT 가 설치된 NVIDIA GPU 환경. Linux 또는 Jetson 같은 임베디드 환경 포함. 또한, 공식 문서에서는 Python, C++, 기타 언어 바인딩 모두 지원한다고 명시되어 있다.
연산 속도, 메모리 효율, 상용 배포 환경에서는 매우 매력적인 선택지지만, operator 지원 제약과 설정 복잡성 때문에 “조건을 잘 갖춘 모델 + 환경”에서만 안정적인 선택이 된다.
| EP | GPU | CPU | LLM Custom OP | 쉬운 설치 | 빠른 속도 |
|---|---|---|---|---|---|
| CPU | ❌ | ✔ | ❌ | ✔✔✔ | 느림 |
| CUDA | ✔ | ✔ | ❌ | ✔ | 빠름 |
| TensorRT | ✔ | ✔ | ❌ | ❌ | 매우 빠름 |
| OpenVINO | iGPU | ✔ | ❌ | ✔ | 중간 |
| DirectML | AMD/NVIDIA | ✔ | ❌ | ✔ | 중간 |
결국 EP는 하드웨어 가속을 선택해주는 엔진일 뿐, ONNX Runtime Core에 존재하지 않는 custom op 문제를 대신 해결해주지는 않는다.
그래서 모델이 사용하는 연산자 구성과 환경을 잘 따져서 선택하는 것이 핵심이다.
- CPUExecutionProvider → 가장 안정적이고 호환성 최고
- NVIDIA GPU → 기본은 CUDA, 성숙한 서비스 환경이라면 TensorRT까지 고려
- Intel iGPU/Arc GPU → OpenVINO가 최적 선택
- AMD GPU (Windows) → 사실상 DirectML이 유일한 옵션
그리고 LLM처럼 custom op(MatMulNBits, RotaryEmbedding 등)을 사용하는 모델들은
기존 EP로는 제대로 실행되지 않는 경우가 많아서,
ONNX Runtime GenAI 전용 패키지 또는 PyTorch 기반 실행이 사실상 유일한 선택지가 된다.
다음 글에서는 OpenVINO Execution Provider와 DirectML Execution Provider를 실제로 적용해보고,
환경 구성부터 속도·메모리 사용량까지 실제 성능을 측정한 결과를 정리해보겠다.