有什么辦法能在邊緣設(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ì)算梯度所必需的。
通常情況下這沒(méi)什么問(wèn)題,但當(dāng)模型變得更深更復(fù)雜時(shí),內(nèi)存消耗會(huì)急劇增加。對(duì)此的一個(gè)巧妙的回避解決方案是在需要時(shí)重新計(jì)算節(jié)點(diǎn)的值,而不是將它們保存到內(nèi)存中。
但是,如上所示,計(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)存消耗。 這如下圖所示:
2. 犧牲速度換內(nèi)存(重新計(jì)算)
擴(kuò)展上述思想,我們可以重新計(jì)算某些操作以節(jié)省時(shí)間。一個(gè)很好的例子是 《Memory-Efficient Implementation of DenseNets 》這篇論文。
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)鍵觀察。
首先,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í)間。
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 有著相同的工作原理。
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ò)多特征,這將非常有用。
同樣,在神經(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)換為密集形式。
相反,我們可以移除無(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)。
我們可以通過(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)化的推理引擎。
此外,TensorRT 可以優(yōu)化模型,以便更好地利用 Nvidia 的硬件。下面是一個(gè)示例,其中使用 TensorRT 優(yōu)化的模型更有效地使用 Nvidia 的 V100。
7. 知識(shí)蒸餾
我們可以教授較小的模型來(lái)模仿強(qiáng)大的較大模型的性能,而不是執(zhí)行花哨的優(yōu)化技術(shù)。 這種技術(shù)稱為知識(shí)蒸餾,它是 Google Learn2Compress 的一個(gè)組成部分。
通過(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ù)跟蹤。
發(fā)表評(píng)論
請(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ù)
驗(yàn)證碼: 刷新
最新活動(dòng)更多
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車(chē)
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
-
精彩回顧立即查看>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 1 【一周車(chē)話】沒(méi)有方向盤(pán)和踏板的車(chē),你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車(chē),還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 8 比蘋(píng)果偉大100倍!真正改寫(xiě)人類(lèi)歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類(lèi)何去何從?
- 10 Open AI融資后成萬(wàn)億獨(dú)角獸,AI人才之爭(zhēng)開(kāi)啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市