License

ONNX Runtime 后端#

Triton 后端用于 ONNX Runtime。您可以在 后端仓库 中了解有关 Triton 后端的更多信息。在 问题页面 上提问或报告问题。

使用最新的 cmake 在本地目录中构建和安装。通常,您需要构建适当的 ONNX Runtime 实现作为构建的一部分。您可以通过指定 ONNX Runtime 版本和您想要与后端一起使用的 Triton 容器版本来完成此操作。您可以在与您感兴趣的 Triton 版本匹配的分支的 build.py 顶部的 TRITON_VERSION_MAP 中找到特定 Triton 版本中使用的版本组合。例如,要为 Triton 23.04 构建 ONNX Runtime 后端,请使用 r23.04 分支的 build.py 中的 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 目录可以作为 /opt/tritonserver/backends/onnxruntime 添加到 Triton 安装中。

以下必需的 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]

您可以使用 -DTRITON_ENABLE_ONNXRUNTIME_TENSORRT=ON 将 TensorRT 支持添加到 ONNX Runtime 后端。您可以使用 -DTRITON_ENABLE_ONNXRUNTIME_OPENVINO=ON -DTRITON_BUILD_ONNXRUNTIME_OPENVINO_VERSION=<version> 添加 OpenVino 支持,其中 <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”和“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 文档 以获取详细信息。

请链接到 CMake 中最新的 ONNX Runtime 二进制文件或从 ONNX Runtime 的 main 分支 构建,以启用最新的选项。

ONNX Runtime 和 Triton ONNXRuntime 后端之间的参数映射#

Triton 模型配置中的键

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

“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:dim1xdimd2…,input2:dim1xdim2…,…“

trt_profile_min_shapes

string

trt_profile_max_shapes

例如:“input1:dim1xdimd2…,input2:dim1xdim2…,…“

trt_profile_max_shapes

string

trt_profile_opt_shapes

例如:“input1:dim1xdimd2…,input2:dim1xdim2…,…“

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 执行提供程序优化的 ONNX Runtime#

当为 ORT 启用 GPU 时,将启用 CUDA 执行提供程序。如果还启用了 TensorRT,则 CUDA EP 被视为回退选项(仅适用于 TensorRT 无法执行的节点)。如果未启用 TensorRT,则 CUDA EP 是执行模型的主 EP。ORT 启用了 CUDA EP 的配置选项,以根据特定模型和用户场景进一步优化。有多种优化可用,请参阅 ONNX Runtime 文档 以获取更多详细信息。要启用 CUDA EP 优化,您必须适当地设置模型配置

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" }}
  ]
}}

已弃用的参数#

以下所示的指定这些特定参数的方式已弃用。为了向后兼容,仍然支持这些参数。请使用上述方法来指定参数。

  • cudnn_conv_algo_search: CUDA 卷积算法搜索配置。可用选项为 0 - EXHAUSTIVE(使用 cudnnFindConvolutionForwardAlgorithmEx 进行昂贵的详尽基准测试)。这也是默认选项,1 - HEURISTIC(使用 cudnnGetConvolutionForwardAlgorithm_v7 的轻量级启发式搜索),2 - DEFAULT(使用 CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM 的默认算法)

  • gpu_mem_limit: CUDA 内存限制。要使用所有可能的内存,请传入 maximum 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 的其他优化选项#

有关何时使用这些选项以及对它们的期望的详细信息,请访问 此处

模型配置选项#

  • intra_op_thread_count: 设置用于并行化节点内执行的线程数。值为 0 表示 ORT 将选择一个默认值,即核心数。

  • inter_op_thread_count: 设置用于并行化图执行(跨节点)的线程数。如果启用顺序执行,则忽略此值。值为 0 表示 ORT 将选择一个默认值,即核心数。

  • execution_mode: 控制图中的运算符是顺序执行还是并行执行。通常,当模型有许多分支时,将此选项设置为 1,即“并行”将为您提供更好的性能。默认为 0,即“顺序执行”。

  • level: 指的是图优化级别。默认情况下,所有优化都已启用。允许的值为 -1、1 和 2。-1 指的是 BASIC 优化,1 指的是基本优化加上扩展优化(如融合),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 启用 arena,使用 0 禁用。有关更多信息,请参阅 此处

  • enable_mem_pattern: 使用 1 启用内存模式,使用 0 禁用。有关更多信息,请参阅 此处

  • memory.enable_memory_arena_shrinkage: 有关更多信息,请参阅 此处

命令行选项#

线程池#

当 intra 和 inter op threads 设置为 0 或大于 1 的值时,默认情况下 ORT 为每个会话创建线程池。这可能并非在所有情况下都是理想的,因此 ORT 也支持全局线程池。当启用全局线程池时,ORT 创建 1 个全局线程池,该线程池由每个会话共享。使用后端配置来启用全局线程池。当启用全局线程池时,还应通过后端配置提供 intra 和 inter op num threads 配置。模型配置中提供的配置值将被忽略。

--backend-config=onnxruntime,enable-global-threadpool=<0,1>, --backend-config=onnxruntime,intra_op_thread_count=<int> , --backend-config=onnxruntime,inter_op_thread_count=<int>

默认最大批大小#

default-max-batch-size 值用于 自动完成 期间的 max_batch_size,当未找到其他值时。假设服务器启动时未使用 --disable-auto-complete-config 命令行选项,则在以下条件下,onnxruntime 后端会将模型的 max_batch_size 设置为此默认值

  1. 自动完成已确定模型能够进行批量请求。

  2. 模型配置中的 max_batch_size 为 0,或者模型配置中省略了 max_batch_size。

如果 max_batch_size > 1 且未提供 调度器,则将使用动态批处理调度器。

--backend-config=onnxruntime,default-max-batch-size=<int>

default-max-batch-size 的默认值为 4。