面對(duì)數(shù)以億計(jì)的圖片數(shù)據(jù),到底該用什么樣的方法才能快速搞實(shí)驗(yàn)?
這樣的問(wèn)題,或許在做機(jī)器學(xué)習(xí)研究的你,也會(huì)經(jīng)常遇到。
而就在最近,一個(gè)國(guó)外小哥就提出了一種建議:
在 Pytorch lightning 基礎(chǔ)上,讓深度學(xué)習(xí) pipeline 速度提升 10 倍!

用他自己的話來(lái)說(shuō)就是 ——“爬樓時(shí)像給了你一個(gè)電梯”。
這般“酸爽”,到底是如何做到的呢?

優(yōu)化機(jī)器學(xué)習(xí) pipeline,很重要
無(wú)論你是身處學(xué)術(shù)界還是工業(yè)界,時(shí)間和資源等各種因素,往往會(huì)成為你在搞實(shí)驗(yàn)的枷鎖。
尤其是隨著數(shù)據(jù)集規(guī)模和機(jī)器學(xué)習(xí)模型,變得越發(fā)龐大和復(fù)雜,讓實(shí)驗(yàn)變得既費(fèi)時(shí)又耗力。

提速這件事,就變得至關(guān)重要。
例如在 2012 年的時(shí)候,訓(xùn)練一個(gè) AlexNet,要花上 5 到 6 天的時(shí)間。
而現(xiàn)如今,只需要短短幾分鐘就可以在更大的數(shù)據(jù)集上訓(xùn)練更大的圖像模型。
這位小哥認(rèn)為,從某種角度上來(lái)說(shuō),這是得益于各種各樣的“利器”的出現(xiàn)。
例如 Pytorch Lingtning,就是其中一種。
于是,他便“死磕”pipeline,總結(jié)了六種“閃電加速”實(shí)驗(yàn)周期的方法。
并行數(shù)據(jù)加載
數(shù)據(jù)加載和增強(qiáng)(augmentation)往往被認(rèn)為是訓(xùn)練 pipeline 時(shí)的瓶頸之一。
一個(gè)典型的數(shù)據(jù) pipeline 包含以下步驟:
從磁盤(pán)加載數(shù)據(jù)
在運(yùn)行過(guò)程中創(chuàng)建隨機(jī)增強(qiáng)
將每個(gè)樣本分批整理
在這個(gè)過(guò)程中,倒是可以用多個(gè) CPU 進(jìn)程并行加載數(shù)據(jù)來(lái)優(yōu)化。
但與此同時(shí),還可以通過(guò)下面的操作來(lái)加速這一過(guò)程:
1、將 DataLoader 中的 num_workers 參數(shù)設(shè)置為 CPU 的數(shù)量。
2、當(dāng)與 GPU 一起工作時(shí),將 DataLoader 中的 pin_memory 參數(shù)設(shè)置為 True。這可以將數(shù)據(jù)分配到頁(yè)鎖定的內(nèi)存中,從而加快數(shù)據(jù)傳輸?shù)?GPU 的速度。
使用分布式數(shù)據(jù)并行的多 GPU 訓(xùn)練

與 CPU 相比,GPU 已經(jīng)大大加速了訓(xùn)練和推理時(shí)間。
但有沒(méi)有比一個(gè) GPU 更好的方法?或許答案就是:
多個(gè) GPU!
在 PyTorch 中,有幾種范式可以用多個(gè) GPU 訓(xùn)練你的模型。
兩個(gè)比較常見(jiàn)的范式是“DataParallel”和“DistributedDataParallel”。
而小哥采用的方法是后者,因?yàn)樗J(rèn)為這是一種更可擴(kuò)展的方法。
但在 PyTorch(以及其他平臺(tái))中修改訓(xùn)練 pipeline 并非易事。
必須考慮以分布式方式加載數(shù)據(jù)以及權(quán)重、梯度和指標(biāo)的同步等問(wèn)題。
不過(guò),有了 PyTorch Lightning,就可以非常容易地在多個(gè) GPU 上訓(xùn)練 PyTorch 模型,還是幾乎不需要修改代碼的那種!

