Nvidia TensorRT RTX 执行提供程序
Nvidia TensorRT RTX 执行提供程序是消费级硬件 (RTX PC) 上 GPU 加速的首选执行提供程序。与专注于数据中心环境的旧版 TensorRT 执行提供程序相比,它更易于使用,并且比 CUDA EP 性能更佳。以下是使其比我们的旧版 TensorRT 执行提供程序更适合 RTX PC 的一些优点:
- 占用空间更小
- 模型编译/加载时间大大加快。
- 在跨多个 RTX GPU 使用缓存模型方面具有更好的可用性。
ONNX Runtime 中的 Nvidia TensorRT RTX 执行提供程序利用 NVIDIA 的 TensorRT RTX 深度学习推理引擎(TODO:一旦 TRT RTX 文档可用,更正链接)来加速 RTX GPU 上的 ONNX 模型。Microsoft 和 NVIDIA 密切合作,将 TensorRT RTX 执行提供程序与 ONNX Runtime 集成。
目前 TensorRT RTX 支持 Ampere 或更新架构的 RTX GPU。对 Turing GPU 的支持即将推出。
目录
安装
请选择 Onnx Runtime 的 Nvidia TensorRT RTX 版本:https://runtime.onnx.org.cn/docs/install。(TODO!)
从源代码构建
请参阅 构建说明。
要求
ONNX Runtime | TensorRT-RTX | CUDA |
---|---|---|
主分支 | 1.0 | 12.0-12.9 |
1.22 | 1.0 | 12.0-12.9 |
用法
C/C++
const auto& api = Ort::GetApi();
Ort::SessionOptions session_options;
api.SessionOptionsAppendExecutionProvider(session_options, "NvTensorRtRtx", nullptr, nullptr, 0);
Ort::Session session(env, model_path, session_options);
C API 详情请见 此处。
Python
要使用 TensorRT RTX 执行提供程序,您必须在实例化 InferenceSession
时显式注册 TensorRT RTX 执行提供程序。
import onnxruntime as ort
sess = ort.InferenceSession('model.onnx', providers=['NvTensorRtRtxExecutionProvider'])
配置
TensorRT RTX 设置可以通过 TensorRT 执行提供程序会话选项进行配置。
以下是设置 NV TensorRT RTX EP 会话选项的示例和不同场景
点击下方查看 Python API 示例
import onnxruntime as ort
model_path = '<path to model>'
# note: for bool type options in python API, set them as False/True
provider_options = {
'device_id': 0,
'nv_dump_subgraphs': False,
'nv_detailed_build_log': True,
'user_compute_stream': stream_handle
}
sess_opt = ort.SessionOptions()
sess = ort.InferenceSession(model_path, sess_options=sess_opt, providers=[('NvTensorRTRTXExecutionProvider', provider_options)])
点击下方查看 C++ API 示例
Ort::SessionOptions session_options;
cudaStream_t cuda_stream;
cudaStreamCreate(&cuda_stream);
// Need to put the CUDA stream handle in a string
char streamHandle[32];
sprintf_s(streamHandle, "%lld", (uint64_t)cuda_stream);
const auto& api = Ort::GetApi();
std::vector<const char*> option_keys = {
"device_id",
"user_compute_stream", // this implicitly sets "has_user_compute_stream"
};
std::vector<const char*> option_values = {
"1",
streamHandle
};
Ort::ThrowOnError(api.SessionOptionsAppendExecutionProvider(session_options, "NvTensorRtRtx", option_keys.data(), option_values.data(), option_keys.size()));
场景
场景 | NV TensorRT RTX EP 会话选项 | 类型 |
---|---|---|
指定用于执行的 GPU ID | device_id | int |
为 GPU 操作设置自定义计算流 | user_compute_stream | string |
设置 TensorRT RTX EP GPU 内存使用限制 | nv_max_workspace_size | int |
转储优化后的子图以进行调试 | nv_dump_subgraphs | bool |
捕获 CUDA 图以减少启动开销 | nv_cuda_graph_enable | bool |
启用构建步骤的详细日志记录 | nv_detailed_build_log | bool |
定义最小形状 | nv_profile_min_shapes | string |
定义最大形状 | nv_profile_max_shapes | string |
定义最佳形状 | nv_profile_opt_shapes | string |
注意:对于布尔类型选项,在 Python 中赋值为 True/False,在 C++ 中赋值为 1/0。
执行提供程序选项
TensorRT RTX 配置可以通过执行提供程序选项设置。当每个模型和推理会话都有自己的配置时,这会很有用。所有配置都应显式设置,否则将采用默认值。
device_id
- 描述:GPU 设备 ID。
- 默认值:0
user_compute_stream
-
描述:定义推理运行的计算流。它隐式设置了
has_user_compute_stream
选项。流句柄需要以十进制数字的形式打印成字符串,并作为会话选项传递,如上例所示。 - 这也可以通过 Python API 进行设置。
-
例如,从 PyTorch 捕获的 cuda 流可以传递给 ORT-NV TensorRT RTX EP。点击下方查看示例代码
import onnxruntime as ort import torch ... sess = ort.InferenceSession('model.onnx') if torch.cuda.is_available(): s = torch.cuda.Stream() provider_options = { 'device_id': 0, 'user_compute_stream': str(s.cuda_stream) } sess = ort.InferenceSession( model_path, providers=[('NvTensorRtRtxExecutionProvider', provider_options)] ) options = sess.get_provider_options() assert "NvTensorRtRtxExecutionProvider" in options assert options["NvTensorRtRtxExecutionProvider"].get("user_compute_stream", "") == str(s.cuda_stream) ...
-
- 为了利用用户计算流,建议使用 I/O 绑定将输入和输出绑定到设备中的张量。
nv_max_workspace_size
-
描述:TensorRT RTX 引擎的最大工作空间大小(以字节为单位)。
-
默认值:0(让 TensorRT 选择最佳值)。
nv_dump_subgraphs
- 描述:如果 ONNX 被拆分为多个执行提供程序,则转储子图。
- 这有助于调试子图,例如使用
trtexec --onnx subgraph_1.onnx
并检查解析器的输出。
- 这有助于调试子图,例如使用
nv_detailed_build_log
- 描述:在 NV TensorRT RTX EP 上启用详细的构建步骤日志记录,并包含每个引擎构建的时间。
nv_cuda_graph_enable
- 描述:这将捕获一个 CUDA 图,这对于包含许多小层的网络来说可以显著提高性能,因为它减少了 CPU 上的启动开销。
nv_profile_min_shapes
nv_profile_max_shapes
nv_profile_opt_shapes
- 描述:使用包含所提供最小/最大/最佳形状的配置文件构建显式动态形状。
- 默认情况下,TensorRT RTX 引擎将支持动态形状,为了提高性能,可以指定一个或多个显式形状范围。
- 配置文件形状的格式为
input_tensor_1:dim_1xdim_2x...,input_tensor_2:dim_3xdim_4x...,...
- 这三个标志都应提供才能启用显式配置文件形状功能。
- 请注意,可以通过为同一输入张量传递多个形状来启用多个 TensorRT RTX 配置文件。
- 有关更多详细信息,请查看 TensorRT 文档 优化配置文件。
NV TensorRT RTX EP 缓存
主要有两种 TRT RTX EP 缓存:
- 嵌入式引擎模型 / EPContext 模型
- 内部 TensorRT RTX 缓存
内部 TensorRT RTX 缓存由 EP 自动管理。用户只需要管理 EPContext 缓存。缓存对于大幅缩短会话创建时间至关重要。
TensorRT RTX 将编译分为预编译(AOT)引擎和即时(JIT)编译。AOT 编译可以存储为 EPContext 模型,此模型在多个 GPU 代次之间兼容。加载此类 EPContext 模型后,TensorRT RTX 将即时编译引擎以适应所使用的 GPU。此 JIT 过程通过 TensorRT RTX 的内部缓存加速。有关示例用法,请参见:https://github.com/microsoft/onnxruntime/blob/main/onnxruntime/test/providers/nv_tensorrt_rtx/nv_basic_test.cc
更多关于嵌入式引擎模型 / EPContext 模型
- TODO:决定默认使用去权重引擎的计划。修复 EP 实现以启用该功能。解释动机并在此文档中提供如何使用正确选项的示例。
- EPContext 模型还支持封装外部编译的引擎,例如使用
trtexec
。Python 工具中包含一个能够将此类预编译引擎封装到 ONNX 文件中的Python 脚本。(TODO:文档说明这如何与去权重引擎一起工作)。
性能调优
有关性能调优,请参阅此页面上的指南:ONNX Runtime 性能调优
当/如果使用 onnxruntime_perf_test 时,请使用标志 -e nvtensorrttrx
。
TensorRT RTX 插件支持
TensorRT RTX 不支持插件。