選單

深度學習提速10倍!

面對

數以億計

的圖片資料,到底該用什麼樣的方法才能快速搞實驗?

這樣的問題,或許在做機器學習研究的你,也會經常遇到。

而就在最近,一個國外小哥就提出了一種建議:

在Pytorch lightning基礎上,讓深度學習pipeline速度提升

10倍

深度學習提速10倍!

用他自己的話來說就是——“爬樓時像給了你一個電梯”。

這般“酸爽”,到底是如何做到的呢?

深度學習提速10倍!

最佳化機器學習pipeline,很重要

無論你是身處學術界還是工業界,

時間

資源

等各種因素,往往會成為你在搞實驗的

枷鎖

尤其是隨著資料集規模和機器學習模型,變得越發龐大和複雜,讓實驗變得既費時又耗力。

深度學習提速10倍!

提速

這件事,就變得至關重要。

例如在2012年的時候,訓練一個AlexNet,要花上5到6天的時間。

而現如今,只需要短短几分鐘就可以在更大的資料集上訓練更大的影象模型。

這位小哥認為,從某種角度上來說,這是得益於各種各樣的“利器”的出現。

例如

Pytorch Lingtning

,就是其中一種。

於是,他便“死磕”pipeline,總結了六種“閃電加速”實驗週期的方法。

並行資料載入

資料載入和增強(augmentation)往往被認為是訓練pipeline時的瓶頸之一。

一個典型的資料pipeline包含以下步驟:

從磁碟載入資料

在執行過程中建立隨機增強

將每個樣本分批整理

在這個過程中,倒是可以用多個CPU程序並行載入資料來最佳化。

但與此同時,還可以透過下面的操作來加速這一過程:

1、將DataLoader中的num_workers引數設定為CPU的數量。

2、當與GPU一起工作時,將DataLoader中的pin_memory引數設定為True。這可以將資料分配到頁鎖定的記憶體中,從而加快資料傳輸到GPU的速度。

使用分散式資料並行的多GPU訓練

深度學習提速10倍!

與CPU相比,GPU已經大大加速了訓練和推理時間。

但有沒有比一個GPU更好的方法?或許答案就是:

多個GPU!

在PyTorch中,有幾種正規化可以用多個GPU訓練你的模型。

兩個比較常見的正規化是 “DataParallel ”和 “DistributedDataParallel”。

而小哥採用的方法是後者,因為他認為這是一種更可擴充套件的方法。

但在PyTorch(以及其他平臺)中修改訓練pipeline並非易事。

必須考慮以分散式方式載入資料以及權重、梯度和指標的同步等問題。

不過,有了PyTorch Lightning,就可以非常容易地在多個GPU上訓練PyTorch模型,還是幾乎不需要修改程式碼的那種!

混合精度

在預設情況下,輸入張量以及模型權重是以單精度(float32)定義的。

然而,某些數學運算可以用半精度(float16)進行。

這樣一來,就可以顯著提升速度,並降低了模型的記憶體頻寬,還不會犧牲模型的效能。

透過在PyTorch Lightning中設定混合精度標誌(flag),它會在可能的情況下自動使用半精度,而在其他地方保留單精度。

透過最小的程式碼修改,模型訓練的速度可以提升1。5至2倍。

早停法

當我們訓練深度學習神經網路的時候,通常希望能獲得最好的泛化效能。

但是所有的標準深度學習神經網路結構,比如全連線多層感知機都很容易過擬合。

當網路在訓練集上表現越來越好,錯誤率越來越低的時候,實際上在某一刻,它在測試集的表現已經開始變差。

因此,

早停法

(Early Stopping)便在訓練過程中加入了進來。

具體來說,就是當驗證損失在預設的評估次數(在小哥的例子中是10次評估)後停止訓練。

這樣一來,不僅防止了過擬合的現象,而且還可以在幾十個 epoch內找到最佳模型。

Sharded Training

Sharded Training是基於微軟的ZeRO研究和DeepSpeed庫。

它顯著的效果,就是讓訓練大模型變得可擴充套件和容易。

否則,這些模型就不適合在單個GPU上使用了。

而在Pytorch Lightning的1。2版本中,便加入了對Shared Training的支援。

雖然在小哥的實驗過程中,並沒有看到訓練時間或記憶體佔用方面有任何改善。

但他認為,這種方法在其它實驗中可能會提供幫助,尤其是在不使用單一GPU的大模型方面。

模型評估和推理中的最佳化

在模型評估和推理期間,梯度不需要用於模型的前向傳遞。

因此,可以將評估程式碼包裹在一個torch。no_grad上下文管理器中。

這可以防止在前向傳遞過程中的儲存梯度,從而減少記憶體佔用。

如此一來,就可以將更大的batch送入模型,讓評估和推理變得更快。

效果如何?

介紹了這麼多,你肯定想知道上述這些方法,具體起到了怎樣的作用。

小哥為此做了一張表格,詳解了方法的加速效果。

深度學習提速10倍!

那麼這些方法,是否對在做機器學習實驗的你有所幫助呢?

快去試試吧~

參考連結:

https://devblog。pytorchlightning。ai/how-we-used-pytorch-lightning-to-make-our-deep-learning-pipeline-10x-faster-731bd7ad318a