深度學(xué)習(xí)徹底改變了我們分析、理解和處理數(shù)據(jù)的方式,而且在各個(gè)領(lǐng)域的應(yīng)用中都取得了巨大的成功,其在計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理、醫(yī)療診斷和醫(yī)療保健、自動(dòng)駕駛汽車(chē)、推薦系統(tǒng)以及氣候和天氣建模方面有許多成功案例。
在神經(jīng)網(wǎng)絡(luò)模型不斷變大的時(shí)代,對(duì)計(jì)算速度的高需求對(duì)硬件和軟件都形成了巨大的挑戰(zhàn)。模型剪枝和低精度推理是非常有效的解決方案。
自 NVIDIA Ampere 架構(gòu)開(kāi)始, 隨著 A100 Tensor Core GPU 的推出,NVIDIA GPU 提供了可用于加速推理的細(xì)粒度結(jié)構(gòu)化稀疏功能。在本文中,我們將介紹此類(lèi)稀疏模型的訓(xùn)練方法以保持模型精度,包括基本訓(xùn)練方法、漸進(jìn)式訓(xùn)練方法以及與 int8 量化的結(jié)合。我們還將介紹如何利用 Ampere 架構(gòu)的結(jié)構(gòu)化稀疏功能進(jìn)行推理。
騰訊機(jī)器學(xué)習(xí)平臺(tái)部門(mén) (MLPD) 利用了漸進(jìn)式訓(xùn)練方法,簡(jiǎn)化了稀疏模型訓(xùn)練并實(shí)現(xiàn)了更高的模型精度。借助稀疏功能和量化技術(shù),他們?cè)隍v訊的離線 倍的加速。
NVIDIA Ampere和NVIDIA Hopper 架構(gòu) GPU增加了新的細(xì)粒度結(jié)構(gòu)化稀疏功能,該功能主要用于加速推理。此功能是由稀疏 Tensor Core 提供,這些稀疏 Tensor Core 需要 2:4 的稀疏模式。也就是說(shuō),以 4 個(gè)相鄰權(quán)重為一組,其中至少有 2 個(gè)權(quán)重必須為 0,即 50% 的稀疏率。
這種稀疏模式可實(shí)現(xiàn)高效的內(nèi)存訪問(wèn)能力,有效的模型推理加速,并可輕松恢復(fù)模型精度。在模型壓縮后,存儲(chǔ)格式只存儲(chǔ)非零值和相應(yīng)的索引元數(shù)據(jù)(圖 1)。稀疏 Tensor Core 在執(zhí)行矩陣乘法時(shí)僅處理非零值,理論上,計(jì)算吞吐量是同等稠密矩陣乘法的 2 倍。
(結(jié)構(gòu)化稀疏矩陣具有 2:4 的稀疏模式。在 4 個(gè)相鄰權(quán)重當(dāng)中,至少有 2 個(gè)值為零。在模型壓縮后,僅存儲(chǔ)非零值和相應(yīng)的索引元數(shù)據(jù)。)
結(jié)構(gòu)化稀疏功能主要應(yīng)用于能夠提供 2:4 稀疏權(quán)重的全連接層和卷積層。如果提前對(duì)這些層的權(quán)重做剪枝,則這些層可以使用結(jié)構(gòu)化稀疏功能來(lái)進(jìn)行加速。
由于直接對(duì)權(quán)重做剪枝會(huì)降低模型精度,因此在使用結(jié)構(gòu)化稀疏功能的時(shí)候,您需要進(jìn)行訓(xùn)練來(lái)恢復(fù)模型精度。下面,我們將介紹一些基本訓(xùn)練方法和新的漸進(jìn)式訓(xùn)練方法。
基本訓(xùn)練方法可保持模型精度,并且無(wú)需任何超參數(shù)調(diào)優(yōu)。了解更多技術(shù)細(xì)節(jié),請(qǐng)參閱論文Accelerating Sparse Deep Neural Networks()。
?。ɑ居?xùn)練方法就是使用剪枝后的權(quán)重和掩碼后的優(yōu)化器重復(fù)原始稠密模型的訓(xùn)練過(guò)程。)
例如,把稀疏訓(xùn)練應(yīng)用在多階段式的稠密模型訓(xùn)練當(dāng)中。比如對(duì)于一些目標(biāo)檢測(cè)模型,如果下游任務(wù)的數(shù)據(jù)集足夠大,您只需做稀疏調(diào)優(yōu)訓(xùn)練。對(duì)于像 BERT-SQuAD 等模型,調(diào)優(yōu)階段使用的數(shù)據(jù)集相對(duì)較小,您則需要在預(yù)訓(xùn)練階段進(jìn)行稀疏訓(xùn)練以獲得更好的模型精度。
此外,通過(guò)在稀疏調(diào)優(yōu)之前插入量化節(jié)點(diǎn),您可以輕松將稀疏調(diào)優(yōu)與 int8 量化調(diào)優(yōu)結(jié)合起來(lái)。所有這些訓(xùn)練以及調(diào)優(yōu)方法都是一次性的,即最終獲得的模型只需要經(jīng)過(guò)一次稀疏訓(xùn)練處理。
一次性稀疏調(diào)優(yōu)(fine-tuning)可以覆蓋大多數(shù)任務(wù),并在不損失精度的情況下實(shí)現(xiàn)加速。然而,就一些對(duì)權(quán)重?cái)?shù)值變化敏感的困難任務(wù)而言,對(duì)所有權(quán)重做一次性稀疏訓(xùn)練會(huì)導(dǎo)致大量信息損失。在小型數(shù)據(jù)集上只做稀疏化調(diào)優(yōu)可能會(huì)很難恢復(fù)精度,對(duì)于這些任務(wù)而言,就需要稀疏預(yù)訓(xùn)練(pretraining)。
然而稀疏預(yù)訓(xùn)練需要更多數(shù)據(jù),而且更加耗時(shí)。因此,受到卷積神經(jīng)網(wǎng)絡(luò)剪枝方法的啟發(fā),我們引入了漸進(jìn)式稀疏訓(xùn)練方法,在此類(lèi)任務(wù)上僅應(yīng)用稀疏化調(diào)優(yōu)便可以實(shí)現(xiàn)模型的稀疏化,同時(shí)不會(huì)造成明顯的精度損失。了解更多細(xì)節(jié),請(qǐng)參閱論文Learning both Weights and Connections for Efficient Neural Networks()。
?。u進(jìn)式稀疏訓(xùn)練方法將稀疏率分為幾個(gè)步驟,以輕松恢復(fù)精度。漸進(jìn)式稀疏訓(xùn)練方法的核心思想是將目標(biāo)稀疏率進(jìn)行若干次切分。)
如上述公式和圖 4 所示,對(duì)于目標(biāo)稀疏率 S,我們將其分為 N 份,這將有助于在稀疏調(diào)優(yōu)過(guò)程中快速恢復(fù)信息。根據(jù)我們的實(shí)驗(yàn),在相同的調(diào)優(yōu)迭代次數(shù)內(nèi),使用漸進(jìn)式稀疏訓(xùn)練相比一次性稀疏訓(xùn)練,可以獲得更高的模型精度。
圖 4. 漸進(jìn)式稀疏訓(xùn)練方法 (以 50% 稀疏率的 2:4 結(jié)構(gòu)化稀疏模式為例)
?。u進(jìn)式稀疏訓(xùn)練方法的示例:計(jì)算權(quán)重掩碼以達(dá)到 25% 稀疏率,再進(jìn)行稀疏調(diào)優(yōu)恢復(fù)性能,最后重新計(jì)算掩碼使之達(dá)到 50% 稀疏率并對(duì)網(wǎng)絡(luò)進(jìn)行調(diào)優(yōu)。)
我們以 50% 稀疏率的 2:4 結(jié)構(gòu)化稀疏為例,將稀疏率分為兩份,然后逐步稀疏和調(diào)優(yōu)模型中的權(quán)重參數(shù)。如圖 4 所示,首先計(jì)算權(quán)重掩碼以實(shí)現(xiàn) 25% 的稀疏率,然后執(zhí)行稀疏調(diào)優(yōu)以恢復(fù)模型精度。接下來(lái),重新對(duì)剩余權(quán)重計(jì)算權(quán)重掩碼以達(dá)到 50% 的稀疏率,并對(duì)網(wǎng)絡(luò)進(jìn)行調(diào)優(yōu),以獲得一個(gè)精度無(wú)損的稀疏模型。
為了獲得更輕量的模型,我們進(jìn)一步將稀疏與量化、蒸餾相結(jié)合,即 Sparse-QAT。
下方的公式表示一個(gè)通用的量化過(guò)程。對(duì)于 32 位浮點(diǎn)數(shù)值 x,我們使用 Q [x] 表示其具有 K-bits 表示的量化值。
通常情況下,我們首先將原始參數(shù)量化到特定范圍,并將其近似為整數(shù)。然后,可以使用這個(gè)量化比例 scale (s) 來(lái)恢復(fù)原始值。這樣就得到了第一種量化方法,即校準(zhǔn),也稱(chēng)為訓(xùn)練后量化(post-training quantization, PTQ)。在校準(zhǔn)中,一個(gè)關(guān)鍵的因素是要設(shè)置一個(gè)適當(dāng)?shù)牧炕壤╯cale)。如果這個(gè)比例值過(guò)大,量化范圍內(nèi)的數(shù)字將不太準(zhǔn)確。相反,如果這個(gè)比例值過(guò)小,會(huì)導(dǎo)致大量的數(shù)字落在 lmin 到 lmax 的范圍之外。因此,為了平衡這兩個(gè)方面,我們首先獲得張量中數(shù)值的統(tǒng)計(jì)分布,然后設(shè)置量化比例以覆蓋 99.99% 的數(shù)值。許多工作已經(jīng)證明,這種方法對(duì)于在校準(zhǔn)過(guò)程中找到合適的量化比例非常有幫助。
然而,盡管我們已經(jīng)為校準(zhǔn)設(shè)置了一個(gè)合理的量化比例,但是對(duì)于 8 bit 量化來(lái)說(shuō),模型精度仍然會(huì)顯著下降。因此,我們引入量化感知訓(xùn)練(quantization-aware training, QAT),以進(jìn)一步提高校準(zhǔn)后的精度。QAT 的核心思想是以模擬量化的方法來(lái)訓(xùn)練模型。
在前向傳播過(guò)程中,我們將權(quán)重量化為 int8,然后將其反量化為浮點(diǎn)數(shù)來(lái)模擬真實(shí)量化。在反向傳播過(guò)程中,引入 straight through estimation (STE) 的方法來(lái)更新模型權(quán)重。STE 的核心思想可以用如下公式表示:
由上述公式可知,閾值范圍內(nèi)的值對(duì)應(yīng)的梯度直接反向傳播,超出閾值范圍的值對(duì)應(yīng)的梯度被裁剪為 0。
Sparse-QAT 訓(xùn)練流水線 顯示了 Sparse-QAT 的訓(xùn)練流水線。稀疏化、量化、蒸餾以并行的方式執(zhí)行,最終獲得一個(gè)稀疏的 int8 量化模型。整個(gè)流水線包括如下三條路徑:
自 8.0 版本開(kāi)始,TensorRT 可以支持稀疏卷積,矩陣乘法 (GEMM) 需要用 1x1 的卷積替代來(lái)進(jìn)行稀疏化推理。在 TensorRT 中啟用稀疏化推理非常簡(jiǎn)單。在導(dǎo)入 TensorRT 之前,模型的權(quán)重應(yīng)具有 2:4 的稀疏模式。如果使用 trtexec 構(gòu)建引擎,只需設(shè)置 -sparity=enable 標(biāo)志即可。如果您正在編寫(xiě)代碼或腳本來(lái)構(gòu)建引擎,只需按如下所示設(shè)置構(gòu)建配置:
TensorRT 插件應(yīng)實(shí)現(xiàn) configurePlugin方法,該方法會(huì)根據(jù)輸入和輸出類(lèi)型及尺寸設(shè)置插件。您需要在這個(gè)函數(shù)當(dāng)中初始化 cuSPARSELt 的相關(guān)結(jié)構(gòu)。
在相關(guān)性案例 2 中,稀疏 int8 模型可以獲得與 float32 模型接近的 Acc 分?jǐn)?shù),相比稠密 int8 模型,其獲得了 1.4 倍的推理加速。
NVIDIA Ampere 架構(gòu)中的結(jié)構(gòu)化稀疏功能可以加速許多深度學(xué)習(xí)工作負(fù)載,并且易于結(jié)合 TensorRT 和 cuSPARSELt 稀疏加速庫(kù)一起使用。
江西宜春市市長(zhǎng)嚴(yán)允擬任市委書(shū)記!宜春市委書(shū)記于秀明已當(dāng)選江西政協(xié)副主席
小米明日將在印度發(fā)布 Redmi 12 手機(jī),消息稱(chēng)其 10999 盧比起
三星Galaxy S24全系參數(shù)曝光,可能是近幾年最有看點(diǎn)的三星手機(jī)了
iPhone15系列參數(shù)爆料匯總,一系四機(jī),全系靈動(dòng)島+USB-C接口