ONNX Runtime
(简称 ORT)是一个高性能的推理引擎,支持多种硬件加速器。CUDA Execution Provider
是 ONNX Runtime 提供的一个执行提供者(Execution Provider),专门用于在 NVIDIA GPU 上加速推理。以下是详细介绍:
1. 什么是 ONNX Runtime?
ONNX Runtime 是一个跨平台的推理引擎,支持多种硬件加速器(如 CPU、GPU、TPU 等)。它可以将 ONNX 格式的模型高效地运行在不同的硬件平台上,从而加速推理过程。ONNX运行时通过其可扩展执行提供程序(EP)框架与不同的硬件加速库协同工作,以在硬件平台上优化执行ONNX模型。此接口使AP应用程序开发人员能够灵活地在云和边缘的不同环境中部署其ONNX模型,并利用平台的计算能力优化执行。
ONNX Runtime使用GetCapability()接口与执行提供程序协作,以分配特定节点或子图,供EP库在支持的硬件中执行。预安装在执行环境中的EP库在硬件上处理和执行ONNX子图。该体系结构抽象出硬件特定库的细节,这些库对于跨CPU、GPU、FPGA或专用NPU等硬件平台优化深度神经网络的执行至关重要。
目前,ONNX运行时支持许多不同的执行提供程序。一些EPs是为实时服务而生产的,而另一些EPs是在预览中发布的,以使开发人员能够使用不同的选项开发和定制他们的应用程序。
CPU | GPU | IoT/Edge/Mobile | Other |
---|---|---|---|
Default CPU | NVIDIA CUDA | Intel OpenVINO | Rockchip NPU (preview) |
Intel DNNL | NVIDIA TensorRT | ARM Compute Library (preview) | Xilinx Vitis-AI (preview) |
TVM (preview) | DirectML | Android Neural Networks API | Huawei CANN (preview) |
Intel OpenVINO | AMD MIGraphX | ARM-NN (preview) | AZURE (preview) |
XNNPACK | Intel OpenVINO | CoreML (preview) | |
AMD ROCm | TVM (preview) | ||
TVM (preview) | Qualcomm QNN | ||
XNNPACK |
2. 什么是 Execution Provider?
Execution Provider 是 ONNX Runtime 中的一个概念,它定义了如何在特定的硬件平台上执行模型。每个 Execution Provider 都针对特定的硬件进行了优化,以提高推理性能。
demo实例:
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(...)
Table of contents
- NVIDIA - CUDA
- NVIDIA - TensorRT
- Intel - OpenVINO™
- Intel - oneDNN
- Windows - DirectML
- Qualcomm - QNN
- Android - NNAPI
- Apple - CoreML
- XNNPACK
- AMD - ROCm
- AMD - MIGraphX
- AMD - Vitis AI
- Cloud - Azure
- Community-maintained
- Add a new provider
3. CUDA Execution Provider 的作用
CUDA Execution Provider
是 ONNX Runtime 提供的一个执行提供者,专门用于在 NVIDIA GPU 上加速推理。它利用 NVIDIA CUDA 和 cuDNN 库来优化和加速深度学习模型的推理过程。具体来说:
-
CUDA: NVIDIA 的并行计算平台和编程模型,用于在 GPU 上进行高性能计算。
-
cuDNN: NVIDIA CUDA 深度神经网络库,提供了高度优化的卷积、池化、归一化等操作的实现。
4. 如何使用 CUDA Execution Provider
要使用 CUDA Execution Provider
,你需要在 ONNX Runtime 中配置它。以下是一个简单的示例,展示了如何在 Python 中使用 CUDA Execution Provider
:
import onnxruntime as ort
# 创建 ONNX Runtime 会话,并指定使用 CUDA Execution Provider
providers = ['CUDAExecutionProvider', 'CPUExecutionProvider']
session = ort.InferenceSession('your_model.onnx', providers=providers)
# 准备输入数据
input_data = {
'input_name': input_tensor # 替换为实际的输入数据
}
# 运行推理
outputs = session.run(None, input_data)
# 处理输出
# ...
5. 配置选项
CUDA Execution Provider
提供了一些配置选项,可以通过 provider_options
参数进行设置。以下是一些常用的配置选项:
-
device_id: 指定使用的 GPU 设备 ID(默认为 0)。
-
gpu_mem_limit: 设置 GPU 内存限制(以字节为单位)。
-
arena_extend_strategy: 设置内存扩展策略(例如,
kNextPowerOfTwo
或kSameAsRequested
)。 -
cudnn_conv_algo_search: 设置卷积算法的搜索策略(例如,
EXHAUSTIVE
、HEURISTIC
或DEFAULT
)。 -
do_copy_in_default_stream: 是否在默认流中进行数据拷贝(默认为
True
)。
6. 示例代码
以下是一个更详细的示例,展示了如何配置 CUDA Execution Provider
:
import onnxruntime as ort
# 配置 CUDA Execution Provider 选项
provider_options = {
'device_id': 0,
'gpu_mem_limit': 2 * 1024 * 1024 * 1024, # 2 GB
'arena_extend_strategy': 'kNextPowerOfTwo',
'cudnn_conv_algo_search': 'EXHAUSTIVE',
'do_copy_in_default_stream': True
}
# 创建 ONNX Runtime 会话,并指定使用 CUDA Execution Provider
providers = [
('CUDAExecutionProvider', provider_options),
'CPUExecutionProvider'
]
session = ort.InferenceSession('your_model.onnx', providers=providers)
# 准备输入数据
input_data = {
'input_name': input_tensor # 替换为实际的输入数据
}
# 运行推理
outputs = session.run(None, input_data)
# 处理输出
# ...
7. 优缺点
-
优点:
-
高性能: 利用 NVIDIA CUDA 和 cuDNN 库,可以显著加速深度学习模型的推理过程。
-
灵活性: 提供了多种配置选项,可以根据具体需求进行优化。
-
兼容性: 支持 ONNX 格式的模型,可以直接使用现有的 ONNX 模型进行推理。
-
-
缺点:
-
依赖性: 需要安装 NVIDIA CUDA 和 cuDNN 库,并且需要支持 CUDA 的 NVIDIA GPU。
-
配置复杂性: 需要根据具体的硬件和模型进行配置,可能需要一些调试和优化。
-
8. 适用场景
-
深度学习推理: 适用于需要高性能推理的深度学习应用,如图像分类、目标检测、自然语言处理等。
-
大规模部署: 适用于需要在大量 GPU 上进行大规模部署的场景。
CUDA Execution Provider
是 ONNX Runtime 提供的一个执行提供者,专门用于在 NVIDIA GPU 上加速推理。它利用 NVIDIA CUDA 和 cuDNN 库来优化和加速深度学习模型的推理过程。通过配置 CUDA Execution Provider
可以显著提高推理性能,适用于各种深度学习应用。