1.背景描述
随着深度学习的发展,算法框架层出不穷,比如Caffe2,TensorFlow,PyTorch等,这么多框架产生了一个问题,不同框架的算法模型,并不能通用。如果已经有一个Tensorflow的模型,需要将其部署在移动设备上,以观测效果,通常需要用caffe2重新将模型写好,然后再训练参数;试想下这将是一个多么耗时耗力的过程。
自然的,我们能想到,如果算法模型能在不同的框架之间通用,那问题不就解决了。
**Open Neural Network Exchange(ONNX,开放神经网络交换)**就应运而生。
ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互。 ONNX的规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,以开放源代码的方式托管在Github上。得到了主流深度学习算法框架的支持。
onnx官网
https://onnx.ai/
可以说,onnx的推出,解决了算法模型部署的大难题。
为了使用Onnx这样的中间件,我们需要一个可以用来加载使用onnx模型的运行时,也就是微软开发的onnxruntime。
官网地址:
https://www.onnxruntime.ai/
onnxruntime就是一套动态库,能支持linux、windows、macOS等多个平台,如何取得onnxruntime,有两种方式,一种是在github上下载官方发布的二进制版本。另一种是自己用源码编译。
2.二进制下载
微软在github上发布了各个版本对应的二进制文件。
比如我们需要用1.6.0版本的Windows下GPU加速版本,那么直接打开页面选择对应版本下载即可。
https://github.com/microsoft/onnxruntime/releases/tag/v1.6.0
Onnxruntime二进制版本对应关系和下载
3.Windows下编译onnxruntime
既然有官方二进制版本,为什么我们还要自己编译呢?
一方面,onnxruntime和cuda、cudnn、tensorRT、编译器等环境是绑定的,直接下载的不一定和你当前项目的环境一致。
另一方面,onnxruntime有很多特性,发布的二进制中只编译了一些基础特性,可能你需要的特性并未被包含在其中。
如果下载的二进制不能满足需要,那么我们就只能自己编译了,编译本身很简单,只是有一些坑需要注意。
3.1 编译环境
- Windows 10
- Visual Studio 2017
- cuda 10.0
- cudnn7.6.5
- TensorRT-7.0.0.11
注意:
- VS要用2017或更高版本,更低的版本编译会失败,项目用到了一些较新的特性。
- TensorRT也需要7.0或以上版本,低版本会有各种莫名问题,我尝试过6.0,问题太多。
3.2 源码下载
onnxruntime源码地址
https://github.com/microsoft/onnxruntime
(1)下载源码
git clone -b rel-1.3.0 --recursive https://github.com/Microsoft/onnxruntime
注意:一定要加递归**–recursive**,不然子项目下载不到。版本分支按照需要选取就行了。
(2)更新包
cd onnxruntime
git submodule update --init --recursive
如果下载慢,也可以用gittee上的镜像
https://gitee.com/mirrors_microsoft/onnxruntime
但是在递归下载子项目的时候,还是会从github上拖。
3.3编译脚本
用管理员打开命令行控制台,进入onnxruntime目录:
选好自己的cuda、cudnn、tensorRT路径,执行脚本,就可以开始编译。
.\build.bat --build_shared_lib --config Release --use_cuda --cudnn_home "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0" --cuda_home "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0" --use_tensorrt --tensorrt_home "C:\TensorRT-7.0.0.11"
不过这样在编译过程中会报错。
出错了不好修改,所以,当目录下生成了VS工程后,就直接用 VS2017 编译更方便一些。
用VS2017打开工程onnxruntime.sln,选择Release,x64。
下一步,将每个工程中“C/C++/常规/将警告视为错误”这条,改成否。
修改改完后,直接在onnxruntime上右键选择编译就可以了。
编译完成后在Release下会生成需要的onnxruntime动态库。
其他:Linux下
Linux下的编译基本是一样的,把build.bat换成build.sh就行了。脚本如下:
.\build.sh --build_shared_lib --config Release --use_cuda --cudnn_home [cuda路径] --cuda_home [CuDNN路径] --use_tensorrt --tensorrt_home [TensorRT路径] --update --build
关于onnxruntime的用法,后面文章再举例来说明了。