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
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路徑,執行腳本,就可以開始編譯。
.uild.bat build_shared_lib config Release use_cuda cudnn_home "C:Program FilesNVIDIA GPU Computing ToolkitCUDAv10.0" cuda_home "C:Program FilesNVIDIA GPU Computing ToolkitCUDAv10.0" use_tensorrt tensorrt_home "C:TensorRT-7.0.0.11"
不過這樣在編譯過程中會報錯。
出錯了不好修改,所以,當目錄下生成了VS工程後,就直接用
VS2017 編譯更方便一些。
下一步,將每個工程中“C/C++/常規/
將警告視為錯誤”這條,改成
否。
修改改完後,直接在onnxruntime上右鍵選擇編譯就可以了。
編譯完成後在Release下會生成需要的onnxruntime動態庫。
其他:Linux下
Linux下的編譯基本是一樣的,把build.bat換成build.sh就行了。腳本如下:
.uild.sh build_shared_lib config Release use_cuda cudnn_home [cuda路徑] cuda_home [CuDNN路徑] use_tensorrt tensorrt_home [TensorRT路徑] update build
關於onnxruntime的用法,後面文章再舉例來說明了。