用上Pytorch Lightning的這六招,深度學習pipeline提速10倍!

2022-01-06 量子位
金磊 發自 凹非寺
量子位 報導 | 公眾號 QbitAI

面對數以億計的圖片數據,到底該用什麼樣的方法才能快速搞實驗?

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

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

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

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

這般「酸爽」,到底是如何做到的呢?

優化機器學習pipeline,很重要

無論你是身處學術界還是工業界,時間資源等各種因素,往往會成為你在搞實驗的枷鎖

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

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

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

而現如今,只需要短短幾分鐘就可以在更大的數據集上訓練更大的圖像模型。

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

例如Pytorch Lingtning,就是其中一種。

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

並行數據加載

數據加載和增強(augmentation)往往被認為是訓練pipeline時的瓶頸之一。

一個典型的數據pipeline包含以下步驟:

從磁碟加載數據

在運行過程中創建隨機增強

將每個樣本分批整理

在這個過程中,倒是可以用多個CPU進程並行加載數據來優化。

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

1、將DataLoader中的num_workers參數設置為CPU的數量。

2、當與GPU一起工作時,將DataLoader中的pin_memory參數設置為True。這可以將數據分配到頁鎖定的內存中,從而加快數據傳輸到GPU的速度。

使用分布式數據並行的多GPU訓練

與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送入模型,讓評估和推理變得更快。

效果如何?

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

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

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

快去試試吧~

參考連結:

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

本文系網易新聞•網易號特色內容激勵計劃籤約帳號【量子位】原創內容,未經帳號授權,禁止隨意轉載。

點這裡👇關注我,記得標星哦~

一鍵三連「分享」、「點讚」和「在看」

科技前沿進展日日相見~

