26秒單GPU訓練CIFAR10,Jeff Dean也點讚的深度學習優化技巧

 

https://www.jiqizhixin.com/articles/2019-08-20-15?from=synced&keyword=26%E7%A7%92%E5%8D%95GPU%E8%AE%AD%E7%BB%83CIFAR10

https://www.jiqizhixin.com/articles/2019-08-20-15?from=synced&keyword=26%E7%A7%92%E5%8D%95GPU%E8%AE%AD%E7%BB%83CIFAR10

https://www.jiqizhixin.com/articles/2019-08-20-15?from=synced&keyword=26%E7%A7%92%E5%8D%95GPU%E8%AE%AD%E7%BB%83CIFAR10

26 秒內用 ResNet 訓練 CIFAR10?一塊 GPU 也能這麼幹。近日,myrtle.ai 科學家 David Page 提出了一大堆針對數據預處理、模型架構、訓練和測試方面的優化方法,有了它們,加速訓練你也可以。

運行速度和算力一直是制約深度學習模型發展的瓶頸。研究人員一直在研究如何能夠進一步提升模型的訓練和推斷速度,並減少對硬件性能的依賴。今日,一位名爲 David Page 的 myrtle.ai 科學家和他的團隊對 ResNet 訓練進行了一系列改造,將在單 GPU 上訓練 CIFAR10 數據集並達到 94% 準確率所需的時間減少到了 26 秒,比 DAWNBench 排行榜現在的第一名高了 10 秒以上。這一項目獲得了 Jeff Dean 的點贊。

 

myrtle.ai 研究科學家 David Page 的推特,獲得了 Jeff Dean 的點贊。

  • colab地址:https://colab.research.google.com/github/davidcpage/cifar10-fast/blob/master/bag_of_tricks.ipynb

  • 博客地址:https://myrtle.ai/how-to-train-your-resnet-8-bag-of-tricks/

DAWNBench 是斯坦福大學提出的一個基準測試,用於衡量端到端深度學習訓練和推斷的運行時間和。計算時間和消耗是構建深度學習模型中重要的問題,因此提出這一測試的科學家希望能夠提供量化評價模型訓練時間、訓練消耗、推斷延遲時間和推斷消耗的開支的方法。並根據不同的優化策略、模型架構、軟件框架和硬件等指標來進行測算。

 

以上爲目前的 DAWNBechmark,排名最高的模型用時 37 秒。

在經過一系列的調優之後,研究者的單 GPU 實現超越了頂級的多 GPU 的訓練和推斷速度,相比於最初在單 GPU 的 SOTA 水平上實現了 10 倍的改進。現在,研究者已經把時間降至 26 秒了,而目前排名最高的模型訓練 CIFAR10 數據集需要 37 秒。

作者表示,他們此次發佈的主要目標是提供一個用於測試新技術、經過良好調整的基線,允許用戶在幾分鐘內在單個 GPU 上完成統計上數量顯著的訓練。

既然訓練只需要 26 秒,那麼中間肯定會有一系列操作來降低訓練時間。作者在技術博客中公開並分析了這些技巧。每當使用一個,訓練的所需的 Epoch 數量就可以減少,在保證準確率爲 94% 的情況下,研究者一步步減少了所需的 Epoch 數量,使得模型的訓練速度逐漸上升。

以下爲每個方法使用後訓練花費的時間。隨着應用的方法越來越多,達到 94% 測試準確率的訓練時間也越來越短。

  • GPU 上進行數據預處理 (70s)

  • 更換最大池化順序 (64s)

  • 標籤平滑化 (59s)

  • 使用 CELU 激活函數 (52s)

  • 幽靈批歸一化 (46s)

  • 固定批歸一化的縮放 (43s)

  • 輸入 patch 白化 (36s)

  • 指數移動平均時間 (34s)

  • 測試狀態增強 (26s)

26 秒訓練的 ResNet 效果怎麼樣

既然單塊 GPU 下訓練速度快了這麼多,那麼效果是不是同樣優秀?研究者表示,如果這些技巧能同時強化驗證準確度,那麼這表示他們也能用來加速更通用的 ImageNet。

研究者經過一些調參,並從 24 個 Epoch 到 100 個 Epoch 同時測試了基線模型與實驗模型。最終每一次實驗都做了 5 組,並得到以下訓練曲線:

 

 

由於 DAWNBench 只需要準確度達到 94% 就可以了,因此 26 秒訓練的模型已經達到了要求。此外,研究者 9 層的 ResNet 運行 80 個 Epoch 後能達到 96.1%,而且他們還沒有進行更多的優化。當然,26 秒只是訓練 10 個 Epoch 的時間。研究人員表示,如果繼續訓練到 70 個 Epoch,那麼準確率還能增加到 96%。

下文爲每一個優化技巧的介紹和帶來的速度提升。

在 GPU 上進行數據預處理(70 秒)

研究者首先進行了一些代碼優化的工作。根據早期的提交結果日誌顯示,他們在數據預處理上浪費了 3 秒鐘的時間。

而將整個數據集(以 uint8 的格式)移動到 GPU 花費的時間可以忽略不計(40ms),而且 GPU 完成整個預處理工作甚至更快(15ms)。所以主要的時間消耗在了將處理過的數據集移動回 CPU,這一過程消耗了半秒鐘。

因此,儘管之前提升被浪費掉的 3 秒是個進步,但是還是有另外的提升空間。這是因爲數據在分批和增強後依然會重新被傳回 GPU 上,導致每個 Epoch 都會有些延遲。研究人員認爲,他們需要在 GPU 上進行數據增強方面的操作,用於跳過數據傳遞的步驟。

這是可以做到的,但是需要謹慎操作。研究者的操作非常簡單,只需要 35 行代碼(不依賴 Pytorch DataLoaders)。以下爲一些隨機圖像增強的結果。

 

