訂閱
糾錯(cuò)
加入自媒體

有什么辦法能在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)?

前言:

對(duì)于任何想要?jiǎng)?chuàng)建可擴(kuò)展服務(wù)的人來(lái)說(shuō),部署大內(nèi)存的深度學(xué)習(xí)算法是一項(xiàng)挑戰(zhàn)。 從長(zhǎng)遠(yuǎn)來(lái)看,云服務(wù)是昂貴的。 在邊緣設(shè)備上離線部署模型更便宜,并且還有其他好處。 唯一的缺點(diǎn)是它們?nèi)狈?nèi)存和計(jì)算能力。

本文探討了一些可用于在內(nèi)存受限設(shè)置中擬合神經(jīng)網(wǎng)絡(luò)的技術(shù)。 不同的技術(shù)用于“訓(xùn)練”和“推理”階段,因此分別討論。

更多內(nèi)容請(qǐng)關(guān)注公眾號(hào)CV技術(shù)指南,專注于計(jì)算機(jī)視覺(jué)的技術(shù)總結(jié),最新技術(shù)跟蹤。

Training

某些應(yīng)用程序需要在線學(xué)習(xí)。也就是說(shuō),模型會(huì)根據(jù)反饋或附加數(shù)據(jù)進(jìn)行改進(jìn)。在邊緣部署此類(lèi)應(yīng)用程序會(huì)對(duì)模型造成有形的資源限制。這里有 4 種方法可以減少此類(lèi)模型的內(nèi)存消耗。

1. Gradient Checkpointing

TensorFlow 等框架會(huì)消耗大量?jī)?nèi)存進(jìn)行訓(xùn)練。在前向傳播期間,圖中每個(gè)節(jié)點(diǎn)的值都會(huì)被評(píng)估并保存在內(nèi)存中。這是在反向傳播期間計(jì)算梯度所必需的。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

通常情況下這沒(méi)什么問(wèn)題,但當(dāng)模型變得更深更復(fù)雜時(shí),內(nèi)存消耗會(huì)急劇增加。對(duì)此的一個(gè)巧妙的回避解決方案是在需要時(shí)重新計(jì)算節(jié)點(diǎn)的值,而不是將它們保存到內(nèi)存中。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

但是,如上所示,計(jì)算成本顯著增加。 一個(gè)好的權(quán)衡是只在內(nèi)存中保存一些節(jié)點(diǎn),而在需要時(shí)重新計(jì)算其他節(jié)點(diǎn)。 這些保存的節(jié)點(diǎn)稱為檢查點(diǎn)。 這大大減少了深度神經(jīng)網(wǎng)絡(luò)內(nèi)存消耗。 這如下圖所示:

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

2. 犧牲速度換內(nèi)存(重新計(jì)算)

擴(kuò)展上述思想,我們可以重新計(jì)算某些操作以節(jié)省時(shí)間。一個(gè)很好的例子是 《Memory-Efficient Implementation of DenseNets 》這篇論文。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

DenseNets 參數(shù)效率很高,但內(nèi)存效率也很低,這種現(xiàn)象是由concatenation和batchnorm兩項(xiàng)操作的性質(zhì)引起的。

為了使 GPU 上的卷積高效,這些值必須連續(xù)放置。因此,在concatenation之后,cudNN 在 GPU 上連續(xù)排列這些值。這涉及到大量的冗余內(nèi)存分配。同樣,batchnorm 涉及過(guò)多的內(nèi)存分配,如本文所述。這兩種操作都會(huì)導(dǎo)致內(nèi)存的二次方增長(zhǎng)。DenseNets 有大量的concatenation和batchnorm,因此它們的內(nèi)存效率很低。

上述問(wèn)題的巧妙解決方案涉及兩個(gè)關(guān)鍵觀察。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

首先,concatenation和batchnorm不是時(shí)間密集型的。因此,我們可以在需要時(shí)重新計(jì)算值,而不是存儲(chǔ)所有冗余內(nèi)存。其次,我們可以使用“共享內(nèi)存空間”來(lái)轉(zhuǎn)儲(chǔ)輸出,而不是為輸出分配“新”內(nèi)存空間。

我們可以覆蓋這個(gè)共享空間來(lái)存儲(chǔ)其他連接操作的輸出。我們可以在需要時(shí)重新計(jì)算用于梯度計(jì)算的串聯(lián)操作。 類(lèi)似地,我們可以將其擴(kuò)展為 batchnorm 操作。這個(gè)簡(jiǎn)單的技巧節(jié)省了大量 GPU 內(nèi)存,以換取略微增加的計(jì)算時(shí)間。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

