当前位置: 首页 > news >正文

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这样的库文件了,如下,

本文结束。

http://www.lryc.cn/news/286802.html

相关文章:

  • 【强化学习】QAC、A2C、A3C学习笔记
  • android usb2.0 协议基础(2)
  • C语言快速排序(非递归)图文详解
  • Java面试题136-150
  • 使用trace工具分析Mysql如何选择索引
  • 微信小程序(十二)在线图标与字体的获取与引入
  • 分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别
  • java web mvc-04-Apache Wicket
  • 暴力破解常见的服务器
  • 运行Navicat转储的数据库SQL文件失败
  • 动静态库的理解、制作、使用。
  • 【趣味游戏-08】20240123点兵点将点到谁就是谁(列表倒置reverse)
  • cherry键盘alt+tab无法切换窗口的问题解决
  • 「nuxt2配置tailwindcss」nuxt2添加tailwindcss详细步骤!解决版本不对称各种报错~~
  • 1、中级机器学习课程简介
  • Mybtisplus对时间字段进行自动填充
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • 音频特效SDK,满足内容生产的音频处理需求
  • 使用vue2写一个太极图,并且点击旋转
  • 张量计算和操作
  • 【Spring Boot 3】【JPA】枚举类型持久化
  • SVN 常用命令汇总(2024)
  • K8S四层代理Service-02
  • 3、非数值型的分类变量
  • 国内免费chartGPT网站汇总
  • 【Alibaba工具型技术系列】「EasyExcel技术专题」实战研究一下 EasyExcel 如何从指定文件位置进行读取数据
  • java.security.InvalidKeyException: Illegal key size错误
  • python脚本,实现监控系统的各项资源
  • Flink处理函数(2)—— 按键分区处理函数
  • 服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例