ResNet模型網絡
前言
在上一次的測試中,咱們從頭開始訓練了一個三個卷積層串聯一個全鏈接層的輸出,做爲貓狗分類的預測的模型,此次咱們本身訓練一個ResNet模型,並在如下三個環境中進行性能的對比框架
訓練模型工具
模型使用AIStudio 進行訓練,訓練和預測代碼以下性能
RESNET:https://aistudio.baidu.com/aistudio/projectdetail/67775
MOBILE:https://aistudio.baidu.com/aistudio/projectdetail/67776
按照以前咱們的作法,導出model文件和param文件。測試
測試結果
咱們執行預測,忽略掉預處理的速度,僅僅計算模型前向傳播的時間。fetch
對於AIstudio平臺,咱們計算如下代碼的運行時間設計
label = exe.run(inference_program, feed={feed_target_names[0]: tensor_img}, fetch_list=fetch_targets)
對於Edgeboard上面的PaddleMobile,咱們計算如下代碼的運行時間調試
PaddleTensor tensor; tensor.shape = std::vector({1, input_channel, input_width, input_height}); tensor.data = PaddleBuf(data, sizeof(data)); tensor.dtype = PaddleDType::FLOAT32; std::vector paddle_tensor_feeds(1, tensor); PaddleTensor tensor_out; tensor_out.shape = std::vector({}); tensor_out.data = PaddleBuf(); tensor_out.dtype = PaddleDType::FLOAT32; std::vector outputs(1, tensor_out); predictor->Run(paddle_tensor_feeds, &outputs);
如下爲兩個模型的評測數據圖片
ResNet開發
Edgeboard:
CPU:
GPU:
Mobile_Net
Edgeboard:
GPU:
CPU:
總結:
下表爲兩個模型預測速度的對比,從中來看,其速度相對於V100的GPU甚至還有必定的優點,讓人難以相信。我的的分析是因爲如下幾個緣由
我在進行模型預測的時候,使用鉗表對功率進行了大概的估計(條件有限),鉗表的讀數在0.6A-8A之間變化。結合使用的12V適配器,我大概估計Edgeboard的功耗爲8W.
以8W的功耗,在單張圖片的預測速度上面領先了幾十倍功耗的GPU與CPU。Edgeboard的表現仍是令我比較驚喜。原本想繼續移植一個前段時間的大尺度的分割網絡Unet進行嘗試,想繼續試試他最大能夠跑的模型大小,但彷佛Edgeboard目前還不支持分割,存在了必定遺憾。
另外我在進行調試的時候,發現過有幾個發佈版本的固件不是很穩定,有些op有些問題。還發現了Edgeboard在個人兩臺筆記本電腦上網絡不是很穩定,常常出現相互沒法ping通的狀況,更換PC後正常,暫時還沒發現爲何。
Edgeboard是我第一款接觸的嵌入式神經網絡加速設備。Paddle-mobile也是我接觸的第一個移動端神經網絡框架,也是我接觸的第一個基於FPGA實現的加速框架。從我瞭解這個框架到如今僅僅不到半年的時間,已經發布了多個模型轉換工具,下降了開發難度,而且支持EasyDL這種方式。雖然目前仍然有一些不成熟的坑須要填,不過相信在軟件的迭代下面,它能成爲一個很好的嵌入式原型設計平臺。
Mobile-SSD 模型
此次咱們本身訓練一個 Mobilenet-SSD 模型,增長了不一樣輸入維度的狀況下,模型運行效率的對比
AIStudio CPU: 2 Cores 8GB Memory
AIStudio GPU: V100 16GB VMem
Edgeboard
訓練模型
模型使用AIStudio提供的官方工程 進行訓練,訓練和預測代碼以下
Mobilenet-SSD:https://aistudio.baidu.com/aistudio/projectdetail/41752
按照以前咱們的作法,導出model文件和param文件。
運行預測
咱們執行預測,忽略掉預處理的速度,僅僅計算模型前向傳播的時間。
對於AIstudio平臺,咱們計算如下代碼的運行時間
label = exe.run(inference_program, feed={feed_target_names[0]: tensor_img}, fetch_list=fetch_targets)
對於Edgeboard上面的PaddleMobile,咱們計算如下代碼的運行時間
PaddleTensor tensor; tensor.shape = std::vector({1, input_channel, input_width, input_height}); tensor.data = PaddleBuf(data, sizeof(data)); tensor.dtype = PaddleDType::FLOAT32; std::vector paddle_tensor_feeds(1, tensor); PaddleTensor tensor_out; tensor_out.shape = std::vector({}); tensor_out.data = PaddleBuf(); tensor_out.dtype = PaddleDType::FLOAT32; std::vector outputs(1, tensor_out); predictor->Run(paddle_tensor_feeds, &outputs);
如下圖片爲預測結果,因爲時間有限,沒有很細緻去訓練模型,僅僅對比了模型運行的速度。
下表爲模型在不一樣維度下的預測速度的對比,從中來看,其速度相對於V100的GPU基本處於同一個數量級,遠遠領先與GPU
在以前的文章裏咱們提到,原本想繼續移植一個前段時間的大尺度的分割網絡Unet進行嘗試,想繼續試試他最大能夠跑的模型大小,但彷佛Edgeboard目前還不支持分割,因此咱們更換了目標檢測網絡進行嘗試。在mobilenet-SSD這個模型上,Edgeboard最大能夠跑到700*700的輸入維度,而且能保持在16fps之上(不包含輸入圖像的語出過程),基本上具備實時性。
以前我提到的,在個人兩臺筆記本電腦上網絡不是很穩定,常常出現相互沒法ping通的狀況,目前通過試驗以後,發現問題爲板子的網卡在與不支持千兆的網卡進行通訊時候,不能正確的協商,仍然使用千兆模式,使用如下命令固定爲百兆便可正常鏈接
ethtool -s eth0 speed 100 duplex full
Edgeboard是我第一款接觸的嵌入式神經網絡加速設備。Paddle-mobile也是我接觸的第一個移動端神經網絡框架,也是我接觸的第一個基於FPGA實現的加速框架。從我瞭解這個框架到如今僅僅不到半年的時間,已經發布了多個模型轉換工具,下降了開發難度,而且支持EasyDL這種方式。雖然目前仍然有一些不成熟的坑須要填,不過相信在軟件的迭代下面,它能成爲一個很好的嵌入式原型設計平臺。
做者:Litchll