使用 C++ 部署深度學(xué)習(xí)模型快速上手方案
本文將從獲取一個(gè)訓(xùn)練好的?shufflenet_v2
?模型出發(fā), 講解如何使用 MegEngine Lite 的 C++ 接口將其部署到 CPU(Linux x86 / Android Arm)環(huán)境下運(yùn)行。主要分為以下小節(jié):
導(dǎo)出已經(jīng)訓(xùn)練好的模型
編寫 Inference 代碼
編譯 MegEngine Lite
編譯 Inference 代碼
執(zhí)行 Inference 文件,驗(yàn)證結(jié)果
參見:
MegEngine Lite 還可以?通過 Python 接口進(jìn)行使用, 使用方便但有局限性。
導(dǎo)出已經(jīng)訓(xùn)練好的模型
請參考?獲得用于 MegEngine Lite 推理的模型。
編寫 Inference 代碼
首先創(chuàng)建一個(gè)?main.cpp
, 在這個(gè)文件中將直接調(diào)用 MegEngine Lite 的接口運(yùn)行?shufflenet_v2.mge
?模型, 輸入數(shù)據(jù)?input_tensor
?是隨機(jī)生成的,所以不用在乎計(jì)算結(jié)果。
上面代碼主要完成了幾個(gè)步驟,包括:
創(chuàng)建默認(rèn)配置的 Network;
載入模型,MegEngine Lite 將讀取并解析模型文件,并創(chuàng)建計(jì)算圖;
通過輸入 Tensor 的名字獲取模型的輸入 Tensor, 并設(shè)置隨機(jī)數(shù)作為輸入數(shù)據(jù);
執(zhí)行 Inference 邏輯;
獲取模型輸出 Tensor, 并處理輸出數(shù)據(jù)。
至此完成了一個(gè)?shufflenet_v2
?模型的推理過程的 C++ 代碼編寫。
但在真正運(yùn)行這段代碼之前,還需要編譯該 C++ 源文件,并鏈接 MegEngine Lite 庫文件。 ?? ?? ??
編譯 MegEngine Lite
注解
這一步的目的是獲得 MegEngine Lite 的靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫,供我們上面代碼編譯時(shí)候進(jìn)行鏈接; 編譯的過程和?從源碼編譯 MegEngine?中的介紹是一致的。
下面將演示在 Linux x86 下使用動(dòng)態(tài)鏈接,Android Arm 上使用靜態(tài)鏈接的流程:
1、首先需要 Clone 整個(gè) MegEngine 工程,并進(jìn)入到 MegEngine 的根目錄:
2、環(huán)境準(zhǔn)備 & 執(zhí)行編譯:
Linux x86
準(zhǔn)備編譯依賴的子模塊:
安裝英特爾數(shù)學(xué)核心庫(MKL):
本機(jī)編譯 MegEngine Lite:
Android Arm
準(zhǔn)備編譯依賴的子模塊:
從安卓?官網(wǎng)?下載 NDK 并解壓到某路徑, 并將改路徑設(shè)置為?NDK_ROOT
?環(huán)境變量:
交叉編譯 MegEngine Lite:
編譯完成之后 MegEngine Lite 庫和頭文件路徑 /path/to/megenginelite-lib
Linux x86:?
build_dir/host/MGE_WITH_CUDA_OFF/MGE_INFERENCE_ONLY_ON/Release/install/lite/
Android Arm:?
build_dir/android/arm64-v8a/Release/install/lite/
編譯 Inference 代碼
有了上一步得到的 MegEngine Lite 庫文件,我們就可以在編譯 Inference 代碼的時(shí)候進(jìn)行動(dòng)態(tài)鏈接或靜態(tài)鏈接。 下面分別用 Linux x86 和 Android Arm 來展示兩種鏈接方式,演示編譯 Inference 代碼的步驟:
Linux x86 動(dòng)態(tài)鏈接編譯
根據(jù)自身環(huán)境選擇編譯器(這里使用的是 clang++, 也可以用 g++),動(dòng)態(tài)鏈接?liblite_shared.so
?文件:
export LITE_INSTALL_DIR=/path/to/megenginelite-lib #上一步中編譯生成的庫文件安裝路徑
編譯完成之后,就得到了可執(zhí)行文件?demo_deploy
.
Android Arm 靜態(tài)鏈接編譯
Android Arm 編譯為交叉編譯(在 Linux 主機(jī)上編譯 Android Arm 中運(yùn)行的可執(zhí)行程序)。
以鏈接 MegEngine Lite 的靜態(tài)庫作為示例,需要確保 NDK 環(huán)境準(zhǔn)備完成,
編譯完成之后,需要將?demo_deploy
?和模型文件?shufflenet_v2.mge
?拷貝到 Android Arm 機(jī)器上。
執(zhí)行 Inference 文件,驗(yàn)證結(jié)果
最后執(zhí)行編譯好的文件,就可以看到推理結(jié)果:
這樣就快速完成了 X86 和 Arm 上簡單的 demo 部署。
在本例中,最后計(jì)算結(jié)果可以看到:經(jīng)過?softmax
?之后,輸出的結(jié)果中?sum = 1
, 符合?softmax
?的輸出特點(diǎn)。
附
GitHub:MegEngine 曠視天元?(歡迎 star~
https://github.com/MegEngine
Gitee:MegEngine/MegEngine
https://gitee.com/MegEngine/MegEngine
MegEngine 官網(wǎng):MegEngine-深度學(xué)習(xí),簡單開發(fā)
https://www.megengine.org.cn/
歡迎加入 MegEngine 技術(shù)交流 QQ 群:1029741705