ONNX模型利用CUDA加速如何正确配置好环境?

目前onnx可选的执行引擎非常多,覆盖了从cpu、gpu到npu,从Intel平台到AMD平台等。如下是onnxruntime所有的执行引擎。

['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'MIGraphXExecutionProvider', 'ROCMExecutionProvider', 'OpenVINOExecutionProvider', 'DnnlExecutionProvider', 'TvmExecutionProvider', 'VitisAIExecutionProvider', 'QNNExecutionProvider', 'NnapiExecutionProvider', 'JsExecutionProvider', 'CoreMLExecutionProvider', 'ArmNNExecutionProvider', 'ACLExecutionProvider', 'DmlExecutionProvider', 'RknpuExecutionProvider', 'WebNNExecutionProvider', 'XnnpackExecutionProvider', 'CANNExecutionProvider', 'AzureExecutionProvider', 'CPUExecutionProvider']

我们最熟悉的执行引擎莫过于 CPUExecutionProvider了,所有的计算设备(电脑、计算盒子等)可以没有显卡、NPU等,但一定得有CPU,因此无论你的模型是用Pytorch训练的又或者是Tensorflow、MXNET、PaddlePaddle训练的,也不论你的模型网络结构是怎样的,又或者你的模型是部署在什么样的硬件环境下,我们总可以把pytorch等深度学习框架训练得到的模型转化为ONNX中间态,然后利用ONNX模型进行推理,并把ONNX迁移到任意设备上。要知道就拿Pytorch深度学习框架来说,不是所有的计算设备拥有的硬件环境可以满足安装Pytorch的,在个人笔记本上安装Pytorch或许很简单,但是在手机上或者算力更低的边缘计算设备上是安装不了Pytorch的,但是并不代表在手机上或者边缘计算设备上跑不了Pytorch训练的模型。这种情况下,ONNX就发挥了巨大作用。

但是总是用CPU推理ONNX模型往往速度不佳,难易达到低延迟、高吞吐。如果计算设备上有额外计算硬件加持并且ONNX支持该硬件那就更好了。

OK,言归正传,今天来聊一聊,在onnxruntime python api的情况下,如何正确配置好环境,让ONNX模型在拥有英伟达显卡的计算设备上进行深度加速。

在N卡上进行加速,首先,需要的硬件环境就是电脑上得有英伟达显卡,其实电脑上安装好了英伟达显卡驱动,没有安装好驱动的小伙伴可以查看这篇文章。之后就是安装CUDA工具包了,最后是下载onnxruntime-gpu依赖。

要理解用英伟达显卡加速ONNX模型,不是用onnxruntime而是onnxruntime-gpu,onnxruntime是CPU执行引擎,它没有CUDA、Tensorrt执行引擎,即使你手动指定了CUDA、Tensorrt执行引擎也没有用的。要下载onnxruntime-gpu并且手动指定执行引擎为TensorrtExecutionProvider'或者'CUDAExecutionProvider',你不指定,那么即使你下载了onnxruntime-gpu,也配置好了对应版本的CUDA,那么此时还是CPU推理,因为不论是onnxruntime还是onnxruntime-gpu,不指定执行引擎,都默认采用CPU执行引擎。其次,这两个包不能共存,下载onnxruntime-gpu之前要删除干净onnxruntime。onnxruntime的python 导包方式是

import onnxruntime

onnxruntime-gpu的python 导包方式也是

import onnxruntime

因此如果两个包共存,有时候导入的是onnxruntime,而有时候导入的是onnxruntime-gpu,会产生非常奇怪的bug 。

这里最容易犯错的地方就是安装CUDA。

经常会有小伙伴遇到:本地电脑下载安装、配置好了CUDA,也删除了onnxruntime,重新下载了onnxruntime-gpu,项目代码中的onnxruntime执行引擎也手动指定了'TensorrtExecutionProvider'或者 'CUDAExecutionProvider',为什么就是不走GPU推理,反而还是CPU?又或者遇到了:ONNX GPU推理反而比CPU还要慢的情况。这里就属于典型的CUDA版本跟onnxruntime-gpu版本不匹配。

以CUDACUDAExecutionProvider为例,官方明确指出了在推理的时候,onnxruntime-gpu的版本要跟CUDA、CuDnn版本匹配

NVIDIA - CUDA | onnxruntime

但是,就拿本人的多次onnx项目部署实践经历来说,有时候这些版本并不是严格完全对应的,上面的表格版本对应关系也是官方自己测试的,应该并不是面面俱到。例如官方测试的onnxruntime-gpu版本1.15 1.16 1.17可以对应CUDA11.6 CUDA 11.7 CUDA11.8; CuDnn版本8.2.4到8.9.0 

但是我测试过onnxruntime-gpu 1.16指定CUDAExecutionProvider引擎在不安装Cudnn,CUDA为11.4 11.7 11.8 12.4都可以进行加速 。但是我也有不少翻车的经历,有时候没注意CUDA跟onnxruntime-gpu的版本对应关系,ONNX项目不走GPU推理;项目走GPU推理反而比CPU还慢;项目走了GPU推理但是时快时慢,慢的时候比CPU还慢。这些情况我都遇到过,但是把版本对应起来之后,总能解决上面的问题。因此上面的版本对应关系还是非常具有参考意义的。

同时还要注意我们直接通过pip安装的onnxruntime-gpu都是官方实现帮我们编译好的,比如截止到2024.6.28,官方提供的onnxruntime-gpu 1.18 和 1.17都是在CUDA11.8环境下通过源码编译得到wheel包的,官方提示:CUDA11.8编译得到的onnxruntime在推理时可以兼容CUDA11.x,但是不能兼容CUDA12.x。但是本人通过pip安装的onnxruntime-1.16(虽然不知道是哪个版本CUDA编译而来的)在CUDA 11.4 11.7 11.8 12.4都可以进行加速

 

但是最正确的方式还是通过onnxruntime-gpu源码在本地用自己的CUDA编译出onnxruntime-gpu,但是编译过程繁琐而且不保证成功,我们大多数都是直接pip安装onnxruntime-gpu的wheel,但是此时务必注意版本对应关系。

那么问题来了,假如我的电脑全局安装了CUDA11.3,但是用CUDA11.3不能对onnx进行CUDA加速,需要重新安装CUDA吗?其实完全没有必要,我们完全可以利用anaconda在虚拟环境中安装指定版本的CUDA以适配onnxruntime-gpu,即本地环境多版本CUDA共存,可以参考本人的这篇文章

同理,执行引擎为 TensorrtExecutionProvider,onnxruntime也需要跟CUDA、Tensorrt版本匹配。NVIDIA - TensorRT | onnxruntime

指定引擎为TensorrtExecutionProvider需要在本地事先安装好Tensorrt,据我观察在推理的时候,是现场将onnx转Tensorrt的,但是模型不保存本地而是保存在内存中了,程序启动开始转换,程序结束Tensorrt模型销毁,并且这个转化的过程还很长,几十秒到几分钟不等,所以这就造成了一个问题,假如我写了一个脚本让模型推理一张图片,每次推理都需要重新执行这个脚本,那么模型转化的过程就包含在内了,此时表面上看时间很长,但实际上时间都花在了转化模型上。但是如果将这个模型发布为flask服务,在启动服务之前将onnx推理代码所在的类提前初始化,等个几分钟,模型先转化过去,服务在启动,模型推理速度就正常了。

 

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

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

相关文章

基于公有云部署wordpress

云平台选择 腾讯云 阿里云 华为云 项目部署 一、架构讲解 1.1、定义与组成 LNMP是Linux、Nginx、MySQL(或MariaDB)和PHP(或Perl、Python)的首字母缩写,代表在Linux系统下使用Nginx作为Web服务器,MySQL作为…

Mongodb安装与配置

Mongodb的下载 这里下载的是MongoDB 7.0.11版本的 首先进入官网:https://www.mongodb.com/ 点击完上面两步后,加载来到该页面,选择自己的版本、系统,是压缩包(zip)还是安装包(msi)。 下载好之后能,来到安装包哪里&a…

互联网直播/点播技术与平台创新应用:视频推拉流EasyDSS案例分析

随着互联网技术的快速发展,直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域,互联网直播/点播平台与技术的应用,不仅为用户带来了全新的购物体验,也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

wavesummit2024发布飞桨3.0版本

今天网上看了wavesummit2024深度学习开发者大会,本来没有啥期待,结果发现飞桨竟然发布3.0版本了! 以下是飞桨框架 3.x 的新特性: 动静统一自动并行: 为了降低大模型的编程难度,飞桨还优化了动静统一的半自动并行编程范…

全国青少年信息素养大赛Python省赛真题

全国青少年信息素养大赛Python省赛真题 第一题 时间限制 : 1000ms 内存限制 : 256MB 【题目描述】 输入一个整数,输出这个整数加 8 的结果。 【输入描述】 输入一行一个正整数 【输出描述】 输出求和的结果。 样例 1 【输入】 5 【输出】 13 第二…

陪诊小程序开发:寻找陪诊师更加快速,全程陪护!

陪诊行业是一个新兴行业,在当下市场中具有较大的发展前景。对于无法陪家人看病或者对医院不熟悉的人来说,陪诊师成为了刚需!目前随着社会的发展,人们的生活节奏不断加快,陪诊市场的需求量也在不断增加,发展…

荣耀终端发布首个端侧AI反诈检测技术,助力用户防范网络诈骗

在今日盛大开幕的2024年上海世界移动通信大会上,荣耀终端以卓越的创新实力引领行业潮流,率先发布了手机行业中首个端侧AI反诈检测技术。该技术旨在为用户提供更加安全、可靠的网络通信体验,助力防范日益猖獗的网络诈骗行为。 AI-321 | 专注全…

技巧类题目

目录 技巧类题目 136 只出现一次的数字 191 位1的个数 231. 2 的幂 169 多数元素 75 颜色分类 (双指针) 287. 寻找重复数 136 只出现一次的数字 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均…

【高考志愿】软件工程

目录 一、专业概述 二、就业前景 三、选择因素 3.1 学校实力 3.2 地理位置 3.3 分数线 四、学习建议 4.1 打好基础 4.2 培养动手能力 4.3 拓宽知识面 4.4 提升综合能力 五、软件工程专业学科排名 高考志愿选择软件工程专业是一个既具有挑战又充满机遇的决定。 一、…

【Redis四】主从复制、哨兵以及Cluster集群

目录 一.主从复制、哨兵、集群的区别 二.Redis主从复制 1.作用 2.原理 3.流程 三.搭建Redis 主从复制 1.源码编译安装以及配置文件修改 1.1.修改 Redis 配置文件(Slave节点操作) 2.验证主从复制 2.1.在Master节点上看日志 2.2.在Master节点上…

Raylib学习-鼠标检测与GPU缓冲区使用

鼠标左键点击运行绘制 #include <raylib.h>int main() {const int screenWidth 800;const int screenHeight 450;InitWindow(screenWidth, screenHeight, "test"); // 设置帧率SetTargetFPS(150); // 设置一个画布&#xff0c;可以使用GPU进行绘制RenderText…

虚拟化技术(二)

目录 三、存储虚拟化&#xff08;一&#xff09;存储虚拟化的一般模型&#xff08;二&#xff09;存储虚拟化的实现方式&#xff08;三&#xff09;案例分析 四、网络虚拟化&#xff08;一&#xff09;核心层网络虚拟化&#xff08;二&#xff09;接入层网络虚拟化&#xff08;…

【笔记】echarts图表的缩放和鼠标滚动冲突的处理解决方案

解决方案不是很好&#xff0c;来源于github的issue&#xff0c;官方提供了&#xff0c;组合键触发缩放的功能。 https://github.com/apache/echarts/issues/5769 https://echarts.apache.org/zh/option.html#dataZoom-inside.zoomOnMouseWheel dataZoom-inside.zoomOnMouseWhe…

Docker、Containerd添加代理

Docker、Containerd添加代理 博文的由来 国内网络环境下使用过docker的小伙伴&#xff0c;多数都会碰到一个一问题&#xff0c;由于连不上国外的dockerhub,导致无法pull需要的镜像&#xff0c;解决方案基本就四种 将镜像仓库地址切换到国内的镜像仓库使用别人打好的镜像包&am…

Android 12.0 通知发送过程源码分析-Framework

以下NotificationManagerService简称 NMS 1. 通知的发送: NotificationManager.notify(int id, Notification notification) 开始. 源码路径: /frameworks/base/core/java/android/app/NotificationManager.java/***发布通知以显示在状态栏中。 如果通知带有* 相同的 ID 已被…

debian打包小结

背景 业务需要&#xff0c;打一个openstack组件的deb包 openstack组件有setup.py可直接支持打rpm包&#xff0c;但不支持deb包&#xff0c;所以手动打deb包 用了dh_make准备打包文件&#xff0c;然后用debuild或dpkg-buildpackages打deb包 步骤 方法有很多&#xff0c;我用…

Linux驱动开发笔记(十二)并发与竞争

文章目录 前言一、并发与竞争的引入1.1 并发1.2 竞争1.3 解决方法 二、原子操作2.1 概念2.2 使用方法 三、自旋锁3.1 概念3.2 使用方法3.3 自旋锁死锁 四、信号量4.1 概念4.2 使用方法 五、互斥锁5.1 概念5.2 使用方法 前言 Linux的子系统我们已经大致学习完了&#xff0c;笔者…

项目测试排期的正确方法是什么?

测试排期是项目排期里面的一部分&#xff0c;所以了解项目排期对整体产品的全貌会有一个宏观的认知&#xff0c;甘特图能很好的体现项目排期&#xff0c;里面包含了参与角色和每个角色对应的排期。项目参与者和项目责任人都可以清晰的看到项目当前进展和项目耗时等。 甘特图可…

c++习题03-分卡片

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 二&#xff0c;思路 在做题的时候一定要认真审题&#xff0c;抓住关键的点和条件&#xff0c;才能够更高效的做对题目。 上面的题目有以下关键点&#xff08;关键条件&#xff0…

如何在Android中使用轻量级视图和ViewStub来减少内存占用和提高性能。

在Android中使用轻量级视图和ViewStub来减少内存占用和提高性能 一、技术难点 在Android开发中&#xff0c;使用轻量级视图&#xff08;如自定义视图&#xff09;和ViewStub来减少内存占用和提高应用性能&#xff0c;主要面临以下几个技术难点&#xff1a; 轻量级视图的设计与…