3. 降低精度

在一篇優(yōu)秀的博客中,Pete Warden 解釋了如何使用 8 位浮點(diǎn)值訓(xùn)練神經(jīng)網(wǎng)絡(luò)。由于精度降低會(huì)產(chǎn)生許多問(wèn)題,其中一些問(wèn)題列在下面:

如《Training deep neural networks with low precision multiplications》論文中所述,“激活值、梯度和參數(shù)”具有完全不同的范圍。 定點(diǎn)表示并不理想。論文聲稱“動(dòng)態(tài)定點(diǎn)”表示非常適合低精度神經(jīng)網(wǎng)絡(luò)。

正如 Pete Warden 的另一篇博客中所述,較低的精度意味著與精確值的偏差較大。通常,如果錯(cuò)誤是完全隨機(jī)的,它們很有可能相互抵消。然而,零被廣泛用于padding、dropout和ReLU。在較低精度的浮點(diǎn)格式中精確表示零可能是不可能的,因此可能會(huì)在性能中引入整體偏差。

4. 神經(jīng)網(wǎng)絡(luò)架構(gòu)工程

架構(gòu)工程(Architecture engineering)涉及設(shè)計(jì)最優(yōu)化準(zhǔn)確度、內(nèi)存和速度的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。

有以下幾種方法可以在空間和時(shí)間上優(yōu)化卷積。

將 NxN 卷積分解為 Nx1 和 1xN 卷積的組合。這節(jié)省了大量空間,同時(shí)也提高了計(jì)算速度。在Inceptionv2-v4網(wǎng)絡(luò)中都使用了這個(gè)和其他幾個(gè)優(yōu)化技巧。

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

使用 1x1 卷積作為瓶頸來(lái)減少傳入通道的數(shù)量。該技術(shù)用于很多經(jīng)典的神經(jīng)網(wǎng)絡(luò)。

一個(gè)有意思的解決方案是讓機(jī)器為特定問(wèn)題選擇最佳架構(gòu)。神經(jīng)架構(gòu)搜索使用機(jī)器學(xué)習(xí)來(lái)為給定的分類(lèi)問(wèn)題找到最佳的神經(jīng)網(wǎng)絡(luò)架構(gòu)。在 ImageNet 上使用時(shí),由此形成的網(wǎng)絡(luò) (NASNet) 是迄今為止創(chuàng)建的性能最佳的模型之一。Google 的 AutoML 有著相同的工作原理。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

Inference

邊緣推斷的擬合模型相對(duì)容易。 本節(jié)介紹可用于針對(duì)此類(lèi)邊緣設(shè)備優(yōu)化神經(jīng)網(wǎng)絡(luò)的技術(shù)。

1. 去掉 “Bloatware”

TensorFlow 等機(jī)器學(xué)習(xí)框架會(huì)消耗大量?jī)?nèi)存空間來(lái)創(chuàng)建圖。這個(gè)額外的空間對(duì)于加速訓(xùn)練過(guò)程很有用,但它不用于推理。因此,可以剪掉專門(mén)用于訓(xùn)練的圖部分。我們將這部分稱為graph bloatware。

對(duì)于 TensorFlow,建議將模型檢查點(diǎn)轉(zhuǎn)換為凍結(jié)推理圖。此過(guò)程會(huì)自動(dòng)刪除占用大量?jī)?nèi)存的bloatware。 當(dāng)轉(zhuǎn)換為凍結(jié)推理圖時(shí),來(lái)自模型檢查點(diǎn)的引發(fā)資源耗盡錯(cuò)誤的圖有時(shí)可以滿足內(nèi)存。

2. 特征剪枝

Scikit-Learn 上的一些機(jī)器學(xué)習(xí)模型(如隨機(jī)森林和 XGBoost)輸出名為 feature_importances_ 的屬性。該屬性表示每個(gè)特征對(duì)于分類(lèi)或回歸任務(wù)的重要性。我們可以簡(jiǎn)單地修剪最不重要的特征。如果模型具有無(wú)法通過(guò)任何其他方法減少的過(guò)多特征,這將非常有用。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

同樣,在神經(jīng)網(wǎng)絡(luò)中,很多權(quán)重值都接近于零。 我們可以簡(jiǎn)單地修剪這些連接。 但是,刪除層之間的單個(gè)連接會(huì)創(chuàng)建稀疏矩陣。 目前正在努力創(chuàng)建可以無(wú)縫處理稀疏操作的高效推理引擎(硬件)。 然而,大多數(shù)機(jī)器學(xué)習(xí)框架在將稀疏矩陣傳輸?shù)?GPU 之前就已經(jīng)將它們轉(zhuǎn)換為密集形式。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

