移動深度學習的幾個問題
本文主要概括了在移動端深度學習與服務端深度學習的幾個重要差異。
一、在移動端和服務器應用深度學習的難點對比
對比點 |
服務器端 |
移動端 |
內存 |
內存較大,一般不構成限制 |
內存有限 |
耗電量 |
不構成限制 |
移動設備的耗電量是一個很重要的限制因素 |
依賴庫體積 |
不構成限制 |
存儲空間有限,所有依賴庫體積容易構成限制 |
模型體積 |
常規模型體積200MB |
模型體積不宜超過10MB |
性能 |
GPU box等集羣式計算量很容易超過百級別的Tflops(每秒一萬億次浮點運算) |
移動CPU和GPU極少能達到Tfops級別的算力,多數集中在Gflops級別 |
二、移動端常見的網絡結構
MobileNet v1 、MobileNet V2、 MobileNet+SSD 、MobileNet+FSSD
GooleLeNet V1 、GoogLeNet v2 、GooleLeNet v3
YOLO
SqueezeNet
ResNet 34、ResNet 32
AlexNet
ShuffleNet v2
模型 |
模型參數級別 |
模型體積 |
GoogLeNet |
500萬 |
23.9MB |
AlexNet |
6000萬 |
220MB |
|
|
|
三、模型體積壓縮
3.1 將32位float參數轉化爲8位int參數
即簡單映射法,將原模型32位float類型強制轉換到8位int類型。核心思想是先找到模型參數的最大值和最小值,然後用最大值減去最小值得到整個模型的跨度,再平均分爲255份,就可以得到映射了。
經過轉化後,一個GoogLe模型的體積從23.9MB一下子減少到了6MB,再將該模型6MB文件使用zip緯縮之後,最終的體積僅爲4.5MB。
在運行過程中,由於模型框架使用的仍然是32位float類型,所以還要從8位int類型反向轉換到32位float類型,這會導致精度降低。在實際使用過程中,如果是對精度敏感的模型,就要慎重使用該方法。
3.2 減少參數量
1)減枝。去掉權重很小的邊;
2)量化。一些參數並不需要32位float這麼高的精度,可以將這部分參數轉化爲8位int類型。這種方法並不適合所有算子,比如sigmoid計算過程顯然是需要浮點數參與計算的。
3)二值神經網絡。模型的權重都用一個二進制數表示。
四、減少框架依賴庫
深度學習框架依賴庫通常幾十MB大小,所以通常從服務器端框架移值到移動端,需要做一些精簡化的工作。比如:
- 刪掉後向傳播過程。由於是在移動設備上運行預測過程的,因而不需要用於訓練的後向傳播過程。將代碼文件精簡,只保留預測過程,進一步減小了框架體積。
- 精簡protobuf依賴庫;
- 調整其他第三方依賴。