“如何用一個GPU實(shí)現(xiàn)八個GPU的水平?!?/span>
在上一篇文章結(jié)尾,我們在256秒內(nèi)將模型在CIFAR10上訓(xùn)練到94%的測試精確度。相比之下,基于單個V100 GPU上100%的計(jì)算效率,初始基線為341秒,而我們理想中的40秒的目標(biāo)略微不切實(shí)際。今天,我們將定一個適中的目標(biāo)——超越fast.ai在DAWNBench中的獲勝記錄,其中使用了8個GPU,訓(xùn)練了174秒。我們會繼續(xù)使用單個GPU,因?yàn)榫嚯x使用所有FLOP,我們還離得很遠(yuǎn)。
對于目前的設(shè)置,我們能得對所需要的時間進(jìn)行大致對比,我們選擇性地刪除了計(jì)算中的某些部分,并運(yùn)行了剩下部分。例如,我們可以現(xiàn)在GPU上預(yù)裝隨機(jī)訓(xùn)練數(shù)據(jù),省去數(shù)據(jù)下載和遷移的時間。我們還能刪除優(yōu)化器步驟和ReLU以及批規(guī)范層,只留下卷積層。如果這樣做,不同batch size所用時間如下:
這里有幾點(diǎn)明顯特征。首先,批標(biāo)準(zhǔn)化占用了很大一部分時間。其次,卷積的主要部分也占用了超過一半的計(jì)算時間,比我們預(yù)計(jì)的在100%計(jì)算力上用掉一半的時間還要長。第三,優(yōu)化器和數(shù)據(jù)下載步驟并不是主要問題。
在GPU專家Graham Hazel的幫助下,我們查看了一些配置文件,迅速發(fā)現(xiàn)了批標(biāo)準(zhǔn)化的一些問題——用PyTorch(0.4版本)將模型轉(zhuǎn)換為半精度的默認(rèn)方法會觸發(fā)一個慢速代碼路徑,該路徑不使用優(yōu)化的CuDNN例程。如果我們將批標(biāo)準(zhǔn)化的權(quán)重轉(zhuǎn)換回單精度,那么快速代碼就被激發(fā),所用時間看起來就更正常了:
經(jīng)過改進(jìn),在35個epoch內(nèi)訓(xùn)練達(dá)到94%的精度只需要186秒,越來越接近我們的目標(biāo)了!
除此之外,還有很多方法能改進(jìn)訓(xùn)練,將時間縮短至174秒。GPU代碼還可以進(jìn)一步優(yōu)化,例如,當(dāng)前的激活數(shù)據(jù)以NCHW格式存儲,但TensorBoard中的快速CuDNN卷積例程希望數(shù)據(jù)遵循NHWC的順序。所以,在卷積前后執(zhí)行前向和后向轉(zhuǎn)置需要占用很大一部分運(yùn)行時間。由于PyTorch 0.4不支持原生NHWC計(jì)算,并且在其他框架中似乎沒有成熟的支持,這一問題會在之后的文章中重點(diǎn)關(guān)注。
將訓(xùn)練時間減少到30個epoch,時間也會減少到161秒,輕松打破目前的記錄。但如果僅僅加速基準(zhǔn)學(xué)習(xí)速率,在5次運(yùn)行中沒有能達(dá)到94%的案例。
在CIFAR10上一中有效的簡單正則化策略就是“Cutout”正則化,它可以清除每張訓(xùn)練圖片中的隨機(jī)子集。我們在訓(xùn)練圖像選取隨機(jī)8×8方形子集進(jìn)行實(shí)驗(yàn),除此之外還有標(biāo)準(zhǔn)的數(shù)據(jù)增強(qiáng),用于填補(bǔ)、裁剪、隨機(jī)翻轉(zhuǎn)。
在基線35個epoch訓(xùn)練后的結(jié)果都達(dá)到了94%的精確度,其中還有一次達(dá)到了94.3%,這也是在基線上的小進(jìn)步。對學(xué)習(xí)率進(jìn)行手動優(yōu)化后,運(yùn)行精度達(dá)到了94.5%(將峰值學(xué)習(xí)速率提前,用簡單的線性衰減替換衰減相位)。
如果我們在30個epoch上提高學(xué)習(xí)速率,4/5的運(yùn)行次數(shù)會達(dá)到94%的精度,中間值為94.13%。我們可以將batch size提高到768,4/5也能達(dá)到94%,中值為94.06%。當(dāng)batch size為512時,30epoch運(yùn)行時間為161秒,當(dāng)batch size為768時,時間為154秒,所有都只在一個GPU上,打破了我們的目標(biāo)!折線圖如下:
現(xiàn)在我們達(dá)到了文章開頭設(shè)定的目標(biāo),想要復(fù)現(xiàn)這一過程,可以點(diǎn)擊鏈接查看代碼:github.com/davidcpage/cifar10-fast/blob/master/experiments.ipynb。不過我們的新紀(jì)錄應(yīng)該能很容易打破,首先,我們一直將單個GPU的計(jì)算能力維持在25%以下,之后還有對其優(yōu)化的方法。第二,可以用相關(guān)技術(shù)減少訓(xùn)練epoch,例如Mixup正則化和AdamW訓(xùn)練。我們尚未研究如何對參數(shù)平均以加速最終收斂,如果我們打算在推理時做更多工作,則可以使用測試時間增強(qiáng)來進(jìn)一步縮短訓(xùn)練時間。還有人提出在更大的網(wǎng)絡(luò)中進(jìn)行小于20個epoch的實(shí)驗(yàn)訓(xùn)練,結(jié)合fast.ai的技術(shù),進(jìn)一步研究也許會發(fā)現(xiàn)更有趣的結(jié)果。
但是,目前我們將不繼續(xù)探索這些未開發(fā)的途徑,而是重點(diǎn)觀察目前我們一直使用的網(wǎng)絡(luò),就會發(fā)現(xiàn)意想不到的收獲。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6909瀏覽量
88849 -
gpu
+關(guān)注
關(guān)注
28文章
4703瀏覽量
128726
原文標(biāo)題:如何訓(xùn)練你的ResNet(三):正則化
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論