相反,我們可以移除無(wú)關(guān)緊要的神經(jīng)元并稍微重新訓(xùn)練模型。 對(duì)于 CNN,我們也可以刪除整個(gè)卷積核。 研究和實(shí)驗(yàn)表明,通過(guò)使用這種方法,我們可以保留大部分精度,同時(shí)大幅減小尺寸。

3. 權(quán)重共享

一個(gè) 4x4 權(quán)重矩陣。它有 16 個(gè) 32 位浮點(diǎn)值。我們需要 512 位 (16 * 32) 來(lái)表示矩陣。

將權(quán)重值量化為 4 個(gè)級(jí)別,但保留它們的 32 位性質(zhì),F(xiàn)在,4x4 權(quán)重矩陣只有 4 個(gè)唯一值。這 4 個(gè)唯一值存儲(chǔ)在單獨(dú)的(共享)內(nèi)存空間中。我們可以為 4 個(gè)唯一值中的每一個(gè)指定一個(gè) 2 位地址(可能的地址值為 0、1、2 和 3)。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

我們可以通過(guò)使用 2 位地址來(lái)引用權(quán)重值。因此,我們獲得了一個(gè)具有 2 位地址的新 4x4 矩陣,矩陣中的每個(gè)位置都指向共享內(nèi)存空間中的一個(gè)位置。此方法需要 160 位(16 * 2 + 4 * 32)用于整個(gè)表示?s減因子為3.2 。

不用說(shuō),這種尺寸的減小伴隨著時(shí)間復(fù)雜度的增加。 但是,訪問(wèn)共享內(nèi)存的時(shí)間不會(huì)是嚴(yán)重的時(shí)間損失。

4. 量化

回想一下,本文的訓(xùn)練部分介紹了降低精度。 對(duì)于推理,精度的降低并不像訓(xùn)練那樣麻煩。 權(quán)重可以只轉(zhuǎn)換為較低精度的格式,然后進(jìn)行推理。 但是,精度的急劇下降可能需要對(duì)weights進(jìn)行輕微的重新調(diào)整。

5. Encoding

修剪和量化的權(quán)重可以通過(guò)使用編碼進(jìn)一步進(jìn)行大小優(yōu)化。 霍夫曼編碼可以用較少的位數(shù)表示最常見(jiàn)的權(quán)重值。 因此,在位級(jí)別上,霍夫曼編碼的字符串比普通字符串占用的空間更小。

深度壓縮探索使用無(wú)損壓縮技術(shù)(如霍夫曼)進(jìn)行編碼。 然而,研究也探索了有損壓縮技術(shù)的使用。 這兩種方法的缺點(diǎn)是翻譯的開(kāi)銷(xiāo)。

6. 推理優(yōu)化器

到目前為止,我們已經(jīng)討論了一些很不錯(cuò)的想法,但是從頭開(kāi)始實(shí)施它們需要相當(dāng)長(zhǎng)的時(shí)間。 這就是推理優(yōu)化器發(fā)揮作用的地方。例如,英偉達(dá)的 TensorRT 融合了所有這些想法(以及更多),并在訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)的情況下提供了一個(gè)優(yōu)化的推理引擎。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

此外,TensorRT 可以優(yōu)化模型,以便更好地利用 Nvidia 的硬件。下面是一個(gè)示例,其中使用 TensorRT 優(yōu)化的模型更有效地使用 Nvidia 的 V100。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

7. 知識(shí)蒸餾

我們可以教授較小的模型來(lái)模仿強(qiáng)大的較大模型的性能,而不是執(zhí)行花哨的優(yōu)化技術(shù)。 這種技術(shù)稱為知識(shí)蒸餾,它是 Google Learn2Compress 的一個(gè)組成部分。

在邊緣設(shè)備上擬合大型神經(jīng)網(wǎng)絡(luò)的方法總結(jié)

通過(guò)使用這種方法,我們可以強(qiáng)制適合邊緣設(shè)備的較小模型達(dá)到較大模型的性能水平,而準(zhǔn)確度的下降很小。

具體可以參考公眾號(hào)的另一篇文章《知識(shí)蒸餾簡(jiǎn)要概述》。

本文來(lái)源于公眾號(hào)CV技術(shù)指南的技術(shù)總結(jié)系列。

更多內(nèi)容請(qǐng)關(guān)注公眾號(hào)CV技術(shù)指南,專注于計(jì)算機(jī)視覺(jué)的技術(shù)總結(jié),最新技術(shù)跟蹤。

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)