天天看點

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

前言:

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

本文探讨了一些可用于在記憶體受限設定中拟合神經網絡的技術。 不同的技術用于“訓練”和“推理”階段,是以分别讨論。

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

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