深度神经网络混合精度训练
深度神經(jīng)網(wǎng)絡(luò)混合精度訓(xùn)練
Mixed-Precision Training of Deep Neural Networks
論文鏈接:https://arxiv.org/abs/1710.03740
深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks,深度神經(jīng)網(wǎng)絡(luò)s)在圖像處理與理解、語言建模、語言翻譯、語音處理、游戲等領(lǐng)域取得了突破性進(jìn)展。深度神經(jīng)網(wǎng)絡(luò)的復(fù)雜度不斷增加,從而增加了訓(xùn)練這些網(wǎng)絡(luò)所需的計(jì)算資源。混合精度訓(xùn)練通過使用較低精度的算法降低了所需的資源,具有以下優(yōu)點(diǎn)。
減少所需的內(nèi)存量。半精度浮點(diǎn)格式(FP16)使用16位,而單精度格式(FP32)使用32位。降低所需內(nèi)存可以訓(xùn)練更大的型號或訓(xùn)練更大的小批量。
縮短訓(xùn)練或推理時(shí)間。執(zhí)行時(shí)間可能對內(nèi)存或算術(shù)帶寬敏感。半精度將訪問的字節(jié)數(shù)減半,從而減少了在內(nèi)存有限的層中花費(fèi)的時(shí)間。與單精度相比,NVIDIA gpu提供高達(dá)8倍的半精度算術(shù)吞吐量,從而加快了數(shù)學(xué)受限層的速度。
圖1. bigLSTM英語語言模型的訓(xùn)練曲線顯示了本文描述的混合精確訓(xùn)練技術(shù)的優(yōu)點(diǎn)。Y軸是訓(xùn)練損失。無損失標(biāo)度的混合精度(灰色)在一段時(shí)間后會(huì)發(fā)散,而有損失標(biāo)度的混合精度(綠色)與單精度模型(黑色)匹配。
由于深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練傳統(tǒng)上依賴于IEEE單精度格式,本文的重點(diǎn)是在保持單精度網(wǎng)絡(luò)精度的同時(shí)進(jìn)行半精度訓(xùn)練(如圖1所示)。這種技術(shù)稱為混合精度訓(xùn)練,因?yàn)樗瑫r(shí)使用單精度和半精度表示。
混合精度成功訓(xùn)練的技巧
半精度浮點(diǎn)格式由1位符號、5位指數(shù)和10位小數(shù)組成。支持的指數(shù)值屬于[-24,15]范圍,這意味著格式支持[2-24,65504]范圍內(nèi)的非零值量級。由于這比單精度格式支持的[2-149,~3.4×1038]范圍窄,訓(xùn)練一些網(wǎng)絡(luò)需要額外考慮。本節(jié)描述了成功訓(xùn)練半精度深度神經(jīng)網(wǎng)絡(luò)s的三種技術(shù):將FP16產(chǎn)品累積到FP32中;損耗標(biāo)度;以及FP32砝碼的主副本。通過這些技術(shù),NVIDIA和Baidu Research能夠匹配所有經(jīng)過訓(xùn)練的網(wǎng)絡(luò)的單精度結(jié)果精度(混合精度訓(xùn)練)。請注意,并非所有的網(wǎng)絡(luò)都需要使用所有這些技術(shù)進(jìn)行培訓(xùn)。
有關(guān)如何在各種框架(包括可用代碼示例)中應(yīng)用這些技術(shù)的詳細(xì)說明,請參閱《混合精度培訓(xùn)用戶指南》。
累積到FP32
NVIDIA Volta GPU體系結(jié)構(gòu)引入了張量核指令,它將半精度矩陣相乘,將結(jié)果累加成單精度或半精度輸出。積累到單一的精度是取得良好訓(xùn)練效果的關(guān)鍵。在寫入內(nèi)存之前,將累積值轉(zhuǎn)換為半精度。cu深度神經(jīng)網(wǎng)絡(luò)和CUBLAS庫提供了各種依賴于張量核進(jìn)行運(yùn)算的函數(shù)。
Loss損耗標(biāo)度
訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)s時(shí)遇到四種類型的張量:激活、激活梯度、權(quán)重和權(quán)重梯度。根據(jù)經(jīng)驗(yàn),權(quán)重和權(quán)重梯度都在半精確表示的值量級范圍內(nèi)。然而,對于某些網(wǎng)絡(luò),小幅度激活梯度低于半精度范圍。例如,考慮在圖2中訓(xùn)練多盒SSD檢測網(wǎng)絡(luò)時(shí)遇到的激活梯度直方圖,它顯示log2刻度上的值百分比。小于2-24的值以半精度格式變?yōu)榱恪?/p>
注意,大多數(shù)半精度范圍不用于激活梯度,激活梯度往往是小于1的小值。因此,可以通過將激活梯度乘以比例因子S,將其“移位”到FP16可表示的范圍內(nèi)。在SSD網(wǎng)絡(luò)的情況下,將梯度乘以8就足夠了。這表明2-27量級以下的激活梯度值與該網(wǎng)絡(luò)的訓(xùn)練無關(guān),而保持在[2-27,2-24]范圍內(nèi)的值是重要的。
圖2. 以單精度訓(xùn)練多盒SSD探測器網(wǎng)絡(luò)時(shí)記錄的激活梯度直方圖。Y軸是對數(shù)刻度上所有值的百分比。X軸是絕對值的對數(shù)刻度,也是零的特殊項(xiàng)。例如,在本次培訓(xùn)中,66.8%的數(shù)值為零,而4%的數(shù)值介于2-32和2-30之間。
一個(gè)非常有效的方法,以確保梯度下降到范圍內(nèi)可代表的一半精度是乘上規(guī)模因數(shù)的訓(xùn)練損失。這只增加了一個(gè)乘法運(yùn)算,通過鏈?zhǔn)揭?guī)則,它可以確保所有的梯度都被放大(或上移),而不需要額外的成本。損失縮放確保恢復(fù)丟失到零的相關(guān)梯度值。在權(quán)重更新之前,權(quán)重梯度需要按相同的因子S縮小。縮小操作可以與權(quán)重更新本身融合(導(dǎo)致沒有額外的內(nèi)存訪問)或單獨(dú)執(zhí)行。有關(guān)詳細(xì)信息,請參閱《混合精度培訓(xùn)用戶指南》和《混合精度培訓(xùn)紙》。
FP32重量主副本
深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練的每次迭代都通過增加相應(yīng)的權(quán)值梯度來更新網(wǎng)絡(luò)權(quán)值。權(quán)重梯度的大小通常明顯小于相應(yīng)的權(quán)重,特別是在與學(xué)習(xí)率相乘(或自適應(yīng)計(jì)算的優(yōu)化器因子,如Adam或Adagrad)之后。如果其中一個(gè)加數(shù)太小而無法在半精度表示中產(chǎn)生差異(例如,由于指數(shù)差異過大,較小的加數(shù)在移動(dòng)以對齊二進(jìn)制點(diǎn)后變?yōu)榱?#xff09;,則此幅度差異可能不會(huì)導(dǎo)致發(fā)生更新。
對于以這種方式丟失更新的網(wǎng)絡(luò),一個(gè)簡單的補(bǔ)救方法是以單精度維護(hù)和更新權(quán)重的主副本。在每次迭代中,對主權(quán)重進(jìn)行半精度復(fù)制,并在正向和反向傳播中使用,從而獲得性能優(yōu)勢。在權(quán)重更新期間,計(jì)算出的權(quán)重梯度將轉(zhuǎn)換為單精度,并用于更新主副本,該過程將在下一次迭代中重復(fù)。因此,只在需要的地方混合使用半精度存儲和單精度存儲。
生成性對抗網(wǎng)絡(luò)(GANs)在訓(xùn)練過程中結(jié)合了回歸和辨別任務(wù)。對于圖像任務(wù),生成器網(wǎng)絡(luò)回歸像素顏色。在我們的例子中,生成器預(yù)測三個(gè)通道的8位顏色值。該網(wǎng)絡(luò)經(jīng)過訓(xùn)練,使用DCGAN方法(Rad Fordtal.,2015)和Celeb Faces數(shù)據(jù)集(Liuatal.,2015b)生成128x128像素的人臉圖像。
生成器有7層分步卷積,6層有漏性ReLU激活,1層有tanh激活。鑒別器有6個(gè)卷積,2個(gè)全連接層。除最后一層使用sigmoid外,其余均使用漏性ReLU激活。除了鑒別器的最后一個(gè)完全連接層之外,所有層都應(yīng)用了批處理規(guī)范化。Adam優(yōu)化器用于訓(xùn)練10萬次迭代。圖6中的一組輸出圖像。注意,我們顯示一組隨機(jī)選擇的輸出圖像,而GAN論文通常通過排除不好的示例來顯示一組精心策劃的輸出。與本文所涉及的其他網(wǎng)絡(luò)不同,GANs沒有廣泛接受的結(jié)果質(zhì)量量化。從質(zhì)量上看,FP32和混合精度訓(xùn)練的輸出具有可比性。此網(wǎng)絡(luò)不需要進(jìn)行損耗縮放以匹配FP32結(jié)果。
混合精度訓(xùn)練迭代
上面介紹的三種技術(shù)可以組合到每個(gè)訓(xùn)練迭代的以下步驟序列中。對傳統(tǒng)迭代過程的補(bǔ)充是粗體的。
制作權(quán)重的FP16副本
使用FP16權(quán)重和激活進(jìn)行前向傳播
將產(chǎn)生的損耗乘以標(biāo)度因數(shù)S
使用FP16權(quán)重、激活及其梯度反向傳播
將權(quán)重梯度乘以1/S
可選地處理權(quán)重梯度(漸變剪裁、權(quán)重衰減等)
更新FP32中權(quán)重的主副本
如何將混合精度訓(xùn)練步驟添加到各種深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練框架的腳本中的示例可以在《混合精度訓(xùn)練用戶指南》中找到。
結(jié)果
將上述三種混合精確訓(xùn)練技術(shù)應(yīng)用于各種卷積深度神經(jīng)網(wǎng)絡(luò)、遞歸深度神經(jīng)網(wǎng)絡(luò)和生成深度神經(jīng)網(wǎng)絡(luò)。應(yīng)用任務(wù)包括圖像分類、目標(biāo)檢測、圖像生成、語言建模、語音處理和語言翻譯。有關(guān)完整的實(shí)驗(yàn)細(xì)節(jié),請參閱混合精度訓(xùn)練紙。表1顯示了不同深度神經(jīng)網(wǎng)絡(luò)模型的圖像分類結(jié)果。表1中的所有網(wǎng)絡(luò)都不需要縮放損耗來匹配單精度結(jié)果精度。表2顯示了目標(biāo)檢測網(wǎng)絡(luò)的平均精度。多盒SSD訓(xùn)練需要損耗標(biāo)度,標(biāo)度因子8足以匹配單精度訓(xùn)練。如果沒有這個(gè)比例因子,太多的激活梯度值將丟失為零,網(wǎng)絡(luò)無法訓(xùn)練。遞歸網(wǎng)絡(luò)往往需要損失標(biāo)度,在許多情況下,需要一個(gè)精確的權(quán)重主副本。例如,bigLSTM英語語言建模網(wǎng)絡(luò)需要128的比例因子,如果沒有這個(gè)比例因子,訓(xùn)練最終會(huì)發(fā)散,如圖1所示。有關(guān)更多網(wǎng)絡(luò)和培訓(xùn)詳細(xì)信息,請參閱混合精度培訓(xùn)文件。
表2. 基于帕斯卡VOC 2007測試數(shù)據(jù)的目標(biāo)檢測平均精度(mAP)。更快的R-CNN接受了VOC 2007數(shù)據(jù)的訓(xùn)練,而SSD接受了voc2007和2012數(shù)據(jù)的聯(lián)合訓(xùn)練(更大的數(shù)據(jù)集說明實(shí)現(xiàn)的mAP更高)。
結(jié)論
本文簡要介紹了三種混合精度訓(xùn)練技術(shù),可用于深度神經(jīng)網(wǎng)絡(luò)的半精度訓(xùn)練。這些技術(shù)的實(shí)驗(yàn)結(jié)果表明,雖然半精度范圍比單精度范圍窄,但當(dāng)結(jié)果與純單精度訓(xùn)練的結(jié)果相匹配時(shí),對于各種應(yīng)用任務(wù)的最新深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練是足夠的。有關(guān)各種網(wǎng)絡(luò)的混合精度訓(xùn)練和結(jié)果的更詳細(xì)描述,請參閱混合精度訓(xùn)練文件。有關(guān)可以在各種深度神經(jīng)網(wǎng)絡(luò)培訓(xùn)框架的培訓(xùn)腳本中使用的代碼示例,請參閱《混合精度培訓(xùn)用戶指南》。
總結(jié)
以上是生活随笔為你收集整理的深度神经网络混合精度训练的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多传感器融合:自动驾驶(下)
- 下一篇: GPU—加速数据科学工作流程