相比以前提供的結果,如果將數據預處理放到 GPU 上,那麼總體訓練時間可以降到 70 秒以內,相當於讓 18 年提交的結果前進了兩位。

調整最大池化層(64 秒)

最大池化往往在激活函數(如 ReLU)的後面進行。但是如果首先進行池化會更高效。在一個卷積-池化塊中,研究者調換了激活函數和池化的順序。

 

改變這一順序在 24 個 Epoch 訓練時間中減少了 3 秒的時間,而且不改變網絡計算的所有函數。進一步的,研究人員嘗試將池化放在卷積層之後,進一步提升了運算效率。但是由於這樣會影響網絡的結構,也會造成準確率的降低。

 

儘管準確率降低,但最多只需要訓練一個 Epoch 就能達到這個準確率。因此適當減少準確率,減少 Epoch 的情況下,總體上能夠降低訓練時間。從積極的方面來說,這樣減少了 5 秒的訓練時間,使得訓練時間減少到了 64s,相當於目前排行榜的第三位了。

標籤平滑化(59 秒)

標籤平滑化是一個很成熟的方法,用於提升訓練速度和神經網絡在分類問題上的泛化能力。這個方法包括將 one-hot 目標概率和分類標籤在交叉熵損失中的均勻分佈混合。

 

測試準確率提升到了 94.2%(50 次運行的平均值)。而減少了 Epoch 的數量後,訓練 23 個 Epoch 的準確率就達到了 94.1%,但是訓練時間降到了 1 分鐘以下。

CELU 激活函數(52 秒)

研究人員希望優化過程能夠更好,因此他們使用了一個更爲平滑的激活函數,而不是像 ReLU 這樣過渡不夠平滑的函數。這樣可能會幫助模型提升泛化能力.。

在這裏研究人員使用了 CELU(Continuously Differentiable Exponential Linear Unit)作爲平滑的激活函數,而且 PyTorch 有相應的實現。

 

這樣提升了模型的測試準確率,達到了 94.3%。使得模型進一步地減少了 3 個訓練 Epoch,並在 20 個 Epcoh 的時間中(52 秒)達到了 94.1% 的準確率。

「幽靈」批歸一化(46 秒)

批歸一化(BN)似乎在批量大小爲 32 的時候效果最好,而研究者的批大小爲 512。此外,如果不想嚴重影響訓練效果,那麼他們就不能降低批量大小。因此,研究者將批歸一化獨立地應用到各批量數據的子集中。這一技術,就被稱之爲「幽靈」批歸一化,它通常用於分佈式訓練中,但如果單節點運算的批量數據太大,那麼也能用這樣的技術。

該方法在到 20 個 Epoch 能達到 94.2% 的測試準確率。因爲訓練變得更加短,提升學習率對最終的效果應該是有幫助的。如果研究者將最大學習率增大 50%,他們能實現 94.1% 的準確率,且還只需要 18 個 Epoch,這樣訓練時間也降低到了 46 秒。

固定批歸一化的縮放(43 秒)

如果批歸一化的通道縮放尺寸有很大變化,這可能會減少有效的通道數量。讓我們來看看這些參數在訓練中的動態變化:

 

 

這兩張圖展示了很多信息,但比較重要的是縮放尺寸(scale)並沒有太大的變化,這表明它不怎麼學習,很大程度上都是根據權重衰減的控制來更新。因此我們可以嘗試固定這些變量,採用常數 1/4 來代替它,其中 1/4 表示訓練中間點的均值。

最後,研究者根據增加的準確率將 Epoch 數量降低到 17,新的測試準確率還保持在 94.1%。現在,該模型已經超過了排名第二的 BaiduNet9P,它的訓練時間只需要 43 秒。

輸入 patch 白化

控制內層的協方差、利用批歸一化的白化版本可能有所幫助,但需要額外的計算和艱難的實現工作。因此,研究者着眼於輸入層上較爲簡單的問題。

 

17 個 epoch 之後,測試準確率躍升至 94.4%,使得訓練時間可以縮短 2 個 epoch。15 個 epoch 在 39 秒內將準確率提升至 94.1%。

如果進一步將最大學習率提升 50% 左右,同時將裁剪增強從 8×8 降到 5×5,以彌補高學習率帶來的額外正則化,我們可以再縮減一個 epoch,在 36 秒內實現 94.1% 的測試準確率。

指數移動平均操作(34 秒)

爲了提高準確率,研究者每 5 個 batch 更新一次移動平均時間,因爲他們發現,即使更新地更加頻繁,準確率也沒有什麼提升。他們需要選擇一個新的學習率計劃,越接近訓練結束,學習率越高,同時動量參數也會採用指數移動平均操作。

測試準確率提升到了 94.3%,因此可以進一步縮減 epoch。13 個 epoch 訓練使得模型的測試準確率達到了 94.1%,訓練時間低於 34s,比該系列開始時的單 GPU 水平提高了 10 倍。

降低測試時間(26 秒)

前面主要都是降低訓練時間,但最後的測試過程也能做進一步的優化而降低所需時間。這裏,研究者主要應用了測試狀態增強(Test-time augmentation,TTA)。

爲了與當前 DAWNBench 提交數值保持一致,研究者將這一技術限制在僅進行水平翻轉的操作上,並找到了準確率和推斷消耗中間的平衡點。在現有的網絡和 13 個 Epoch 的訓練下,測試準確率達到了 94.6%。

因此研究人員移除了對剩餘數據的增強操作,因爲這是針對訓練而非測試步驟的,因此他們將訓練減少到了 10 個 epoch,而且在 26 秒鐘達到了測試狀態增強準確率——94.1%。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章