AI部署开发指南:用vs2019编译OnnxRuntime-v1.16.2
前言
要详细了解一个系统的部署,对其源码进行调试可能是最好的办法。
Pytorch的部署几经改版,最大的特点依然是不稳定,或者使用libtorch这种稳定但优化力度不够的部署方案。
而稳定且通用的方案,目前仍然是export to onnx的办法居多。onnxruntime在c++部署方面目前用得比较多,所以这里我们以微软最典型的onnxruntime部署为例,对其源码进行编译。编译后,就可以直接使用vs2019来进行源码级调试抓BUG了。
ONNXRuntime(Open Neural Network Exchange)是微软推出的一款针对ONNX模型格式的推理框架,支持多种运行后端包括CPU,GPU,TensorRT,DML等。是对ONNX模型最原生的支持,只要导出的onnx模型,便能对将不同框架的结果进行部署,提高开发效率。
生成vs2019项目
第一步是把onnxruntime从github上拉取下来,并且重命名文件夹为onnxruntime1162,版本是v1.16.2,如下,
git clone --recursive https://github.com/microsoft/onnxruntime -b v1.16.2 onnxruntime1162
然后用cmake-gui开始配置项目,这里我们按官方的配置来选择。
首先是要配置onnxruntime_USE_CUDA,这个是为使用GPU而设置的,

另外,protobuf的配置需要格外注意,很多情况下,onnxruntime能否编译成功,就取决于这个protobuf能否正确链接。因为一般的onnx和onnxruntime的库都是dll,所以我们这里选择protobuf_BUILD_SHARED_LIBS,避免windows下链接出现问题。

最后,还要配置onnxruntime_BUILD_SHARED_LIB,否则的话不会生成onnxruntime.dll,应用程序就需要自己再去链接abseil,protobuf等库。其实这个选项应该默认是ON才对,但官方设置为OFF,所以这里必须手动设置为ON。

当然官方还有一个tensorrt,由于我手头还没有用到tensorrt,所以暂时也没有勾选。
根据onnxruntime官网上的issue,
https://github.com/microsoft/onnxruntime/issues/1777
需要设置CUDA_HOME和CUDNN_HOME这两个参数。不过编译后,我发现这不是必须的,因为可以在生成项目后在vs2019项目的属性中添加,像cudnn.h这样的头文件,直接拷贝到项目onnxruntime_providers_cuda_obj.vcxproj同目录下即可。后面我们详细介绍。
当然,如果你要设置CUDA_HOME和CUDNN_HOME这两个参数的话,可以在环境变量中这样设置,
CUDA_HOME
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.0
CUDNN_HOME
C:\Programs\cudnn-windows-x86_64-8.9.2.26_cuda12
这里对应我的RTX3080TI安装版的Cuda版本是
cuda_12.0.1_528.33_windows.exe
CUDNN的开发包是
cudnn-windows-x86_64-8.9.2.26_cuda12-archive.zip

用cmake-gui的configure+generate之后,就可以生成vs2019的项目了。
配置cudnn并生成动态库
用vs2019打开项目后, 要在以下这几个项目的属性中添加上cudnn的配置,我这里取名为cudnn12-8.9.2.26.props;根据我前面提到的cuda和cudnn的安装位置,其内容如下,
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>C:\Programs\cudnn-windows-x86_64-8.9.2.26_cuda12\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>C:\Programs\cudnn-windows-x86_64-8.9.2.26_cuda12\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>cudnn.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>


编译时发现,cmake已经找到了cuda相关的库的位置,但cudnn的位置并不正确,老是报找不到cudnn.h,于是,我索性把相关文件直接拷贝到了项目所在的目录下面,然后再编译。
按这个配置好开始编译,一路上基本上不会有太大问题,编译之后就可以得到onnxruntime.dll这样的库文件了,如下,

