深度學習模型太大怎麼辦?

侖枘D6mu3414



首先模型太大的影響可以分為:訓練階段(training)和預測階段(inference)。不同的階段解決的方式不太一樣。以下就從這兩個方面來回答這個問題。

訓練階段

  • 選擇這麼大的模型是否合理?是否有等價方案?

例如在語音合成方面WaveNet可以是幾十層的CNN結構,而WaveRNN僅僅有一層GRU單元,但最終在合成性能上卻取得了相近的結果,這就是說如果你一開始經過了充分的調研分析,並且找到一種更優的結構就能從根本上避免模型過大問題的產生。

簡單感受下下面兩張圖,也許你就會認識到充分調研,仔細選取模型的重要性。

  • 使用GPU進行訓練

GPU的多核架構決定了它的計算吞吐量遠超過傳統CPU。在經濟條件允許的條件下選用算力強大的GPU,顯然能夠在模型大小不變的情況下提供更強的算力支持。

  • 使用集群和雲資源進行訓練

目前tensorflow、mxnet、paddle都支持雲上訓練和集群訓練,只需要簡單配置就能實現多機多卡訓練,顯然使用多臺服務器能夠更快的將數據處理完,極大的加速訓練過程。

  • 使用集合通信機制和更先進的網絡互連技術

採用Nvidia ncll 或其他框架提供的All-reduce等集合算子可以極大的加快反向傳播的梯度計算和損失回傳,多機能夠快速的實現數據同步。同時使用RDMA傳輸技術也顯然要比採用傳統TCP有更高效的數據交互能力,通過減少數據傳輸損耗降低計算延遲來加快深度學習的訓練。

  • 其他優化

這裡涉及到具體的代碼書寫,降低內存缺頁,數據讀寫等待等計算機常用優化方法來加快代碼的運行速度,從而提高訓練速度。

預測階段

預測階段也有很多種方法來做到減小模型大小和運算速度的方法。

  • 模型量化

通過更少的比特位(bit)來表示模型權重,顯然能夠成比例的將模型變小。目前8bit量化已經使用的比較多了,2bit量化或者0-1量化也被一些模型所採用。

  • 模型裁剪

通過將接近於0的權重值進行裁剪可以有效的減小網絡規模和計算量。

  • 模型蒸餾

distilling model又叫teacher student model,損失函數通過hard target和soft target ce loss共同作用,從而訓練出一個比原始teacher 模型小的多的student model,從而可以部署的資源更小的端上。

  • 使用tensorrt等更加快速的推理框架

這些框架都經過高度優化,顯然具備更高的運算性能,數據吞吐量成倍增加。大模型的推理速度顯然能夠顯著提高。

  • 計算圖優化

任何神經網絡最終都可以表示成圖的形式,圖優化的各種算法都能應用於神經網絡的優化,通過構建更小的計算圖,減少分支等來加速大模型的運算。

  • 並行及指令優化

通過多進程,多線程,使用向量指令等技術充分利用單指令多數據,或者多指令多數據優勢加快計算優勢。

  • 編譯優化(讀寫,訪存等)

代碼經過特別編譯之後能夠更有效的利用寄存器、計算單元等存儲和計算資源,也能夠更合理的分配讀寫時間片提高讀寫效率,從而整體提高大模型的運算速度。

還有很多優化方法,將不斷補充進來,希望能夠持續和各位一起探討大模型的訓練和部署技術。


深度視野


模型太大可以使用壓縮、減枝、量化等進行瘦身。

比如TensorFlow的模型可以使用converter工具轉為TensorFlow Lite進行瘦身。


分享到:


相關文章: