ONNX Runtime 执行提供程序

ONNX Runtime 通过其可扩展的 执行提供程序 (EP) 框架与不同的硬件加速库协同工作,以在硬件平台上最佳地执行 ONNX 模型。 此接口使 AP 应用程序开发人员能够灵活地将其 ONNX 模型部署在云和边缘的不同环境中,并通过利用平台的计算能力来优化执行。

Executing ONNX models across different HW environments

ONNX Runtime 使用 GetCapability() 接口与执行提供程序协同工作,以分配特定的节点或子图,以便 EP 库在受支持的硬件上执行。 预安装在执行环境中的 EP 库处理并在硬件上执行 ONNX 子图。 此架构抽象出了硬件特定库的细节,这些库对于优化跨 CPU、GPU、FPGA 或专用 NPU 等硬件平台深度神经网络的执行至关重要。

ONNX Runtime GetCapability()

ONNX Runtime 今天支持许多不同的执行提供程序。 其中一些 EP 已在生产环境中用于实时服务,而另一些则以预览版形式发布,以使开发人员能够使用不同的选项来开发和自定义其应用程序。

支持的执行提供程序摘要

CPU GPU IoT/边缘/移动 其他
默认 CPU NVIDIA CUDA Intel OpenVINO Rockchip NPU (预览)
Intel DNNL NVIDIA TensorRT Arm Compute Library (预览) Xilinx Vitis-AI (预览)
TVM (预览) DirectML Android 神经网络 API Huawei CANN (预览)
Intel OpenVINO AMD MIGraphX Arm NN (预览) AZURE (预览)
XNNPACK Intel OpenVINO CoreML (预览)  
  AMD ROCm TVM (预览)  
  TVM (预览) Qualcomm QNN  
    XNNPACK  

添加执行提供程序

专用硬件加速解决方案的开发人员可以与 ONNX Runtime 集成,以在其堆栈上执行 ONNX 模型。 要创建与 ONNX Runtime 交互的 EP,您必须首先为 EP 确定一个唯一的名称。 有关详细说明,请参阅:添加新的执行提供程序

构建带有 EP 的 ONNX Runtime 包

ONNX Runtime 包可以与 EP 的任何组合以及默认 CPU 执行提供程序一起构建。 注意,如果将多个 EP 组合到同一个 ONNX Runtime 包中,则所有依赖库都必须存在于执行环境中。 有关生成带有不同 EP 的 ONNX Runtime 包的步骤,请参阅此处

执行提供程序的 API

相同的 ONNX Runtime API 用于所有 EP。 这为应用程序在不同的硬件加速平台上运行提供了统一的接口。 用于设置 EP 选项的 API 可在 Python、C/C++/C#、Java 和 node.js 中使用。

注意 我们正在更新我们的 API 支持,以在所有语言绑定中获得对等性,并将在此处更新具体信息。

`get_providers`: Return list of registered execution providers.
`get_provider_options`: Return the registered execution providers' configurations.
`set_providers`: Register the given list of execution providers. The underlying session is re-created. 
    The list of providers is ordered by Priority. For example ['CUDAExecutionProvider', 'CPUExecutionProvider']
    means execute a node using CUDAExecutionProvider if capable, otherwise execute using CPUExecutionProvider.

使用执行提供程序

import onnxruntime as rt

#define the priority order for the execution providers
# prefer CUDA Execution Provider over CPU Execution Provider
EP_list = ['CUDAExecutionProvider', 'CPUExecutionProvider']

# initialize the model.onnx
sess = rt.InferenceSession("model.onnx", providers=EP_list)

# get the outputs metadata as a list of :class:`onnxruntime.NodeArg`
output_name = sess.get_outputs()[0].name

# get the inputs metadata as a list of :class:`onnxruntime.NodeArg`
input_name = sess.get_inputs()[0].name

# inference run using image_data as the input to the model 
detections = sess.run([output_name], {input_name: image_data})[0]

print("Output shape:", detections.shape)

# Process the image to mark the inference points 
image = post.image_postprocess(original_image, input_size, detections)
image = Image.fromarray(image)
image.save("kite-with-objects.jpg")

# Update EP priority to only CPUExecutionProvider
sess.set_providers(['CPUExecutionProvider'])

cpu_detection = sess.run(...)


目录