2
以下是我最近在倫敦 O’Reilly AI Conference 和 DroidCon 上的兩次談話的改編。
今年早些時候,NVIDIA 的研究人員發(fā)布了 MegatronLM。這是一個擁有 83 億個參數(shù)(比 BERT 大 24 倍)的大型 transformer 模型,它在各種語言任務(wù)上都達(dá)到了最先進的性能。雖然這無疑是一項令人印象深刻的技術(shù)成就,但我不禁要問自己:深度學(xué)習(xí)是否朝著正確的方向發(fā)展?
單是這些參數(shù)在磁盤上的權(quán)重就超過了 33GB,訓(xùn)練最終的模型需要 512v100 GPU 連續(xù)運行 9.2 天??紤]到每張卡的能量需求,訓(xùn)練這一模型所用的能量量是美國平均年能源消耗量的 3 倍多。
我不想單獨列出這個項目。有許多例子表明,大量的模型正在被訓(xùn)練,以便在各種基準(zhǔn)上獲得更高的精度。盡管 MegatronLM 比 BERT 大 24 倍,但它在語言建模方面只比 BERT 強 34%。作為演示新硬件性能的一次性實驗,這里沒有太大的危害。但從長遠(yuǎn)來看,這一趨勢將導(dǎo)致一些問題。
首先,它阻礙了民主化。如果我們相信,在這個世界上,數(shù)以百萬計的工程師將使用深度學(xué)習(xí)來改進每一個應(yīng)用程序和設(shè)備,那么我們就不會擁有需要大量時間和金錢來訓(xùn)練的大型模型。
其次,它限制了規(guī)模。世界上每一個公共和私有云中可能只有不到 1 億個處理器,但現(xiàn)在已經(jīng)有 30 億部手機、120 億部物聯(lián)網(wǎng)設(shè)備和 1500 億個微控制器。從長遠(yuǎn)來看,正是這些小型、低功耗的設(shè)備最需要深度學(xué)習(xí),大規(guī)模的模型根本不會是一個選擇。
為了確保深度學(xué)習(xí)實現(xiàn)其承諾,我們需要重新對研究進行定位,不要追求最高的準(zhǔn)確性和最先進的效率。我們需要關(guān)心的是,模型是否能夠讓最大數(shù)量的人使用,是否能夠在大多數(shù)設(shè)備上用最少的資源盡可能快地迭代。
好消息是,我們正在努力使深度學(xué)習(xí)模型更小、更快、更高效。早期的回報令人難以置信,例如,Han 等人 2015 年的一篇論文得出了這樣一個結(jié)果。
「在 ImageNet 數(shù)據(jù)集上,我們的方法將 AlexNet 所需的存儲空間減少了 35 倍——從 240MB 減少到 6.9MB,而且不失準(zhǔn)確性。我們的方法將 VGG-16 的大小從 552MB 減少到 11.3MB,減少了 49 倍,同樣沒有精度損失?!?/p>
為了達(dá)到這樣的效果,我們必須考慮從模型選擇、訓(xùn)練到部署的整個機器學(xué)習(xí)生命周期。在本文的其余部分,我們將深入到這些階段,并研究如何創(chuàng)建更小、更快、更高效的模型。
模型選擇
以更小、更高效的模式結(jié)束的最好方法是開始一個模型的建立。上圖描繪了各種模型架構(gòu)的大致大?。ㄕ鬃止?jié))。我已經(jīng)覆蓋了表示移動應(yīng)用程序的典型大?。òùa)以及嵌入式設(shè)備中可用的 SRAM 數(shù)量。
Y 軸上的對數(shù)刻度軟化了視覺打擊,但不幸的事實是,大多數(shù)模型架構(gòu)對于除了數(shù)據(jù)中心的任何地方來說,數(shù)量級都太大了。
令人難以置信的是,右邊較小的架構(gòu)的性能并沒有比左邊的大架構(gòu)差多少。像 VGG-16 這樣的架構(gòu)(300-500MB)的性能和 MobileNet(20MB)的差不多,盡管它的體積小了近 25 倍。
是什么讓 MobileNet 和 SquezeNet 這樣的小型架構(gòu)如此高效?基于 Iandola 等人(SquezeNet)、Howard 等人(MobileNet3)和 Chen 等人(DeepLab V3)的實驗,一些答案存在于模型的宏觀和微觀結(jié)構(gòu)中。
宏體系結(jié)構(gòu)指的是模型使用的層的類型,以及如何將它們排列成模塊和塊。要生成高效的宏架構(gòu),請執(zhí)行以下操作:
通過降采樣或使用空洞卷積保持激活圖的大小
使用更多的通道,更少的層
在計算過程中使用跳接和剩余連接來提高精度,重復(fù)使用參數(shù)
用可分離的標(biāo)準(zhǔn)卷積替換
模型的微觀結(jié)構(gòu)與各個層相關(guān)。最佳做法包括:
使輸入和輸出塊盡可能高效,因為它們通常占模型計算成本的 15-25%
減小卷積核的大小
添加一個寬度倍增器,用超參數(shù) alpha 控制每次卷積的通道數(shù)
排列圖層,以便可以融合參數(shù)(例如偏差和批量標(biāo)準(zhǔn)化)
模型訓(xùn)練
在選擇了模型架構(gòu)之后,要縮小它并使其在訓(xùn)練期間更有效,仍然有很多工作可以做。如果還不明顯的話,大多數(shù)神經(jīng)網(wǎng)絡(luò)都是參數(shù)化的,許多經(jīng)過訓(xùn)練的權(quán)重對整體精度影響很小,可以去除。Frankle 等人發(fā)現(xiàn),在許多網(wǎng)絡(luò)中,80-90% 的網(wǎng)絡(luò)權(quán)值可以被移除,同時這些權(quán)值中的大多數(shù)精度也可以被移除,而精度損失很小。
尋找和移除這些參數(shù)的策略主要有三種:知識蒸餾、剪枝和量化。它們可以一起使用,也可以單獨使用。
知識蒸餾
知識蒸餾采用較大的「教師」模型來訓(xùn)練較小的「學(xué)生」模型。這項技術(shù)最初由 Hinton 等人于 2015 年提出,其關(guān)鍵在于兩個損失項:一個是學(xué)生模型的硬預(yù)測,另一個是基于學(xué)生在所有班級,產(chǎn)生相同分?jǐn)?shù)分布的能力。
Polino 等人能夠在 CIFAR10 上訓(xùn)練的 ResNet 模型的大小減少 46 倍,精度損失只有 10%;在 ImageNet 上,大小減少 2 倍,精度損失只有 2%。最近,Jiao 等人蒸餾 BERT 來制造 TinyBERT:小 7.5 倍,快 9.4 倍,并且精確度只降低了 3% 。有一些很好的開源庫實現(xiàn)了蒸餾框架,包括 Distiller 和用于 transformer 的 Distil。
剪枝
縮小模型的第二種技術(shù)是剪枝。剪枝包括評估模型中權(quán)重的重要性,并刪除那些對整體模型精度貢獻最小的權(quán)重。剪枝可以在一個網(wǎng)絡(luò)的多個尺度上進行,最小的模型是通過在單獨的權(quán)重級別上剪枝來實現(xiàn)的,小量級的權(quán)重設(shè)置為零,當(dāng)模型被壓縮或以稀疏格式存儲時,其存儲效率非常高。
Han 等人使用這種方法將普通的計算機視覺體系結(jié)構(gòu)縮小了 9~13 倍,精度變化可以忽略不計。不幸的是,缺少對快速稀疏矩陣操作的支持意味著權(quán)重級別的剪枝也不會提高運行速度。
要創(chuàng)建更小、更快的模型,需要在濾波器或?qū)蛹墑e進行剪枝,例如,刪除對總體預(yù)測精度貢獻最小的卷積層的濾波器。在濾波器級別剪枝的模型并沒有那么小,但通常速度更快。Li 等人使用該技術(shù)能夠?qū)?VGG 模型的大小和運行時間減少 34%,而不損失準(zhǔn)確性。
最后,值得注意的是,對于是否最好從更大的模型開始,從零開始剪枝或訓(xùn)練更小的模型,Liu 等人的結(jié)果好壞參半。
量化
模型經(jīng)過訓(xùn)練后,需要為部署做好準(zhǔn)備。這里也有一些技術(shù)可以對模型進行更多的優(yōu)化。通常,模型的權(quán)重存儲為 32 位浮點數(shù),但對于大多數(shù)應(yīng)用程序,這遠(yuǎn)比所需的精度高。我們可以通過量化這些權(quán)重來節(jié)省空間和時間,同時對精度產(chǎn)生最小的影響。
量化將每個浮點權(quán)重映射到一個固定精度的整數(shù),該整數(shù)包含的 bit 數(shù)少于原始值。雖然有許多量化技術(shù),但最重要的兩個因素是最終模型的 bit 深度和訓(xùn)練期間或之后是否量化權(quán)重。
最后,量化權(quán)重和激活對于加快模型的運行是很重要的。激活函數(shù)是自然產(chǎn)生浮點數(shù)的數(shù)學(xué)運算,如果不修改這些函數(shù)來產(chǎn)生量化的輸出,那么由于需要轉(zhuǎn)換,模型甚至可能運行得更慢。
在一篇精彩的測評文中,Krishnamoorthi 測試了許多量化方案和配置,以提供一組最佳實踐:
結(jié)果如下:
后訓(xùn)練通??梢詰?yīng)用到 8 位,模型減小 4 倍,模型精度損失小于 2%
訓(xùn)練感知量化,以最小的精度損失將位深度減少到 4 或 2 位(模型減小 8~16 倍)
量化權(quán)重和激活可以使 CPU 的速度提高 2-3 倍
部署
這些技術(shù)中的一個共同點是,它們生成了一個連續(xù)的模型,每個模型都有不同的形狀、大小和精度。雖然這會產(chǎn)生一些管理和組織問題,但它很好地映射到了各種各樣的硬件和軟件條件的模型將面臨的問題。
上圖顯示了 MobileNetV2 模型在各種智能手機上的運行速度,最低端和最高端設(shè)備之間可能存在 80 倍的速度差。為了給用戶提供一致的體驗,在正確的設(shè)備上放置正確的型號是很重要的,這意味著訓(xùn)練多個模型,并根據(jù)可用資源將它們部署到不同的設(shè)備上。
通常,最佳的設(shè)備性能是通過以下方式實現(xiàn)的:
使用本機格式和框架(例如 iOS 上的 Core ML 和 Android 上的 TFLite)
利用任何可用的加速器,如 GPU 或 DSP
監(jiān)視設(shè)備的性能,確定模型瓶頸,并迭代特定硬件的體系結(jié)構(gòu)
當(dāng)然,監(jiān)視和管理所有模型的不同版本并不總是那么容易。
總結(jié)
通過應(yīng)用這些技術(shù),可以將大多數(shù)模型縮小并加速至少一個數(shù)量級。下面引用到目前為止討論過的幾篇論文:
「TinyBERT 在經(jīng)驗上是有效的,并且在 GLUE 數(shù)據(jù)集中取得了與 BERT 相當(dāng)?shù)慕Y(jié)果,同時比 BERT 小了 7.5 倍,推理速度快了 9.4 倍?!埂狫iao 等人
「我們的方法將 VGG-16 的大小從 552MB 減少到 11.3MB,減少了 49 倍,沒有精度損失?!埂狧an 等人
「模型本身占用的閃存空間不到 20KB……而且它只需要 30KB 的 RAM 就可以運行?!埂狿eter Warden 在 TensorFlow Dev Summit 2019 上如是說
為了證明普通人也可以完成這件事情,我冒昧地創(chuàng)建了一個小的 17KB 風(fēng)格的傳輸模型,它只包含 11686 個參數(shù),但仍然產(chǎn)生了與 160 萬個參數(shù)的模型一樣好的結(jié)果。
左:原始圖像;中:我們 17KB 的小模型的樣式化圖像;右:更大的 7MB 模型的樣式化圖像
我一直認(rèn)為這樣的結(jié)果很容易實現(xiàn),但并不是每一篇論文都采用了標(biāo)準(zhǔn)的過程。如果我們不改變我們的實踐,我擔(dān)心我們會浪費時間、金錢和資源,同時無法將深度學(xué)習(xí)用到可能從中受益的應(yīng)用程序和設(shè)備中。
不過,好消息是,大模型的邊際效益似乎正在下降,而且由于這里概述的這些技術(shù),我們也可以對其大小和速度進行優(yōu)化,而不會犧牲太多的準(zhǔn)確性。
額外資源:
Distiller — A library for optimizing PyTorch models
Keras Tuner — Hyperparameter optimization for Keras
TinyML — Group dedicated to embedded ML
via:https://heartbeat.fritz.ai/deep-learning-has-a-size-problem-ea601304cd8
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。