在邊緣裝置上擬合大型神經網路的方法總結

CV技術指南(公眾號) 發表於 2021-06-03
神經網路

前言:

對於任何想要建立可擴充套件服務的人來說,部署大記憶體的深度學習演算法是一項挑戰。 從長遠來看,雲服務是昂貴的。 在邊緣裝置上離線部署模型更便宜,並且還有其他好處。 唯一的缺點是它們缺乏記憶體和計算能力。

本文探討了一些可用於在記憶體受限設定中擬合神經網路的技術。 不同的技術用於“訓練”和“推理”階段,因此分別討論。

 

Training

某些應用程式需要線上學習。也就是說,模型會根據反饋或附加資料進行改進。在邊緣部署此類應用程式會對模型造成有形的資源限制。這裡有 4 種方法可以減少此類模型的記憶體消耗。

 

1. Gradient Checkpointing

TensorFlow 等框架會消耗大量記憶體進行訓練。在前向傳播期間,圖中每個節點的值都會被評估並儲存在記憶體中。這是在反向傳播期間計算梯度所必需的。

 

圖片在邊緣裝置上擬合大型神經網路的方法總結

 

通常情況下這沒什麼問題,但當模型變得更深更復雜時,記憶體消耗會急劇增加。對此的一個巧妙的迴避解決方案是在需要時重新計算節點的值,而不是將它們儲存到記憶體中

 

圖片在邊緣裝置上擬合大型神經網路的方法總結

 

但是,如上所示,計算成本顯著增加。 一個好的權衡是隻在記憶體中儲存一些節點,而在需要時重新計算其他節點。 這些儲存的節點稱為檢查點。 這大大減少了深度神經網路記憶體消耗。 這如下圖所示:

 

圖片在邊緣裝置上擬合大型神經網路的方法總結

 

 

2. 犧牲速度換記憶體(重新計算)

擴充套件上述思想,我們可以重新計算某些操作以節省時間。一個很好的例子是 《Memory-Efficient Implementation of DenseNets 》這篇論文。

圖片在邊緣裝置上擬合大型神經網路的方法總結

DenseNets 引數效率很高,但記憶體效率也很低,這種現象是由concatenation和batchnorm兩項操作的性質引起的。

為了使 GPU 上的卷積高效,這些值必須連續放置。因此,在concatenation之後,cudNN 在 GPU 上連續排列這些值。這涉及到大量的冗餘記憶體分配。同樣,batchnorm 涉及過多的記憶體分配,如本文所述。這兩種操作都會導致記憶體的二次方增長。DenseNets 有大量的concatenation和batchnorm,因此它們的記憶體效率很低。

 

上述問題的巧妙解決方案涉及兩個關鍵觀察。

 

圖片在邊緣裝置上擬合大型神經網路的方法總結

首先,concatenation和batchnorm不是時間密集型的。因此,我們可以在需要時重新計算值,而不是儲存所有冗餘記憶體。其次,我們可以使用“共享記憶體空間”來轉儲輸出,而不是為輸出分配“新”記憶體空間。

我們可以覆蓋這個共享空間來儲存其他連線操作的輸出。我們可以在需要時重新計算用於梯度計算的串聯操作。 類似地,我們可以將其擴充套件為 batchnorm 操作。這個簡單的技巧節省了大量 GPU 記憶體,以換取略微增加的計算時間。

 

圖片在邊緣裝置上擬合大型神經網路的方法總結

 

3. 降低精度

在一篇優秀的部落格中,Pete Warden 解釋瞭如何使用 8 位浮點值訓練神經網路。由於精度降低會產生許多問題,其中一些問題列在下面:

  • 如《Training deep neural networks with low precision multiplications》論文中所述,“啟用值、梯度和引數”具有完全不同的範圍。 定點表示並不理想。論文聲稱“動態定點”表示非常適合低精度神經網路。

  • 正如 Pete Warden 的另一篇部落格中所述,較低的精度意味著與精確值的偏差較大。通常,如果錯誤是完全隨機的,它們很有可能相互抵消。然而,零被廣泛用於padding、dropout和ReLU。在較低精度的浮點格式中精確表示零可能是不可能的,因此可能會在效能中引入整體偏差。

 

4. 神經網路架構工程

架構工程(Architecture engineering)涉及設計最優化準確度、記憶體和速度的神經網路結構。

有以下幾種方法可以在空間和時間上優化卷積。

  • 將 NxN 卷積分解為 Nx1 和 1xN 卷積的組合。這節省了大量空間,同時也提高了計算速度。在Inceptionv2-v4網路中都使用了這個和其他幾個優化技巧。

  • 在 MobileNet 和 Xception Net 中使用 Depthwise Separable 卷積。

  • 使用 1x1 卷積作為瓶頸來減少傳入通道的數量。該技術用於很多經典的神經網路。

一個有意思的解決方案是讓機器為特定問題選擇最佳架構。神經架構搜尋使用機器學習來為給定的分類問題找到最佳的神經網路架構。在 ImageNet 上使用時,由此形成的網路 (NASNet) 是迄今為止建立的效能最佳的模型之一。Google 的 AutoML 有著相同的工作原理。

圖片在邊緣裝置上擬合大型神經網路的方法總結

 

 

Inference

邊緣推斷的擬合模型相對容易。 本節介紹可用於針對此類邊緣裝置優化神經網路的技術。

 