相關焦點

  • 使用 PyTorch Lightning 將深度學習管道速度提高 10 倍
    ,主要包括有為什麼優化深度學習管道很重要、使用 PyTorch Lightning 加快實驗周期的六種方法、以及實驗總結。使用 PyTorch Lightning 加快實驗周期的六種方法優化深度學習管道的六種方法:混合精度訓練(Mixed precision training)模型評估和推理期間的優化對於每一種方法,我們都會簡要解釋它的工作原理
  • 使用PyTorch Lightning自動訓練你的深度神經網絡
    在我使用PyTorch之前,我使用Keras作為我的深度學習框架,但後來我開始切換到PyTorch,原因有幾個。如果你想知道我的原因,看看下面這篇文章:https://medium.com/swlh/why-i-switch-from-keras-to-pytorch-e48922f5846。
  • 用Pytorch Lightning重構代碼速度更慢,修復後速度倍增
    兩周前,我將一些深度學習代碼重構為 Pytorch Lightning,預計大約有 1.5 倍的加速。然而,訓練、評估和測試任務的速度卻降為原來的 1/4。重構之後的神經網絡需要運行幾天才能得出結果,因此我想找出原因,並儘可能地減少訓練時間。事情是這樣的,我使用的是一些開源深度學習代碼,這些代碼是用來展示某些機器學習任務最新架構的。然而這些代碼本身既不整潔也沒進行優化。
  • PyTorch Lightning:專門為機器學習研究者開發的PyTorch輕量 wrapper
    這是一個如何將研究代碼重構為LightningModule的示例(https://pytorch-lightning.readthedocs.io/en/latest/lightning-module.html)。
  • PyTorch Lightning工具學習
    source activate you_envpip install pytorch-lightning或者直接用pip安裝:pip install pytorch-lightning這部分參考了https://zhuanlan.zhihu.com/p/120331610 和 官方文檔 https://pytorch-lightning.readthedocs.io/en/latest/trainer.html在這個模塊中,將PyTorch代碼按照五個部分進行組織
  • PyTorch Lightning 工具學習
    LightningModule生命周期這部分參考了https://zhuanlan.zhihu.com/p/120331610 和 官方文檔 https://pytorch-lightning.readthedocs.io/en/latest/trainer.html在這個模塊中,將PyTorch代碼按照五個部分進行組織:Computations
  • 【他山之石】pytorch_lightning 全程筆記
    「他山之石,可以攻玉」,站在巨人的肩膀才能看得更高,走得更遠。
  • 深度學習大講堂之pytorch入門
    ,他們也一直在支持一些開源的深度學習框架,有 TensorFlow 、Pytorch、Caffe、Theano、Keras等。這其中,TensorFlow和Pytorch佔據了深度學習的半壁江山。今天小天就帶大家從數據操作、自動求梯度和神經網絡設計的pytorch版本三個方面來入門pytorch。
  • 像 Keras 一樣優雅地使用 pytorch-lightning
    本篇文章為大家介紹一個可以幫助大家優雅地進行深度學習研究的工具:pytorch-lightning。公眾號後臺回復關鍵字:源碼,獲取本文原始碼!pytorch-lightning 是建立在pytorch之上的高層次模型接口,pytorch-lightning之於pytorch,就如同keras之於tensorflow。關於pytorch-lightning的完整入門介紹,可以參考我的另外一篇文章。
  • 詳解:深度學習框架數據Pipeline設計
    金雪鋒:AI框架中數據處理的挑戰與解決思路https://zhuanlan.zhihu.com/p/352487023一、AI框架中的數據處理深度學習框架核心三大件事:數據,計算和通信。這是tensorflow和mindspore這類框架的算子抽象模式。在pytorch中,更多是以單個數據為粒度的處理算子。batch:數據的batch邏輯處理。
  • 【他山之石】Ray和Pytorch Lightning 使用指北
    地址:https://www.zhihu.com/people/chea-simhttps://docs.ray.io/en/master/tune/tutorials/tune-pytorch-lightning.html本文默認已對pytorch lightning較為熟悉。
  • 【他山之石】Pytorch Lightning 完全攻略
    地址:https://zhuanlan.zhihu.com/p/353985363GitHub:https://github.com/miracleyooPytorch-Lightning這個庫我「發現」過兩次。第一次發現時,感覺它很重很難學,而且似乎自己也用不上。
  • PyTorch Lightning 1.0 正式發布!從0到1,有這9大特點
    想要雲上縮放模型的極速方案嗎?請繼續閱讀。AI 研究的發展速度遠遠超過任何單一框架所能跟上的速度。深度學習的領域不斷發展,主要是在複雜性和規模。Lightning 提供了一個為複雜模型交互世界設計的用戶體驗,同時抽象出所有令人分心的工程細節,如多 GPU 和多 TPU 訓練,early stopping,日誌等.像 PyTorch 這樣的框架是為 AI 研究主要關注網絡架構的時代而設計的。
  • 實操教程|Pytorch-lightning的使用
    Pytorch-lightning(以下簡稱pl)可以非常簡潔得構建深度學習代碼。但是其實大部分人用不到很多複雜得功能。而pl有時候包裝得過於深了,用的時候稍微有一些不靈活。通常來說,在你的模型搭建好之後,大部分的功能都會被封裝在一個叫trainer的類裡面。
  • PyTorch提速四倍!提高DALI利用率,創建基於CPU的Pipeline
    大數據文摘出品來源:medium編譯:趙吉克在過去的幾年裡,深度學習硬體方面取得了巨大的進步,Nvidia的最新產品Tesla V100和Geforce RTX特別值得一提的是,V100有足夠的能力以每秒數千張圖的速度訓練神經網絡,這使得基於ImageNet數據集小模型在單GPU上訓練只需幾小時,與2012年在ImageNet上訓練AlexNet模型所花費的5天時間相比簡直是天壤之別!然而,強大的GPU使數據預處理管道不堪重負。
  • 超參搜索調優【Ray】與模型設計工具【Pytorch Lightning 】詳解
    一般我們寫深度學習任務的代碼有三個步驟:進行數據預處理,比如清洗數據,數據增強等等。對於NLP任務就是進行分詞,將文本輸入轉化為計算機能夠理解的向量格式。模型選擇,選擇合適的模型,使用Pytorch框架的話就是繼承一個nn.module類。模型訓練,使用各種花裡胡哨的訓練方式,比如分布式,半精度,各種優化器輪著來。而這部分往往是論文不太涉及的部分,也是我們一般稱為dirty work的部分。
  • PyTorch深度學習模型訓練加速指南2021
    比如說,你正在PyTorch中訓練一個深度學習模型。你能做些什麼讓你的訓練更快結束?在這篇文章中,我將概述一些在PyTorch中加速深度學習模型訓練時改動最小,影響最大的方法。對於每種方法,我會簡要總結其思想,並估算預期的加速度,並討論一些限制。我將著重於傳達最重要的部分,並為每個部分給出額外的一些資源。
  • PyTorch數據Pipeline標準化代碼模板
    PyTorch作為一款流行深度學習框架其熱度大有超越TensorFlow的感覺。根據此前的統計,目前TensorFlow雖然仍然佔據著工業界,但PyTorch在視覺和NLP領域的頂級會議上已呈一統之勢。
  • 讓PyTorch更輕便,這款深度學習框架你值得擁有!在GitHub上斬獲6.6k星
    這裡的研究代碼指的是特定系統及其訓練方式,比如GAN、VAE,這類的代碼將由LightningModule直接抽象出來。我們以MNIST生成為例。l1 = nn.Linear(...)l2 = nn.Linear(...)
  • 具有PyTorch Lightning的TensorBoard
    因此,數據可視化在使我們的直覺提供更快,更準確的解決方案方面變得極為有用。實際上,數據科學和機器學習日復一日地利用它幾乎所有的機器學習愛好者都可以使用可視化工具。我們用它來基於精度曲線的模型調試根據PR曲線測試模型的魯棒性分析基於學習收斂的損失曲線使用混淆矩陣 描述模型性能這篇文章涵蓋了什麼我們內心深處知道,我們需要可視化工具來補充我們的開發。一種方法是使用matplotlib或任何其他圖形庫為每個製作的圖形製作自己的小片段。或者我們可以使用TensorBoard的可視化工具包。