onnxruntime——CUDA Execution Provider学习记录

news2024/11/13 9:33:04

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是在预览中发布的,以使开发人员能够使用不同的选项开发和定制他们的应用程序。

CPUGPUIoT/Edge/MobileOther
Default CPUNVIDIA CUDAIntel OpenVINORockchip NPU (preview)
Intel DNNLNVIDIA TensorRTARM Compute Library (preview)Xilinx Vitis-AI (preview)
TVM (preview)DirectMLAndroid Neural Networks APIHuawei CANN (preview)
Intel OpenVINOAMD MIGraphXARM-NN (preview)AZURE (preview)
XNNPACKIntel OpenVINOCoreML (preview)
AMD ROCmTVM (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: 设置卷积算法的搜索策略(例如,EXHAUSTIVEHEURISTIC 或 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可以显著提高推理性能,适用于各种深度学习应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ComfyUI 基础教程—— 应用 Controlnet 精准控制图像生成

一、前言 你是否有见过下面类似这样的图片: 看起来平平无奇,当你站远点看,或者把眼睛眯成一条缝了看,你会发现,这个图中藏有一些特别的元素。这就是利用了 Ai 绘画中的 ControlNet,实现对图片的相对更精…

实施经济实惠的DFIR 网络防御解决方案

数字取证 事件响应(DFIR)是防御的重要组成部分,它包括发现网络危险,调查它们,并采取措施阻止它们。这对于保护私有数据安全和确保IT系统正常工作非常重要。由于资金和资源有限,小公司往往难以建立有效的DFI…

数据库安全漏洞的克星:SqlMap

SqlMap:一键自动化,精准识别SQL注入漏洞。 - 精选真开源,释放新价值。 概览 sqlmap是一个广受认可的开源工具,专注于自动化SQL注入漏洞的检测和利用。它能够与多种数据库系统交互,包括但不限于MySQL、Oracle、Postgre…

Android源码修改 默认导航方式

1、静态修改 代码路径&#xff1a;frameworks/base/core/res/res/values/config.xml&#xff0c;由于我是用hbuilder打开 我们可以看到代码注释 <!-- Controls the navigation bar interaction mode: 0: 3 button mode (back, home, overview buttons) 1…

Excel和Word日常使用记录:

Excel使用总结 表格颜色填充&#xff1a; 合并单元格&#xff1a; 选中你要合并的单元格区域。 按下快捷键 Alt H&#xff0c;然后松开这些键。 再按下 M&#xff0c;接着按 C。 这个组合键执行的操作是&#xff1a;Alt H&#xff1a;打开“主页”选项卡。 M&#xff1a;选…

【Vue】状态管理模式Vuex

数据共享 流程搭建变更状态辅助函数分割模块 流程 Vuex是一个Vue的状态管理工具&#xff0c;状态就是数据&#xff08;某个状态在很多个组件来使用 &#xff0c;多个组件共同维护一份数据&#xff09; 搭建 1&#xff09;Vuex我们在脚手架搭建项目的时候直接搭建好了&#xff0…

面壁带来了小钢炮,MiniCPM3-4B

MiniCPM3-4B 是 MiniCPM 系列的第三代产品。 相比 MiniCPM1.0/MiniCPM2.0&#xff0c;MiniCPM3-4B 拥有更强大、更多用途的技能集&#xff0c;可以实现更广泛的应用。 MiniCPM3-4B 支持函数调用和代码解释器。 有关使用指南&#xff0c;请参阅高级功能。 MiniCPM3-4B 具有 32k …

微擎忘记后台登录用户名和密码怎么办?解决方法

微擎忘记后台登录名和登录密码是很常见的&#xff0c;服务器百科网fwqbk.com告诉你找回后台登录用户名和密码的方法&#xff1a; 一&#xff1a;找回微擎后台用户名 &#xff08;如果只是忘记了后台登录密码&#xff0c;请忽略此步骤&#xff0c;跳转到第二步&#xff09; 通…

博客摘录「 深度学习 | 编码器-解码器网络、seq2seq模型、束搜索算法」2024年9月7日

老师在课上是这样引入的&#xff1a; Sequence to Sequence Learning&#xff1a;两个循环神经网络组成。 红色部分和绿色部分都是RNN。 预测任务就是从一个序列到另一个序列。 第一个序列称之为原序列&#xff0c;第二个序列称为目标序列。两者…

【Windows】解决新版 Edge 浏览器开机自启问题(简单有效)

文章目录 1.前言2.查找资料3.查找方法4.解决办法 参考文章&#xff1a; 解决新版 Edge 浏览器开机自启问题&#xff08;简单有效&#xff09; Edge开机启动如何关闭 1.前言 电脑开机后edge浏览器开机自启动&#xff0c;并且在任务管理器–启动项内可看到edge浏览器&#xff0…

【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

文章目录 PyQt5入门级超详细教程前言第4部分&#xff1a;事件处理与信号槽机制4.1 什么是信号与槽&#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解&#xff1a; 4.4 处理不同的信号代码详解&#xff1a; 4.5 自定义信号与槽代码详解&#xff1a; 4.6 信号槽…

如何部署Vue+Springboot项目

很多同学在项目上线的部署遇到困难&#xff0c;不懂得怎么部署项目&#xff0c;本文将会带大家手把手从前端部署、java部署来教会大家。 如果项目涉及到了docker相关中间件的环境配置&#xff0c;请参看&#xff1a;https://blog.csdn.net/weixin_73195042/article/details/13…

vue3 为组件的 emits 标注类型,defineEmits基于类型的定义的简单理解

1&#xff09;在 <script setup> 中&#xff0c;emit 函数的类型标注也可以通过运行时声明或是类型声明进行。 2&#xff09;基于类型的&#xff1a; const emit defineEmits<{ (e: change, id: number): void (e: update, value: string): void }>() 说明&#x…

STM32 PWM 详解(基于 STM32F429 HAL 库)

目录 前言 一、PWM 简介 二、STM32F429 的 PWM 功能 1.定时器资源 2.PWM 模式 3.PWM原理图 三、使用 HAL 库配置 STM32F429 的 PWM 1.开启时钟 2.配置定时器 3.配置通道 4.启动定时器 5.PWM 占空比的调节 四、应用实例 五、总结 前言 在嵌入式系统开发中&#…

Python的图像算术与逻辑运算详解

一.图像加法运算 图像加法运算主要有两种方法。第一种是调用Numpy库实现&#xff0c;目标图像像素为两张图像的像素之和&#xff1b;第二种是通过OpenCV调用add()函数实现。第二种方法的函数原型如下&#xff1a; dst add(src1, src2[, dst[, mask[, dtype]]]) – src1表示第…

JavaScript使用地理位置 API

前言 在JavaScript中&#xff0c;Geolocation API 是一种用于访问用户地理位置的接口。这个API允许网页应用程序获取用户的位置并提供基于位置的服务。 if (navigator.geolocation)navigator.geolocation.getCurrentPosition(function () {},function () {});这个函数中需要传…

VMware Workstation v17.6 中文注册精简版

VMware Workstation Pro 是一款功能强大的桌面虚拟化软件&#xff0c;它允许用户在单一的物理机器上同时运行多个操作系统。无论是在 Windows 或 Linux 主机上&#xff0c;您都可以轻松创建和运行各种虚拟机&#xff0c;包括 Windows、Linux 以及 BSD。 全新升级&#xff0c;更…

【debug】nvidia-smi:Failed to initialize NVML: Unknown Error

今天用服务器时又突然报错cuda不可用&#xff0c;输入nvidia-smi检查&#xff0c;报错如题。 根据网上搜的原因&#xff0c;可能是因为系统内核自动升级导致与驱动版本不匹配&#xff0c;尝试重启&#xff1a;reboot&#xff0c;报错&#xff1a; 尝试 exit 退出容器再进入&am…

android framework工程师遇到成长瓶颈迷茫怎么办?千里马经验分享

背景 近来有一些framework老司机粉丝朋友发来了一些framework工作中的一些疑问&#xff0c;具体描述如下&#xff1a; 这个同学遇到的问题&#xff0c;其实就是大部分framework开发者工作比较久后遇到的一个上升瓶颈问题。 具体总结有以下几个瓶颈问题 1、framework属于系…

Qt qrc机制

文章目录 0. 前言1. qrc机制2. qrc使用 0. 前言 要设置窗口图标&#xff0c;就需要有图片及其图片所在路径&#xff0c;在本机上可能没什么问题&#xff0c;但是换了一个机器&#xff0c;路径可能不一致或者图片丢失&#xff0c;这就导致图片显示不出来。 Qt引入qrc机制&…