1. 去掉 “Bloatware”

TensorFlow 等機器學習框架會消耗大量記憶體空間來建立圖。這個額外的空間對於加速訓練過程很有用,但它不用於推理。因此,可以剪掉專門用於訓練的圖部分。我們將這部分稱為graph bloatware。

對於 TensorFlow,建議將模型檢查點轉換為凍結推理圖。此過程會自動刪除佔用大量記憶體的bloatware。 當轉換為凍結推理圖時,來自模型檢查點的引發資源耗盡錯誤的圖有時可以滿足記憶體。

 

 

2. 特徵剪枝

Scikit-Learn 上的一些機器學習模型(如隨機森林和 XGBoost)輸出名為 feature_importances_ 的屬性。該屬性表示每個特徵對於分類或迴歸任務的重要性。我們可以簡單地修剪最不重要的特徵。如果模型具有無法通過任何其他方法減少的過多特徵,這將非常有用。

圖片在邊緣裝置上擬合大型神經網路的方法總結

同樣,在神經網路中,很多權重值都接近於零。 我們可以簡單地修剪這些連線。 但是,刪除層之間的單個連線會建立稀疏矩陣。 目前正在努力建立可以無縫處理稀疏操作的高效推理引擎(硬體)。 然而,大多數機器學習框架在將稀疏矩陣傳輸到 GPU 之前就已經將它們轉換為密集形式。

圖片在邊緣裝置上擬合大型神經網路的方法總結

相反,我們可以移除無關緊要的神經元並稍微重新訓練模型。 對於 CNN,我們也可以刪除整個卷積核。 研究和實驗表明,通過使用這種方法,我們可以保留大部分精度,同時大幅減小尺寸。

 

3. 權重共享

一個 4x4 權重矩陣。它有 16 個 32 位浮點值。我們需要 512 位 (16 * 32) 來表示矩陣。

將權重值量化為 4 個級別,但保留它們的 32 位性質。現在,4x4 權重矩陣只有 4 個唯一值。這 4 個唯一值儲存在單獨的(共享)記憶體空間中。我們可以為 4 個唯一值中的每一個指定一個 2 位地址(可能的地址值為 0、1、2 和 3)。

圖片在邊緣裝置上擬合大型神經網路的方法總結

 我們可以通過使用 2 位地址來引用權重值。因此,我們獲得了一個具有 2 位地址的新 4x4 矩陣,矩陣中的每個位置都指向共享記憶體空間中的一個位置。此方法需要 160 位(16 * 2 + 4 * 32)用於整個表示。縮減因子為3.2 。

不用說,這種尺寸的減小伴隨著時間複雜度的增加。 但是,訪問共享記憶體的時間不會是嚴重的時間損失。

 

 

4. 量化

回想一下,本文的訓練部分介紹了降低精度。 對於推理,精度的降低並不像訓練那樣麻煩。 權重可以只轉換為較低精度的格式,然後進行推理。 但是,精度的急劇下降可能需要對weights進行輕微的重新調整。

 

5. Encoding

修剪和量化的權重可以通過使用編碼進一步進行大小優化。 霍夫曼編碼可以用較少的位數表示最常見的權重值。 因此,在位級別上,霍夫曼編碼的字串比普通字串佔用的空間更小。

深度壓縮探索使用無失真壓縮技術(如霍夫曼)進行編碼。 然而,研究也探索了有失真壓縮技術的使用。 這兩種方法的缺點是翻譯的開銷。

 

6. 推理優化器

到目前為止,我們已經討論了一些很不錯的想法,但是從頭開始實施它們需要相當長的時間。 這就是推理優化器發揮作用的地方。例如,英偉達的 TensorRT 融合了所有這些想法(以及更多),並在訓練好的神經網路的情況下提供了一個優化的推理引擎。

圖片在邊緣裝置上擬合大型神經網路的方法總結

 

此外,TensorRT 可以優化模型,以便更好地利用 Nvidia 的硬體。下面是一個示例,其中使用 TensorRT 優化的模型更有效地使用 Nvidia 的 V100。

圖片在邊緣裝置上擬合大型神經網路的方法總結

 

7. 知識蒸餾

我們可以教授較小的模型來模仿強大的較大模型的效能,而不是執行花哨的優化技術。 這種技術稱為知識蒸餾,它是 Google Learn2Compress 的一個組成部分。

圖片在邊緣裝置上擬合大型神經網路的方法總結

通過使用這種方法,我們可以強制適合邊緣裝置的較小模型達到較大模型的效能水平,而準確度的下降很小。

具體可以參考公眾號的另一篇文章《知識蒸餾簡要概述》。

原文連結:

https://heartbeat.fritz.ai/how-to-fit-large-neural-networks-on-the-edge-eb621cdbb33

 

其他文章

注意力機制總結

特徵金字塔總結

資料增強方法總結

CNN視覺化技術總結

CNN結構演變總結—經典模型

CNN結構演變總結—輕量化模型

CNN結構演變總結—設計原則

池化技術總結

非極大值抑制總結

英文文獻閱讀方法總結

論文創新的常見思路總結

本文來源於公眾號CV技術指南的技術總結系列。

在公眾號《CV技術指南》中回覆“技術總結”可獲取以上所有總結系列文章的彙總pdf

QR.png在邊緣裝置上擬合大型神經網路的方法總結