深度学习模型如何缩小到可以放到微处理器呢?
深度學習模型如何縮小到可以放到微處理器呢?作為煉丹師,模型變的越來越復雜,模型大小也不斷增加.在工業場景下光訓練數據就有幾百T,訓練就要多機多卡并行跑數天.到底如何把這些模型部署在小型嵌入式設備的呢?
要理解我們如何縮小模型,就要先理解模型文件如何被壓縮.如下圖所示,一個常見的DNN模型由神經元和它們之間的連接構成,模型的大小主要就是由這些weights構成.一個簡單的CNN都有上百萬的參數,我們知道訓練的時候,它們的dtype都是float32,一個float32占4個字節,上百萬的參數往往就占據幾十兆的空間大小.幾十兆的模型?我們可能覺得這已經很小了,但是一個微型處理器就只有256Kb的隨機存儲器.
為了把模型縮小到可以塞到這么小的處理器中,有以下幾個框架:
- AIMET from Qualcomm
- TensorFlow Lite from Google
- CoreML from Apple
- PyTorch Mobile from Facebook
tensorflow提供一個python庫tensorflow_model_optimization,這個庫優化模型的延遲,大小.直觀上,優化模型大小,一個就是優化參數的數量,另一個就是優化每個參數的大小.主要的方式就是以下幾種.
Compression or Distillation
模型訓練完成后,如何在準確率可接受的情況下壓縮模型,最常見的方式就是剪枝和蒸餾.
剪枝-刪除對輸出影響較低或者可能會引起過擬合的weights,再剪枝后稀疏的神經網絡需要重新被訓練.蒸餾煉丹師都比較熟悉了,用小模型去學習打模型即可.
Quantisation
該方法用低精度的參數去學習一個同樣效果的模型,這種方式提升了模型的處理能力和效率.這種方法主要是把float壓縮到int8上,如下圖所示:
Quantisation Aware Training(QAT) 這個方式是在模型訓練過程中使用量化,如下圖所示,該方法會帶來噪聲也會影響loss,所以學到的模型更加魯棒.
Post-Training Quantisation (PTQ) 該方法不用重訓練模型,直接把float32量化到int8,這樣直接把模型大小降低了4倍,預估性能也提升了兩倍,精度也沒有顯著下降.
weight clustering 使用權重聚類/共享,降低了存儲參數的數量,該方法把一層的參數聚成N個類,并共享索引,舉例來說,如果我們把一層聚成8個類,每個參數都會只占3bit(2^3 = 8).從實驗我們可以看到,使用該方法可以降低模型大小6倍,僅僅降低了0.6%的準確率.我們還可以通過fine-tune聚類的中心點,來提升模型精度.
Encoding
通過使用霍夫曼編碼對模型進行壓縮,使用01編碼weights,把最常出現的權重用較少的bit去編碼,如下圖所示,我們有已經被量化的權重矩陣:
每個權重占5bit(0~31),如果使用霍夫曼編碼,我們就會得到下面這顆樹:
17會被編碼成11,22編碼為001,可以看到權重通過編碼顯著被壓縮.
Compilation
剩下的就是工程上的優化了,如使用C++,相較于python更快更省內存.
參考文獻
1.https://github.com/quic/aimet
2.https://www.tensorflow.org/lite
3.https://developer.apple.com/documentation/coreml
4.https://pytorch.org/mobile/home/
5.https://medium.com/marionete/tinyml-models-whats-happening-behind-the-scenes-5e61d1555be9
"微"模型總結
以上是生活随笔為你收集整理的深度学习模型如何缩小到可以放到微处理器呢?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Transformer又又又升级了?
- 下一篇: 极市分享|第32期 张德兵小美:分布式人