本文结束。
相关文章:
AI部署开发指南:用vs2019编译OnnxRuntime-v1.16.2
前言 要详细了解一个系统的部署,对其源码进行调试可能是最好的办法。 Pytorch的部署几经改版,最大的特点依然是不稳定,或者使用libtorch这种稳定但优化力度不够的部署方案。 而稳定且通用的方案,目前仍然是export to onnx的办法…...
【强化学习】QAC、A2C、A3C学习笔记
强化学习算法:QAC vs A2C vs A3C 引言 经典的REINFORCE算法为我们提供了一种直接优化策略的方式,它通过梯度上升方法来寻找最优策略。然而,REINFORCE算法也有其局限性,采样效率低、高方差、收敛性差、难以处理高维离散空间。 为…...
android usb2.0 协议基础(2)
2.4 USB逻辑部件 USB 逻辑部件 设备---》 接口 (一个或多个):用于描述特定功能,包含多个端点----》端点(一个或多个): 传输的最终对象端点号,传输类型传输方向,最大的数据…...
C语言快速排序(非递归)图文详解
前言: 上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈…...
Java面试题136-150
36、用JDBC如何调用存储过程 代码如下: package com.huawei.interview.lym; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class JdbcTest…...
使用trace工具分析Mysql如何选择索引
背景说明 工作中,可能会遇到执行一个SQL,明明有索引,但是采用explain分析后发现执行结果并未走索引。甚至还有部分SQL语句相同就只是查询条件不一样也会出现有的走索引,有的不走索引情况。比如: 我的示例环境有个employees表,并有个idx_name_age_position的联合索引…...
微信小程序(十二)在线图标与字体的获取与引入
注释很详细,直接上代码 上一篇 新增内容: 1.从IconFont获取图标与文字的样式链接 2.将在线图标配置进页面中(源码) 3.将字体配置进页面文字中(源码) 4.css样式的多文件导入 获取链接 1.获取图标链接 登入…...
分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别
分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…...
java web mvc-04-Apache Wicket
拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …...
暴力破解常见的服务器
目录 使用 pydictor 生成自己的字典工具liunx下载使用常用的参数说明插件型字典 (可自己根据 API 文档开发) 使用 hydra 工具在线破解系统用户密码使用 hydra 破解 windows 7 远程桌面密码使用 hydra 工具破解 ssh 服务 root 用户密码 使用 Medusa 工具在线破解medusa参数说明M…...
运行Navicat转储的数据库SQL文件失败
报错:1067 - Invalid default value for ‘publish_date’ 单独拎出来该建表语句执行,报错一样,都是默认值出错 查看该字段的设计语句 publish_date timestamp NOT NULL DEFAULT 0000-00-00 00:00:00 COMMENT 发布时间, 发现该字段的默认值…...
动静态库的理解、制作、使用。
一.动静态库的理解。 1.什么是库? 代码是无穷无尽的,当程序猿在写一些项目时,未必所有代码亲历亲为,他们可以在网上寻找大佬写过的一些有关需求的代码,这些代码可以让他们拿过来直接使用,而省去了许多精力…...
【趣味游戏-08】20240123点兵点将点到谁就是谁(列表倒置reverse)
背景需求: 上个月,看到大4班一个孩子在玩“点兵点将点到谁就是谁”的小游戏,他在桌上摆放两排奥特曼卡片,然后点着数“点兵点将点到谁就是谁”,第10次点击的卡片,拿起来与同伴的卡片进行交换。他是从第一排…...
cherry键盘alt+tab无法切换窗口的问题解决
现象: alt 好用, tab好用,tabalt不好用。 原因: 键盘误触了关闭了alttab的功能。 不同的樱桃键盘可能方法不一样,下面是两个方案,本人的键盘是MX6.0 G80 3930红轴,用的方法一解决就了&#…...
「nuxt2配置tailwindcss」nuxt2添加tailwindcss详细步骤!解决版本不对称各种报错~~
运行环境 node和npm使用版本 node v14.21.3 (npm v6.14.18) 1.插件下载 官方文档说明 npm install -D nuxtjs/tailwindcss3.4.3 tailwindcss3.4.1 postcss^8.4.33 autoprefixer10.4.17 2.nuxt.config.js配置 module.exports {// ...buildModules: [nuxtjs/tailwindcss],// …...
1、中级机器学习课程简介
文章目录 1、课程简介2、先决条件 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 1、课程简介 欢迎来到机器学习中级课程! 如果你对机器学习有一些基础,并且希望学习如何快速提高模型质量…...
Mybtisplus对时间字段进行自动填充
一、引入依赖 <!-- mybatis-plus-boot-starter--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency> 二、配置类 这里我…...
[HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…...
音频特效SDK,满足内容生产的音频处理需求
美摄科技,作为音频处理技术的佼佼者,推出的音频特效SDK,旨在满足企业内容生产中的音频处理需求。这款SDK内置多种常见音频处理功能,如音频变声、均衡器、淡入淡出、音频变调等,帮助企业轻松应对各种音频处理挑战。 一…...
使用vue2写一个太极图,并且点击旋转
下面是我自己写的一个代码,命名有些不规范,大家不要介意。 <template><div class"qq"><div class"app" :style"{ transform: rotateStyle }"><div class"app1"><div class"ap…...
手把手教你用Matlab搞定镜像电荷法仿真:从平面到半球导体的电场可视化
手把手教你用Matlab实现镜像电荷法仿真:从平面到半球导体的电场可视化 在电磁场理论的学习中,镜像电荷法是一个既经典又实用的计算方法。它通过引入虚拟电荷来简化复杂边界条件下的电场计算问题。本文将带你从零开始,用Matlab实现从简单平面到…...
信号与线性系统分析(吴大正第5版)自学避坑指南:这些印刷错误和公式笔误你遇到了吗?
信号与线性系统分析(吴大正第5版)自学避坑指南:这些印刷错误和公式笔误你遇到了吗? 当你独自面对《信号与线性系统分析》这本经典教材时,是否曾因某个公式推导卡壳数小时?是否反复检查自己的计算步骤&#…...
告别卡顿与错帧:Glide + WebPDecoder库优化WebP动图播放的完整实践
Glide WebPDecoder库深度优化:解决WebP动图播放三大核心难题 在移动应用开发中,动态图像的流畅播放直接影响用户体验。WebP格式因其优秀的压缩率和动画支持,正逐渐成为替代GIF的首选方案。然而,Android平台上使用Glide加载WebP动…...
StarRocks BE启动失败?别急着查网络,先看看你的CPU是不是AVX2指令集
StarRocks BE启动失败?可能是你的CPU在拖后腿 当你兴冲冲地准备部署StarRocks,却发现BE进程像幽灵一样启动即消失,日志文件也神秘失踪,这种挫败感我深有体会。大多数人的第一反应是检查网络配置或服务端口,但今天我要带…...
Halbot框架解析:从零构建可扩展聊天机器人的实践指南
1. 项目概述:一个轻量级、可扩展的聊天机器人框架最近在折腾一个需要集成多个聊天平台(比如微信、钉钉、Telegram)的自动化项目,发现市面上现成的机器人框架要么太重,要么扩展性不够,要么就是文档写得云里雾…...
正规全能艺术台制造厂:可靠厂商选择要点解析
正规全能艺术台制造厂选择指南:5大可靠厂商评估要点FAQ“选对全能艺术台制造厂,不是看广告多响,而是看这5个‘隐性指标’——合规资质、自研技术、服务体系、数据安全、内容迭代能力!”很多公共文化场馆在采购全能艺术台时&#x…...
终极文档下载神器:30+平台一键免费保存,告别繁琐下载流程
终极文档下载神器:30平台一键免费保存,告别繁琐下载流程 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该…...
PXIe-9150嵌入式控制器:构建高集成度自动化测试系统的核心
1. 项目概述:从一块板卡到一套系统最近在整理实验室的测试设备,翻出来几台老旧的PXI机箱,想着怎么把它们重新利用起来。正好手头有个新项目,需要搭建一套多通道、高精度的数据采集与实时处理系统,传统的工控机加板卡的…...
UE5保姆级教程:用Electra Player插件在场景里放视频,从导入MP4到带声音播放
UE5实战指南:Electra Player插件实现场景视频播放全流程解析 在虚幻引擎5的沉浸式场景中,视频播放功能已成为增强环境叙事的关键技术。无论是商场里的动态广告屏、科幻场景中的全息投影,还是角色手持设备的交互界面,流畅的视频播放…...
Excel插件E灵实战:把杂乱的家庭成员明细表,一键变成规整的‘一户一档’报表
Excel插件E灵实战:从杂乱数据到专业报表的智能转换 在日常办公中,我们经常需要处理各种家庭成员信息表,这些原始数据往往杂乱无章,包含重复、缺失或不规范的记录。传统的手工整理方式不仅耗时费力,还容易出错。本文将详…...