混合精度
在默認(rèn)情況下,輸入張量以及模型權(quán)重是以單精度(float32)定義的。
然而,某些數(shù)學(xué)運(yùn)算可以用半精度(float16)進(jìn)行。
這樣一來(lái),就可以顯著提升速度,并降低了模型的內(nèi)存帶寬,還不會(huì)犧牲模型的性能。
通過(guò)在 PyTorch Lightning 中設(shè)置混合精度標(biāo)志(flag),它會(huì)在可能的情況下自動(dòng)使用半精度,而在其他地方保留單精度。
通過(guò)最小的代碼修改,模型訓(xùn)練的速度可以提升 1.5 至 2 倍。

早停法
當(dāng)我們訓(xùn)練深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的時(shí)候,通常希望能獲得最好的泛化性能。
但是所有的標(biāo)準(zhǔn)深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),比如全連接多層感知機(jī)都很容易過(guò)擬合。
當(dāng)網(wǎng)絡(luò)在訓(xùn)練集上表現(xiàn)越來(lái)越好,錯(cuò)誤率越來(lái)越低的時(shí)候,實(shí)際上在某一刻,它在測(cè)試集的表現(xiàn)已經(jīng)開(kāi)始變差。
因此,早停法 (Early Stopping)便在訓(xùn)練過(guò)程中加入了進(jìn)來(lái)。
具體來(lái)說(shuō),就是當(dāng)驗(yàn)證損失在預(yù)設(shè)的評(píng)估次數(shù)(在小哥的例子中是 10 次評(píng)估)后停止訓(xùn)練。
這樣一來(lái),不僅防止了過(guò)擬合的現(xiàn)象,而且還可以在幾十個(gè) epoch 內(nèi)找到最佳模型。

Sharded Training
Sharded Training 是基于微軟的 ZeRO 研究和 DeepSpeed 庫(kù)。
它顯著的效果,就是讓訓(xùn)練大模型變得可擴(kuò)展和容易。
否則,這些模型就不適合在單個(gè) GPU 上使用了。
而在 Pytorch Lightning 的 1.2 版本中,便加入了對(duì) Shared Training 的支持。
雖然在小哥的實(shí)驗(yàn)過(guò)程中,并沒(méi)有看到訓(xùn)練時(shí)間或內(nèi)存占用方面有任何改善。
但他認(rèn)為,這種方法在其它實(shí)驗(yàn)中可能會(huì)提供幫助,尤其是在不使用單一 GPU 的大模型方面。

模型評(píng)估和推理中的優(yōu)化
在模型評(píng)估和推理期間,梯度不需要用于模型的前向傳遞。
因此,可以將評(píng)估代碼包裹在一個(gè) torch.no_grad 上下文管理器中。
這可以防止在前向傳遞過(guò)程中的存儲(chǔ)梯度,從而減少內(nèi)存占用。
如此一來(lái),就可以將更大的 batch 送入模型,讓評(píng)估和推理變得更快。
效果如何?
介紹了這么多,你肯定想知道上述這些方法,具體起到了怎樣的作用。
小哥為此做了一張表格,詳解了方法的加速效果。

那么這些方法,是否對(duì)在做機(jī)器學(xué)習(xí)實(shí)驗(yàn)的你有所幫助呢?
快去試試吧~
參考鏈接:
https://devblog.pytorchlightning.ai/how-we-used-pytorch-lightning-to-make-our-deep-learning-pipeline-10x-faster-731bd7ad318a
特別提醒:本網(wǎng)信息來(lái)自于互聯(lián)網(wǎng),目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。本站不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。如若本網(wǎng)有任何內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系我們,本站將會(huì)在24小時(shí)內(nèi)處理完畢。
相關(guān)推薦
- 養(yǎng)AI龍蝦,為什么服務(wù)器選擇關(guān)乎你的數(shù)字主權(quán)
- 按場(chǎng)景選配置,養(yǎng)AI龍蝦不同用途需要什么檔次的服務(wù)器
- 養(yǎng)AI小龍蝦主流云服務(wù)器大比拼,阿里云、騰訊云、華為云怎么選
- 騰訊突然官宣:QQ 可以養(yǎng)小龍蝦了,只需兩步!
- 小白保姆級(jí)教程:不用寫(xiě)代碼在阿里云分鐘級(jí)一鍵部署OpenClaw,打造你的專屬 AI 員工
- 小白保姆級(jí)教程:不用寫(xiě)代碼在阿里云分鐘級(jí)一鍵部署OpenClaw,打造你的專屬 AI 員工
- 不用寫(xiě)代碼一鍵部署OpenClaw最新教程
- 限量秒殺,拼手速!38元搶阿里云輕量應(yīng)用服務(wù)器
站長(zhǎng)資訊網(wǎng)