在Windows应用程序中于NVIDIA RTX AI PC上部署高性能AI模型
如今,某中心正面向开发者提供Windows ML。Windows ML使C#、C++和Python开发者能够利用PC硬件(从CPU、NPU到GPU)在本地高效运行AI模型。在NVIDIA RTX GPU上,它利用为RTX定制的NVIDIA TensorRT执行提供程序,并借助GPU的Tensor Core以及FP8和FP4等架构优势,为基于Windows的RTX AI PC提供最快的AI推理性能。
“Windows ML为GeForce RTX和RTX Pro GPU解锁了完整的TensorRT加速功能,在Windows 11上提供了卓越的AI性能,”某中心副总裁、杰出工程师Logan Iyer表示。“我们很高兴它今天正式向开发者开放,以便大规模构建和部署强大的AI体验。”
Windows ML与为RTX优化的TensorRT EP概述
Windows ML构建于用于推理的ONNX Runtime API之上。它扩展了ONNX Runtime API,以处理PC上跨CPU、NPU和GPU硬件的执行提供程序的动态初始化和依赖管理。此外,Windows ML还会根据需要自动下载必要的执行提供程序,从而减少了应用开发者跨多个不同硬件供应商管理依赖项和软件包的需求。
为RTX优化的NVIDIA TensorRT执行提供程序为使用ONNX Runtime的Windows ML开发者带来了多项优势:
- 与之前在NVIDIA RTX GPU上的DirectML实现相比,以低延迟推理运行ONNX模型,吞吐量提升50%,如下图所示。
- 通过其灵活的EP架构以及与ORT的集成,直接与WindowsML集成。
- 为最终用户设备上的简化部署提供即时编译。了解更多关于TensorRT for RTX内的编译过程。此编译过程在ONNX Runtime中作为EP上下文模型受支持。
- 利用Tensor Core上的架构进步,如FP8和FP4。
- 轻量级软件包,仅不到200 MB。
- 支持多种模型架构,从LLM(通过ONNX Runtime GenAI SDK扩展)、扩散模型、CNN等。
了解更多关于TensorRT for RTX的信息。
选择执行提供程序
与WindowsML一同提供的ONNX Runtime 1.23.0版本,提供了与供应商和执行提供程序无关的设备选择API。这极大地减少了为每个硬件供应商平台利用最优执行提供程序所需的应用程序逻辑。请参阅以下代码摘录,了解如何有效实现此操作并在NVIDIA GPU上获得最佳性能。
// 注册所需的各种供应商执行提供程序库
auto env = Ort::Env(ORT_LOGGING_LEVEL_WARNING);
env.RegisterExecutionProviderLibrary("nv_tensorrt_rtx", L"onnxruntime_providers_nv_tensorrt_rtx.dll");
// 选项 1: 依赖ONNX Runtime执行策略
Ort::SessionOptions sessions_options;
sessions_options.SetEpSelectionPolicy(OrtExecutionProviderDevicePolicy_PREFER_GPU);
// 选项 2: 遍历EpDevices以执行手动设备选择
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);
# 注册所需的各种供应商执行提供程序库
ort.register_execution_provider_library("NvTensorRTRTXExecutionProvider", "onnxruntime_providers_nv_tensorrt_rtx.dll")
# 选项 1: 依赖ONNX Runtime执行策略
session_options = ort.SessionOptions()
session_options.set_provider_selection_policy(ort.OrtExecutionProviderDevicePolicy.PREFER_GPU)
# 选项 2: 遍历EpDevices以执行手动设备选择
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)
提供快速加载时间的预编译运行时
模型运行时现在可以使用ONNX Runtime内的EP上下文ONNX文件进行预编译。每个执行提供程序都可以利用此功能优化ONNX模型的整个子图,并提供EP特定的实现。此过程可以序列化到磁盘,以便与WindowsML实现快速加载,通常这比之前Direct ML中传统的基于算子的方法更快。
下图显示,TensorRT for RTX EP需要时间进行编译,但由于优化已经序列化,加载和模型推理速度更快。此外,TensorRT for RTX EP内的运行时缓存功能确保编译阶段生成的内核被序列化并存储到目录中,这样在后续推理时无需重新编译。
通过ONNX Runtime设备API和Windows ML实现最小的数据传输开销
新的ONNX Runtime设备API(在Windows ML中也可用)枚举了每个执行提供程序的可用设备。利用这个新概念,开发者现在可以分配设备特定的张量,而无需额外的依赖于EP的类型规范。
通过利用CopyTensors和IOBinding,此API使开发者能够以最小的运行时数据传输开销执行与EP无关的GPU加速推理,从而提高性能并实现更清晰的代码设计。
图5展示了利用ONNX Runtime设备API的Stable Diffusion 3.5 Medium模型。下面的图4展示了同一模型在扩散循环中单次迭代所需的时间,分别在有设备IO绑定和没有设备IO绑定的情况下。
使用Nsight系统,可以可视化在不使用IO绑定时由于主机和设备之间重复复制而产生的性能开销:
在每次推理运行之前,都会执行输入张量的复制操作(在我们的性能分析中以绿色高亮显示),而输出的设备到主机复制也大约需要相同的时间。此外,ONNX Runtime默认使用可分页内存,对于这种内存,设备到主机的复制是隐式同步的,尽管ONNX Runtime使用了cudaMemCpyAsync API。
另一方面,当输入和输出张量被IO绑定时,输入的主机到设备复制仅在多模型推理流水线开始之前发生一次。输出的设备到主机复制同样如此,之后我们再次同步CPU和GPU。上面的异步Nsight跟踪描述了循环中的多次推理运行,期间没有任何复制操作或同步操作,甚至在此期间释放了CPU资源。这导致设备复制时间为4.2毫秒,一次性的主机复制时间为1.3毫秒,使得总复制时间仅为5.5毫秒,与推理循环中的迭代次数无关。作为参考,这种方法使30次迭代循环的复制时间减少了约75倍!
TensorRT for RTX特定优化
TensorRT for RTX执行提供自定义选项以进一步优化性能。最重要的优化如下:
-
CUDA图:通过设置
enable_cuda_graph来启用,以捕获TensorRT启动的所有CUDA内核到一个图中,从而减少CPU上的启动开销。如果TensorRT图启动许多小内核,以致GPU执行这些内核的速度快于CPU提交它们的速度,这一点就非常重要。此方法为LLM带来约30%的性能提升,并且对许多模型类型(包括传统AI模型和CNN架构)都有用。 -
运行时缓存:
nv_runtime_cache_path指向一个目录,与使用EP上下文节点结合,可以在其中缓存编译好的内核以实现快速加载时间。 -
动态形状:通过设置三个选项
profile_{min|max|opt]_shapes来覆盖已知的动态形状范围,或者通过指定静态形状使用AddFreeDimensionOverrideByName来固定模型的输入形状。目前,此功能处于实验模式。
总结
很高兴与某中心合作,为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 Runtime API示例
- 构建专为ONNX Runtime GenAI和NVIDIA TensorRT for RTX优化的LLM模型
- ONNX Runtime的API文档
- TensorRT for RTX EP文档
请持续关注未来的改进,并通过我们的示例演示的新API加快学习速度。如果您有任何功能请求,欢迎在GitHub上提出问题并告知我们!
致谢
感谢Gaurav Garg、Kumar Anshuman、Umang Bhatt和Vishal Agarawal对本博客的贡献。