如今,Microsoft 正在向开发者提供 Windows ML。借助 Windows ML,C#、C++ 和 Python 开发者能够在本地优化 AI 模型的运行,充分利用 PC 硬件中的 CPU、NPU 和 GPU。在 NVIDIA RTX GPU 上,Windows ML 采用适用于 RTX 的 NVIDIA TensorRT 执行提供程序(EP),充分发挥 GPU 的 Tensor Core 以及 FP8 和 FP4 等架构优势,为基于 Windows 的 RTX AI PC 带来更出色的 AI 推理性能。
Windows 平台兼开发者副总裁兼杰出工程师 Logan Iyer 表示:“Windows ML 可为 GeForce RTX 和 RTX Pro GPU 实现全面的 TensorRT 加速,在 Windows 11 上提供卓越的 AI 性能。我们很高兴它现在可供开发者大规模构建和部署强大的 AI 体验。”
适用于 RTX EP 的 Windows ML 和 TensorRT 概述
Windows ML 基于 ONNX 运行时 API 构建,用于推理。它扩展了 ONNX 运行时 API,支持在 PC 的 CPU、NPU 和 GPU 等硬件上动态初始化执行提供程序并管理其依赖项。此外,Windows ML 还能根据需要自动下载必要的执行提供程序,从而降低应用开发者在管理多个不同硬件供应商的依赖项和软件包方面的复杂性。

NVIDIA TensorRT 为使用 ONNX 运行时的 Windows ML 开发者提供以下优势,适用于 RTX 执行提供程序 (EP):
- 与之前在 NVIDIA RTX GPU 上实施的 DirectML 相比,运行 ONNX 模型可实现低延迟推理,吞吐量提高 50%,如下图所示。
- 凭借其灵活的 EP 架构直接与 WindowsML 集成,并与 ORT 集成。
- 即时编译,可在最终用户设备上简化部署。 详细了解关于 TensorRT for RTX 中的编译过程。ONNX Runtime 支持将此编译过程作为 EP 上下文模型。
- 利用 Tensor Core 上的架构改进 (例如 FP8 和 FP4)
- 轻量级软件包,略低于 200 MB。
- 支持 LLM (使用 ONNX Runtime GenAI SDK 扩展)、扩散、CNN 等各种模型架构。
详细了解 TensorRT for RTX。

选择执行提供程序
ONNX Runtime 1.23.0 版本集成在 WindowsML 中,提供了独立于供应商和执行提供商的 DEVICE 选择 API。这显著减少了应用程序为在不同硬件供应商平台上启用最优执行提供商所需实现的逻辑量。请参阅下文,了解如何高效地实现此功能,并获取在 NVIDIA GPU 上实现卓越性能的代码摘要。
// Register desired execution provider libraries of various vendors
auto env = Ort::Env(ORT_LOGGING_LEVEL_WARNING);
env.RegisterExecutionProviderLibrary("nv_tensorrt_rtx", L"onnxruntime_providers_nv_tensorrt_rtx.dll");
// Option 1: Rely on ONNX Runtime Execution policy
Ort::SessionOptions sessions_options;
sessions_options.SetEpSelectionPolicy(OrtExecutionProviderDevicePolicy_PREFER_GPU);
// Option 2: Interate over EpDevices to perform manual device selection
std::vector<Ort::ConstEpDevice> ep_devices = env.GetEpDevices();
std::vector<Ort::ConstEpDevice> selected_devices = select_ep_devices(ep_devices);
Ort::SessionOptions session_options;
Ort::KeyValuePairs ep_options;
session_options.AppendExecutionProvider_V2(env, selected_devices, ep_options);
# Register desired execution provider libraries of various vendors
ort.register_execution_provider_library("NvTensorRTRTXExecutionProvider", "onnxruntime_providers_nv_tensorrt_rtx.dll")
# Option 1: Rely on ONNX Runtime Execution policy
session_options = ort.SessionOptions()
session_options.set_provider_selection_policy(ort.OrtExecutionProviderDevicePolicy.PREFER_GPU)
# Option 2: Interate over EpDevices to perform manual device selection
ep_devices = ort.get_ep_devices()
ep_device = select_ep_devices(ep_devices)
provider_options = {}
sess_options.add_provider_for_devices([ep_device], provider_options)
预编译的运行时提供快速加载时间
模型运行时现在可利用 EP 上下文 ONNX 文件 在 ONNX 运行时中进行预编译。各个执行提供程序均可使用该文件来优化 ONNX 模型的整个子图,并提供针对特定 EP 的实现。此过程可序列化至磁盘,从而通过 WindowsML 实现快速加载,通常比 DirectML 中此前基于算子的传统方法更为高效。
下图显示,TensorRT for RTX EP 需要一定时间进行编译,但由于优化结果已被序列化,因此模型的加载和推理速度更快。此外,TensorRT for RTX EP 中的运行时缓存功能会将编译阶段生成的内核序列化并存储到指定目录中,从而确保在后续推理时无需重新编译。

使用 ONNX Runtime Device API 和 Windows ML 尽可能减少数据传输用度
Windows ML 中还提供了新的 ONNX 运行时设备 API,该 API 可列举每个执行提供程序的可用设备。借助这一新特性,开发者现在能够分配特定于设备的张量,而无需额外指定与执行提供程序(EP)相关的类型规范。
通过利用 CopyTensors 和 IOBinding,此 API 使开发者能够以极小的运行时数据传输开销执行与 EP 无关的 GPU 加速推理,从而提升性能并实现更简洁的代码设计。
图 5 展示了使用 ONNX Runtime Device API 的 Stable Diffusion 3.5 Medium 模型。下方的图 4 显示了该模型在扩散循环中完成一次迭代所需的时间,包含与不包含设备 IO 绑定的对比情况。

使用 Nsight 系统,我们可视化了在未使用 IO 绑定时,主机与设备之间因重复数据复制所导致的性能开销:

在每次推理运行之前,都会完成输入张量的复制操作,该操作在配置文件中以绿色高亮显示,且在设备与主机之间复制输出数据所需的时间大致相同。此外,ONNX Runtime 默认使用可分页内存,而将设备数据复制回主机是一种隐式同步操作,尽管 ONNX Runtime 使用了 隐式同步,虽然 ONNX Runtime 使用了 cudaMemCpyAsync API。
另一方面,当输入和输出张量受到 I/O 限制时,在多模型推理工作流开始之前,主机到设备的输入复制仅执行一次,设备到主机的输出复制同样如此,之后我们再进行 CPU 与 GPU 的同步。上方的异步 Nsight 跟踪展示了循环中多次推理的执行过程,期间不再包含任何数据复制或同步操作,甚至可以释放 CPU 资源。在此情况下,设备复制耗时为 4.2 毫秒,一次性主机复制耗时为 1.3 毫秒,因此无论推理循环执行多少次迭代,总复制时间始终为 5.5 毫秒。作为参考,该方法可将 30 次迭代循环的复制时间减少约 75 倍!
用于 RTX 特定优化的 TensorRT
适用于 RTX 执行的 TensorRT 提供了自定义选项,可进一步优化性能。关键的优化如下所示。
- CUDA 图形: 通过设置
enable_cuda_graph
来捕获图形中从 TensorRT 启动的所有 CUDA 核函数,从而减少 CPU 的启动用度。如果 TensorRT 图形启动许多小内核,以便 GPU 以比 CPU 更快的速度执行这些内核,这一点非常重要。这种方法可通过 LLM 实现约 30% 的性能提升,适用于许多模型类型,包括传统 AI 模型和 CNN 架构。

- 运行时缓存:
nv_runtime_cache_path
指向一个目录,可在其中缓存已编译的核函数,以便在使用 EP 上下文节点的情况下快速加载。
- 动态形状: 通过设置 3 个选项
profile_{min|max|opt]_shapes
或使用 AddFreeDimensionOverrideByName 指定静态形状来固定模型的输入形状,从而覆盖已知的动态形状范围。此功能目前处于试验模式。
总结
我们很高兴与 Microsoft 合作,为 Windows 应用程序开发者带来 Windows ML 和 TensorRT for RTX EP,助力在 NVIDIA RTX GPU 上实现更卓越的性能。包括 Topaz Labs,和 Wondershare Filmora 在内的领先 Windows 应用开发者,目前正积极将 Windows ML 和 TensorRT for RTX EP 集成到其应用中。
使用以下资源开始使用 Windows ML、ONNX Runtime API 和 TensorRT for RTX EP:
- Windows ML 文档
- Windows ML 示例
- ONNX 运行时 API 示例
- 构建专用于 ONNX Runtime GenAI 和 NVIDIA TensorRT for RTX 的 LLM 模型
- ONNX 运行时 API 文档
- TensorRT for RTX EP 文档
请持续关注未来的改进,并快速了解我们示例演示中的新 API。如果您有功能需求,欢迎随时在 GitHub 上提交问题并告知我们!
致谢
我们要感谢 Gaurav Garg、Kumar Anshuman、Umang Bhatt 和 Vishal Agarawal 对本博客的贡献。