近日,Intel 開源了一個用於神經網絡壓縮的開源 Python 軟件包 Distiller,它可以減少深度神經網絡的內存占用、加快推斷速度及節省能耗。Distiller 為 PyTorch 環境提供原型和分析壓縮算法,例如產生稀疏性張量的方法和低精度運算等。
項目地址:https://github.com/NervanaSystems/distiller/
文檔地址:https://nervanasystems.github.io/distiller/index.html
深度學習正快速發展,它從輸入法到汽車已經應用到各種場景和設備當中。但它們所采用的深度神經網絡在運算時間、計算力、內存和能耗上都有非常大的需求。很多開發者考慮到硬件和軟件的限制及實際應用的環境,而在算法准確度、速度和功耗之間取得平衡。近日,Intel 人工智能實驗室開源了 Neural NetworkDistiller,它是一個為神經網絡壓縮算法研究而設計的 Python 包。Intel 認為深度網絡的壓縮可以成為促進更多的研究成果投入應用,並實現更優秀的功能。
深度網絡壓縮
面向用戶的深度學習應用需要高度重視用戶體驗,因為交互式的應用通常對程序的響應時間非常敏感。谷歌的內部研究發現即使很小的服務響應延遲,它對用戶的影響也非常顯著。而隨着越來越多的應用由深度模型提供核心功能,不論我們將模型部署在雲端還是移動端,低延遲的推斷變得越來越重要。
減少計算資源和加快推斷速度的一種方法是從一開始就設計一種緊湊型的神經網絡架構。例如 SqueezeNet 和 MobileNet 都旨在壓縮參數數量與計算量的情況下盡可能保留較高的准確度,而 Intel 人工智能實驗室也在設計這種緊湊型的模型,即提出了一種用於深層 DNN 的無監督結構學習方法,以獲得緊湊的網絡結構與高准確率。
而另一種降低計算力需求的方法直接從通用且性能優秀的深度網絡架構開始,然后通過一些算法過程將其轉換為更加短小精悍的網絡,這種方法即神經網絡壓縮。
神經網絡壓縮是降低計算力、存儲空間、能耗、內存和推斷時間等需求的過程(至少其一),它同時還需要保持其推斷准確性不下降或在可接受的范圍內。通常這些資源是相互關聯的,減少一種資源的需求同時會降低其它資源的需求。此外,即使我們使用前面幾種緊湊的小模型,我們同樣可以使用壓縮算法進一步減少計算資源的需求。
其實很多研究都表明深度神經網絡存在着非常高的參數冗余,雖然這些參數冗余在收斂到更優解時是非常必要的,但在推斷過程中可以大量減少參數與計算量。總體而言,絕大多數壓縮方法在於將巨大的預訓練模型轉化為一個精簡的小模型,且常用的方法有低秩近似、神經元級別的剪枝、卷積核級別的剪枝、參數量化及知識蒸餾等。
例如在量化這一常見的壓縮算法中,我們只需儲存 k 個聚類中心 c_j,而原權重矩陣只需要記錄各自聚類中心的索引就行。在韓松 ICLR 2016 的最佳論文中,他用如下一張圖非常形象地展示了量化的概念與過程。
如上所示權重矩陣的所有參數可以聚類為 4 個類別,不同的類別使用不同的顏色表示。上半部分的權重矩陣可以取聚類中心,並儲存在 centroids 向量中,隨后原來的權重矩陣只需要很少的空間儲存對應的索引。下半部是韓松等研究者利用反向傳播的梯度對當前 centroids 向量進行修正的過程。這種量化過程能大量降低內存的需求,因為我們不再需要儲存 FP64 或 FP32 的數據,而只需要儲存 INT8 或更少占位的數據。
Distiller 簡介
Intel 主要根據以下特征和工具構建了 Distiller:
-
集成了剪枝、正則化和量化算法的框架
-
分析和評估壓縮性能的一組工具
-
當前最優壓縮算法的示例實現
剪枝和正則化是兩種可以令深度網絡參數張量產生稀疏性的方法,其中稀疏性度量的是參數張量中有多少數值精確為 0。稀疏張量可以更緊湊地儲存在內存中,並且可以減少執行 DNN 運算所需要的計算量和能耗。量化是另一種減少 DNN 中數據精度的方法,它同樣會減少內存、能耗和計算力需求。Distiller 為量化、剪枝(結構化剪枝和細粒度剪枝)和誘導稀疏性的正則化等方法提供了越來越多的當前最優算法,並支持訓練更快、更緊湊和更節能的模型。
為了幫助研究者更專注於它們的任務,Intel 嘗試提供一些大多數研究者都需要了解的壓縮算法,並同時提供了高級和底層函數以方便使用。例如:
-
剪枝方法在深度網絡經過訓練后,動態地從卷積網絡層級移除卷積核與通道。Distiller 將在目標層配置中執行這些變化,並且同時對網絡的參數張量做剪枝。此外,Distiller 還將分析模型中的數據依賴性,並在需要時修改依賴層。
-
Distiller 可以自動對模型執行量化操作,即使用量化后的層級副本替代具體的層級類型。這將節省手動轉換每一個浮點模型為低精度形式的工作,並允許我們專注於開發量化方法,且在多種模型中擴展和測試它。
Intel 已經通過 Jupyter Notebook 介紹並展示如何從網絡模型和壓縮過程中訪問統計信息。例如,如果我們希望移除一些卷積核,那么可以運行用於濾波器剪枝敏感性分析的模塊,並得到類似以下的結果:
Jupyter Notebook 地址:https://nervanasystems.github.io/distiller/jupyter/index.html
Distiller 的統計數據可導出為 Pandas DataFrames,它可用於數據選擇(索引和截取等)和可視化。
Distiller 還展示了一些示例應用,並使用量化和剪枝等方法壓縮圖像分類網絡和語言模型。Distiller 還實現了一些神經網絡壓縮的前沿研究論文,它們也可以作為我們嘗試新方法的模板。此外,我們也可以在官方 PyTorch 深度預訓練模型上使用這些壓縮算法,以降低計算資源的需求。
Distiller 壓縮示例:https://nervanasystems.github.io/distiller/model_zoo/index.html
這只是個開始
Distiller 是一個用於壓縮算法研究的庫,它致力於幫助科學家和工程師訓練並部署 DL 的解決方案、幫助發布研究論文以及促進算法更新與創新。Intel 目前也在添加更多的算法、特征和應用領域,如果讀者對於研究並實現 DNN 壓縮算法很感興趣,也可以幫助改進並提升 Distiller 庫。最后,Distiller 非常歡迎新的想法與深度網絡壓縮算法,同時也希望開發者能多發現該庫的 Bug。
以下是在運行github的
python3 compress_classifier.py --arch simplenet_cif
ar ../../../data.cifar10 -p 30 -j=1 --lr=0.01
出現的錯誤:
1.ModuleNotFoundError: No module named 'distiller'
這是因為我是通過pip install -r requirements.txt來安裝各種依賴的,沒有運行pip install -e . 導致distiller模塊沒有導入進去。
2.AttributeError: module ‘tensorboard' has no attribute 'lazy'(谷歌出來的結果是Make sure that you don't have tb-nightly installed in your env.)
我采用pip uninstall tb-nightly指令發現並沒有安裝,於是卸載了虛擬環境中的tensorboard,這樣也解決了錯誤。