onnxruntime-backend
ONNX Runtime 백엔드
ONNX Runtime 백엔드는 ONNX Runtime을 위한 Triton 백엔드예요. Triton 백엔드에 대한 더 자세한 내용은 backend 저장소에서, 질문이나 문제는 이슈 페이지에서 찾을 수 있어요.
빌드
최신 cmake를 사용해 로컬 디렉터리에 빌드하고 설치해요. 보통은 빌드 과정에서 적절한 ONNX Runtime 구현을 함께 빌드하고 싶을 거예요. 그러려면 백엔드와 함께 쓰고 싶은 ONNX Runtime 버전과 Triton 컨테이너 버전을 지정해야 해요. 특정 Triton 릴리스에서 쓰는 버전 조합은, 그 Triton 릴리스에 해당하는 build.py 브랜치 맨 위의 TRITON_VERSION_MAP에서 찾을 수 있어요. 예를 들어 Triton 23.04용 ONNX Runtime 백엔드를 빌드하려면 r23.04 브랜치의 TRITON_VERSION_MAP에 있는 버전을 쓰면 돼요.
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/install -DTRITON_BUILD_ONNXRUNTIME_VERSION=1.14.1 -DTRITON_BUILD_CONTAINER_VERSION=23.04 ..
$ make install
빌드 결과물인 install/backends/onnxruntime 디렉터리를 Triton 설치본에 /opt/tritonserver/backends/onnxruntime으로 추가할 수 있어요.
빌드 과정에서 아래 필수 Triton 저장소가 내려와 쓰여요. 기본적으로 각 저장소의 main 브랜치/태그가 쓰이지만, 나열된 CMake 인자로 바꿀 수 있어요.
triton-inference-server/backend:-DTRITON_BACKEND_REPO_TAG=[tag]triton-inference-server/core:-DTRITON_CORE_REPO_TAG=[tag]triton-inference-server/common:-DTRITON_COMMON_REPO_TAG=[tag]
ONNX Runtime 백엔드에 TensorRT 지원을 추가하려면 -DTRITON_ENABLE_ONNXRUNTIME_TENSORRT=ON을 쓰면 돼요. OpenVINO 지원을 추가하려면 -DTRITON_ENABLE_ONNXRUNTIME_OPENVINO=ON -DTRITON_BUILD_ONNXRUNTIME_OPENVINO_VERSION=<version>을 쓰는데, <version>은 사용할 OpenVINO 버전이며 위에서 설명한 TRITON_VERSION_MAP 항목과 일치해야 해요. TensorRT와 OpenVINO를 모두 지원하게 빌드하려면:
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/install -DTRITON_BUILD_ONNXRUNTIME_VERSION=1.14.1 -DTRITON_BUILD_CONTAINER_VERSION=23.04 -DTRITON_ENABLE_ONNXRUNTIME_TENSORRT=ON -DTRITON_ENABLE_ONNXRUNTIME_OPENVINO=ON -DTRITON_BUILD_ONNXRUNTIME_OPENVINO_VERSION=2021.2.200 ..
$ make install
TensorRT 최적화를 쓴 ONNX Runtime
TensorRT를 ONNX 모델과 함께 써서 성능을 더 높일 수 있어요. TensorRT 최적화를 켜려면 모델 구성을 적절히 설정해야 해요. TensorRT에는 계산 정밀도 선택이나 워크스페이스 크기처럼 여러 최적화 옵션이 있는데, 파라미터와 설명은 다음과 같아요.
- precision_mode: 최적화에 쓸 정밀도예요. 허용값은
FP32,FP16,BF16,INT8이고 기본값은FP32예요. - max_workspace_size_bytes: 실행 중 모델이 임시로 쓸 수 있는 GPU 메모리 최대치예요. 기본값은 1GB예요.
- int8_calibration_table_name: INT8 보정 테이블 이름을 지정해요.
precision_mode=="INT8"이고 모델에 Q/DQ 노드가 없을 때 적용 가능해요. Q/DQ 노드가 있는 모델에 보정 테이블을 주면 ORT 세션 생성이 실패해요. - int8_use_native_calibration_table: 쓸 보정 테이블을 지정해요.
1(TensorRT가 만든 네이티브 보정 테이블 사용)과0(ORT가 만든 보정 테이블 사용)을 허용하고 기본값은0이에요. 주의: 추론 전에 최신 보정 테이블 파일을trt_engine_cache_path로 복사해야 해요. 보정 테이블은 모델과 보정 데이터셋에 특정되므로, 새 테이블이 생기면 이전 파일을 지우거나 교체해야 해요. - trt_engine_cache_enable: 엔진 캐싱을 켜요.
- trt_engine_cache_path: 엔진 캐시 경로를 지정해요.
더 많은 파라미터 사용법을 보려면 아래 매핑 표를 따라 ONNX Runtime 문서를 확인하면 돼요. 최신 옵션을 쓰려면 최신 ONNX Runtime 바이너리를 CMake에 연결하거나 ONNX Runtime main 브랜치에서 빌드해 주세요.
ONNX Runtime ↔ Triton ONNXRuntime 백엔드 파라미터 매핑
아래 표는 Triton 모델 구성의 키가 ONNX Runtime의 TensorRT EP 옵션으로 어떻게 매핑되는지 보여줘요.
| Triton 모델 구성 키 | 예시 값 | ONNX Runtime TensorRT EP 옵션 | 타입 |
|---|---|---|---|
max_workspace_size_bytes |
"4294967296" |
trt_max_workspace_size |
int |
trt_max_partition_iterations |
"1000" |
trt_max_partition_iterations |
int |
trt_min_subgraph_size |
"1" |
trt_min_subgraph_size |
int |
precision_mode |
"FP16" |
trt_fp16_enable |
bool |
precision_mode |
"BF16" |
trt_bf16_enable |
bool |
precision_mode |
"INT8" |
trt_int8_enable |
bool |
int8_calibration_table_name |
— | trt_int8_calibration_table_name |
string |
int8_use_native_calibration_table |
"1"/"true", "0"/"false" |
trt_int8_use_native_calibration_table |
bool |
trt_dla_enable |
— | trt_dla_enable |
bool |
trt_dla_core |
"0" |
trt_dla_core |
int |
trt_engine_cache_enable |
"1"/"true", "0"/"false" |
trt_engine_cache_enable |
bool |
trt_engine_cache_path |
— | trt_engine_cache_path |
string |
trt_engine_cache_prefix |
— | trt_engine_cache_prefix |
string |
trt_dump_subgraphs |
"1"/"true", "0"/"false" |
trt_dump_subgraphs |
bool |
trt_force_sequential_engine_build |
"1"/"true", "0"/"false" |
trt_force_sequential_engine_build |
bool |
trt_context_memory_sharing_enable |
"1"/"true", "0"/"false" |
trt_context_memory_sharing_enable |
bool |
trt_layer_norm_fp32_fallback |
"1"/"true", "0"/"false" |
trt_layer_norm_fp32_fallback |
bool |
trt_timing_cache_enable |
"1"/"true", "0"/"false" |
trt_timing_cache_enable |
bool |
trt_timing_cache_path |
— | trt_timing_cache_path |
string |
trt_force_timing_cache |
"1"/"true", "0"/"false" |
trt_force_timing_cache |
bool |
trt_detailed_build_log |
"1"/"true", "0"/"false" |
trt_detailed_build_log |
bool |
trt_build_heuristics_enable |
"1"/"true", "0"/"false" |
trt_build_heuristics_enable |
bool |
trt_sparsity_enable |
"1"/"true", "0"/"false" |
trt_sparsity_enable |
bool |
trt_builder_optimization_level |
"3" |
trt_builder_optimization_level |
int |
trt_auxiliary_streams |
"-1" |
trt_auxiliary_streams |
int |
trt_tactic_sources |
"-CUDNN,+CUBLAS" |
trt_tactic_sources |
string |
trt_extra_plugin_lib_paths |
— | trt_extra_plugin_lib_paths |
string |
trt_profile_min_shapes |
"input1:dim1xdim2...,input2:..." |
trt_profile_min_shapes |
string |
trt_profile_max_shapes |
"input1:dim1xdim2...,input2:..." |
trt_profile_max_shapes |
string |
trt_profile_opt_shapes |
"input1:dim1xdim2...,input2:..." |
trt_profile_opt_shapes |
string |
trt_cuda_graph_enable |
"1"/"true", "0"/"false" |
trt_cuda_graph_enable |
bool |
trt_dump_ep_context_model |
"1"/"true", "0"/"false" |
trt_dump_ep_context_model |
bool |
trt_ep_context_file_path |
— | trt_ep_context_file_path |
string |
trt_ep_context_embed_mode |
"1" |
trt_ep_context_embed_mode |
int |
이 파라미터들을 지정한 모델 구성 파일의 해당 섹션은 이렇게 보여요:
optimization { execution_accelerators {
gpu_execution_accelerator : [ {
name : "tensorrt"
parameters { key: "precision_mode" value: "FP16" }
parameters { key: "max_workspace_size_bytes" value: "1073741824" }}
parameters { key: "trt_engine_cache_enable" value: "1" }}
]
}}
CUDA 실행 프로바이더(EP) 최적화를 쓴 ONNX Runtime
GPU가 활성화되면 ORT의 CUDA 실행 프로바이더가 켜져요. TensorRT도 켜져 있으면 CUDA EP는 폴백(fallback) 옵션으로 취급돼요 (TensorRT가 실행할 수 없는 노드만 담당해요). TensorRT가 꺼져 있으면 CUDA EP가 모델을 실행하는 주 EP가 돼요. ORT는 모델과 사용자 시나리오에 맞게 더 최적화하도록 CUDA EP 설정 옵션을 지원해요. 특히 cudnn 설정을 바꾸려면 이렇게 구성하면 돼요:
optimization { execution_accelerators {
gpu_execution_accelerator : [ {
name : "cuda"
parameters { key: "cudnn_conv_use_max_workspace" value: "0" }
parameters { key: "use_ep_level_unified_stream" value: "1" }}
]
}}
(폐기 예정) Deprecated 파라미터
아래처럼 특정 파라미터를 지정하는 방식은 폐기 예정이에요. 하위 호환성을 위해 아직 지원되지만, 위에서 설명한 방식으로 지정하는 걸 권해요.
- cudnn_conv_algo_search: CUDA 합성곱 알고리즘 탐색 설정이에요.
0- EXHAUSTIVE(cudnnFindConvolutionForwardAlgorithmEx를 쓰는 비싼 exhaustive 벤치마킹, 기본값),1- HEURISTIC(cudnnGetConvolutionForwardAlgorithm_v7을 쓰는 가벼운 휴리스틱 탐색),2- DEFAULT(CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM사용)를 허용해요. - gpu_mem_limit: CUDA 메모리 한도예요. 모든 가능한 메모리를 쓰려면
size_t최댓값을 넘겨요. 기본값은SIZE_MAX예요. - arena_extend_strategy: 메모리 아레나를 늘리는 전략이에요.
0= kNextPowerOfTwo,1= kSameAsRequested, 기본값은0이에요. - do_copy_in_default_stream: CUDA EP에서 복사가 연산 스트림과 같은 스트림에서 일어날지 나타내는 플래그예요.
0= 복사와 연산에 별도 스트림,1= 복사와 연산에 같은 스트림, 기본값은1이에요.
모델 구성 파일에서 이 파라미터들은 이렇게 보여요:
parameters { key: "cudnn_conv_algo_search" value: { string_value: "0" } }
parameters { key: "gpu_mem_limit" value: { string_value: "4294967200" } }
OpenVINO 최적화를 쓴 ONNX Runtime
OpenVINO를 ONNX 모델과 함께 써 성능을 더 높일 수 있어요. OpenVINO 최적화를 켜려면 아래처럼 모델 구성을 설정해야 해요.
optimization { execution_accelerators {
cpu_execution_accelerator : [ {
name : "openvino"
} ]
}}
ONNX Runtime의 다른 최적화 옵션
언제 써야 하고 무엇을 기대할 수 있는지는 ONNX Runtime 문서에서 확인할 수 있어요.
모델 구성 옵션
- intra_op_thread_count: 노드 안(in-node) 실행을 병렬화할 스레드 수를 정해요.
0이면 ORT가 기본값(코어 수)을 고릅니다. - inter_op_thread_count: 그래프 실행(노드 간)을 병렬화할 스레드 수를 정해요. 순차 실행이 켜져 있으면 이 값은 무시돼요.
0이면 ORT가 기본값(코어 수)을 고릅니다. - execution_mode: 그래프의 연산자를 순차로 실행할지 병렬로 실행할지 제어해요. 보통 모델에 브랜치가 많으면
1(parallel)로 설정하면 성능이 좋아져요. 기본값은0(sequential execution)이에요. - level: 그래프 최적화 수준이에요. 기본적으로 모든 최적화가 켜져 있어요. 허용값은
-1,1,2예요.-1은 BASIC 최적화,1은 basic에 더해 fusion 같은 확장 최적화,2는 모든 최적화를 끔을 뜻해요.
optimization {
graph : {
level : 1
}}
parameters { key: "intra_op_thread_count" value: { string_value: "0" } }
parameters { key: "execution_mode" value: { string_value: "0" } }
parameters { key: "inter_op_thread_count" value: { string_value: "0" } }
- enable_mem_arena:
1로 켜고0으로 끄는 아레나 설정이에요. - enable_mem_pattern:
1로 켜고0으로 끄는 메모리 패턴 설정이에요. - memory.enable_memory_arena_shrinkage: ONNX Runtime 문서를 참고해요.
- session.use_device_allocator_for_initializers: 초기화된 텐서 메모리 할당에 장치 할당자를 쓸지
"1"로 켜고"0"으로 꺼요. 기본값은"0"이에요.
커맨드라인 옵션 - 스레드 풀
intra/inter-op 스레드를 0이나 1보다 큰 값으로 설정하면, 기본적으로 ORT는 세션마다 스레드풀을 만들어요. 모든 시나리오에서 이상적이진 않으므로 ORT는 전역(global) 스레드풀도 지원해요. 전역 스레드풀이 켜지면 ORT는 모든 세션이 공유하는 전역 스레드풀 하나를 만들어요. 백엔드 구성으로 전역 스레드풀을 켤 수 있어요.
--backend-config=onnxruntime,enable-global-threadpool=<0,1>, --backend-config=onnxruntime,intra_op_thread_count=<int> , --backend-config=onnxruntime,inter_op_thread_count=<int>
전역 스레드풀이 켜지면 intra/inter-op 스레드 수 설정도 백엔드 구성으로 제공해야 해요. 모델 구성에 준 값은 무시돼요.
기본 최대 배치 크기 (Default Max Batch Size)
default-max-batch-size 값은 찾은 다른 값이 없을 때 Autocomplete 과정에서 max_batch_size로 쓰여요. 서버를 --disable-auto-complete-config로 실행하지 않았다면, onnxruntime 백엔드는 다음 조건에서 모델의 max_batch_size를 이 기본값으로 설정해요.
- Autocomplete가 모델이 요청 배치가 가능하다고 판단하고,
- 모델 구성에서
max_batch_size가0이거나 생략된 경우.
max_batch_size > 1인데 스케줄러가 주어지지 않으면 동적 배치 스케줄러가 쓰여요.
--backend-config=onnxruntime,default-max-batch-size=<int>
default-max-batch-size의 기본값은 4예요.