色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Pytorch深度學習訓練的方法

3D視覺工坊 ? 來源:小白學視覺 ? 2024-10-28 14:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:小白學視覺

掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學習訓練。

近日,Reddit 上一個帖子熱度爆表。主題內容是關于怎樣加速 PyTorch 訓練。原文作者是來自蘇黎世聯邦理工學院的計算機科學碩士生 LORENZ KUHN,文章向我們介紹了在使用 PyTorch 訓練深度模型時最省力、最有效的 17 種方法

該文所提方法,都是假設你在 GPU 環境下訓練模型。具體內容如下。

17 種加速 PyTorch 訓練的方法

1. 考慮換一種學習率 schedule

學習率 schedule 的選擇對模型的收斂速度和泛化能力有很大的影響。Leslie N. Smith 等人在論文《Cyclical Learning Rates for Training Neural Networks》、《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates 》中提出了周期性(Cyclical)學習率以及 1Cycle 學習率 schedule。之后,fast.ai 的 Jeremy Howard 和 Sylvain Gugger 對其進行了推廣。下圖是 1Cycle 學習率 schedule 的圖示:

wKgaoWcfKcSAZDAGAAB3eRqUhvA685.jpg

Sylvain 寫到:1Cycle 包括兩個等長的步幅,一個步幅是從較低的學習率到較高的學習率,另一個是回到最低水平。最大值來自學習率查找器選取的值,較小的值可以低十倍。然后,這個周期的長度應該略小于總的 epochs 數,并且,在訓練的最后階段,我們應該允許學習率比最小值小幾個數量級。

與傳統的學習率 schedule 相比,在最好的情況下,該 schedule 實現了巨大的加速(Smith 稱之為超級收斂)。例如,使用 1Cycle 策略在 ImageNet 數據集上訓練 ResNet-56,訓練迭代次數減少為原來的 1/10,但模型性能仍能比肩原論文中的水平。在常見的體系架構和優化器中,這種 schedule 似乎表現得很好。

Pytorch 已經實現了這兩種方法:「torch.optim.lr_scheduler.CyclicLR」和「torch.optim.lr_scheduler.OneCycleLR」。

2. 在 DataLoader 中使用多個 worker 和頁鎖定內存

當使用 torch.utils.data.DataLoader 時,設置 num_workers > 0,而不是默認值 0,同時設置 pin_memory=True,而不是默認值 False。

參考文檔:https://pytorch.org/docs/stable/data.html

來自 NVIDIA 的高級 CUDA 深度學習算法軟件工程師 Szymon Micacz 就曾使用四個 worker 和頁鎖定內存(pinned memory)在單個 epoch 中實現了 2 倍的加速。人們選擇 worker 數量的經驗法則是將其設置為可用 GPU 數量的四倍,大于或小于這個數都會降低訓練速度。請注意,增加 num_workers 將增加 CPU 內存消耗。

3. 把 batch 調到最大

把 batch 調到最大是一個頗有爭議的觀點。一般來說,如果在 GPU 內存允許的范圍內將 batch 調到最大,你的訓練速度會更快。但是,你也必須調整其他超參數,比如學習率。一個比較好用的經驗是,batch 大小加倍時,學習率也要加倍。

OpenAI 的論文《An Empirical Model of Large-Batch Training》很好地論證了不同的 batch 大小需要多少步才能收斂。在《How to get 4x speedup and better generalization using the right batch size》一文中,作者 Daniel Huynh 使用不同的 batch 大小進行了一些實驗(也使用上面討論的 1Cycle 策略)。最終,他將 batch 大小由 64 增加到 512,實現了 4 倍的加速。

然而,使用大 batch 的不足是,這可能導致解決方案的泛化能力比使用小 batch 的差。

4. 使用自動混合精度(AMP)

PyTorch 1.6 版本包括對 PyTorch 的自動混合精度訓練的本地實現。這里想說的是,與單精度 (FP32) 相比,某些運算在半精度 (FP16) 下運行更快,而不會損失準確率。AMP 會自動決定應該以哪種精度執行哪種運算。這樣既可以加快訓練速度,又可以減少內存占用。

在最好的情況下,AMP 的使用情況如下:

import torch
# Creates once at the beginning of training
scaler = torch.cuda.amp.GradScaler()




for data, label in data_iter:
   optimizer.zero_grad()
   # Casts operations to mixed precision
   with torch.cuda.amp.autocast():
      loss = model(data)


   # Scales the loss, and calls backward()
   # to create scaled gradients
   scaler.scale(loss).backward()


   # Unscales gradients and calls
   # or skips optimizer.step()
   scaler.step(optimizer)


   # Updates the scale for next iteration
   scaler.update()

5. 考慮使用另一種優化器

AdamW 是由 fast.ai 推廣的一種具有權重衰減(而不是 L2 正則化)的 Adam,在 PyTorch 中以 torch.optim.AdamW 實現。AdamW 似乎在誤差和訓練時間上都一直優于 Adam。

Adam 和 AdamW 都能與上面提到的 1Cycle 策略很好地搭配。

目前,還有一些非本地優化器也引起了很大的關注,最突出的是 LARS 和 LAMB。NVIDA 的 APEX 實現了一些常見優化器的融合版本,比如 Adam。與 PyTorch 中的 Adam 實現相比,這種實現避免了與 GPU 內存之間的多次傳遞,速度提高了 5%。

6. cudNN 基準

如果你的模型架構保持不變、輸入大小保持不變,設置 torch.backends.cudnn.benchmark = True。

7. 小心 CPU 和 GPU 之間頻繁的數據傳輸

當頻繁地使用 tensor.cpu() 將張量從 GPU 轉到 CPU(或使用 tensor.cuda() 將張量從 CPU 轉到 GPU)時,代價是非常昂貴的。item() 和 .numpy() 也是一樣可以使用. detach() 代替。

如果你創建了一個新的張量,可以使用關鍵字參數 device=torch.device('cuda:0') 將其分配給 GPU。

如果你需要傳輸數據,可以使用. to(non_blocking=True),只要在傳輸之后沒有同步點。

8. 使用梯度 / 激活 checkpointing

Checkpointing 的工作原理是用計算換內存,并不存儲整個計算圖的所有中間激活用于 backward pass,而是重新計算這些激活。我們可以將其應用于模型的任何部分。

具體來說,在 forward pass 中,function 會以 torch.no_grad() 方式運行,不存儲中間激活。相反的是, forward pass 中會保存輸入元組以及 function 參數。在 backward pass 中,輸入和 function 會被檢索,并再次在 function 上計算 forward pass。然后跟蹤中間激活,使用這些激活值計算梯度。

因此,雖然這可能會略微增加給定 batch 大小的運行時間,但會顯著減少內存占用。這反過來又將允許進一步增加所使用的 batch 大小,從而提高 GPU 的利用率。

盡管 checkpointing 以 torch.utils.checkpoint 方式實現,但仍需要一些思考和努力來正確地實現。Priya Goyal 寫了一個很好的教程來介紹 checkpointing 關鍵方面。

9. 使用梯度積累

增加 batch 大小的另一種方法是在調用 optimizer.step() 之前在多個. backward() 傳遞中累積梯度。

Hugging Face 的 Thomas Wolf 的文章《Training Neural Nets on Larger Batches: Practical Tips for 1-GPU, Multi-GPU & Distributed setups》介紹了如何使用梯度累積。梯度累積可以通過如下方式實現::

model.zero_grad()                                   # Reset gradients tensors
for i, (inputs, labels) in enumerate(training_set):
    predictions = model(inputs)                     # Forward pass
    loss = loss_function(predictions, labels)       # Compute loss function
    loss = loss / accumulation_steps                # Normalize our loss (if averaged)
    loss.backward()                                 # Backward pass
    if (i+1) % accumulation_steps == 0:             # Wait for several backward steps
        optimizer.step()                            # Now we can do an optimizer step
        model.zero_grad()                           # Reset gradients tensors
        if (i+1) % evaluation_steps == 0:           # Evaluate the model when we...
            evaluate_model()                        # ...have no gradients accumulat

這個方法主要是為了規避 GPU 內存的限制而開發的。

10. 使用分布式數據并行進行多 GPU 訓練

加速分布式訓練可能有很多方法,但是簡單的方法是使用 torch.nn.DistributedDataParallel 而不是 torch.nn.DataParallel。這樣一來,每個 GPU 將由一個專用的 CPU 核心驅動,避免了 DataParallel 的 GIL 問題。

11. 設置梯度為 None 而不是 0

梯度設置為. zero_grad(set_to_none=True) 而不是 .zero_grad()。這樣做可以讓內存分配器處理梯度,而不是將它們設置為 0。正如文檔中所說,將梯度設置為 None 會產生適度的加速,但不要期待奇跡出現。注意,這樣做也有缺點,詳細信息請查看文檔。

12. 使用. as_tensor() 而不是. tensor()

torch.tensor() 總是會復制數據。如果你要轉換一個 numpy 數組,使用 torch.as_tensor() 或 torch.from_numpy() 來避免復制數據。

13. 必要時打開調試工具

PyTorch 提供了很多調試工具,例如 autograd.profiler、autograd.grad_check、autograd.anomaly_detection。請確保當你需要調試時再打開調試器,不需要時要及時關掉,因為調試器會降低你的訓練速度。

14. 使用梯度裁剪

關于避免 RNN 中的梯度爆炸的問題,已經有一些實驗和理論證實,梯度裁剪(gradient = min(gradient, threshold))可以加速收斂。HuggingFace 的 Transformer 實現就是一個非常清晰的例子,說明了如何使用梯度裁剪。本文中提到的其他一些方法,如 AMP 也可以用。

在 PyTorch 中可以使用 torch.nn.utils.clip_grad_norm_來實現。

15. 在 BatchNorm 之前關閉 bias

在開始 BatchNormalization 層之前關閉 bias 層。對于一個 2-D 卷積層,可以將 bias 關鍵字設置為 False:torch.nn.Conv2d(..., bias=False, ...)。

16. 在驗證期間關閉梯度計算

在驗證期間關閉梯度計算,設置:torch.no_grad() 。

17. 使用輸入和 batch 歸一化

要再三檢查一下輸入是否歸一化?是否使用了 batch 歸一化?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4934

    瀏覽量

    131047
  • 模型
    +關注

    關注

    1

    文章

    3512

    瀏覽量

    50293
  • 深度學習
    +關注

    關注

    73

    文章

    5558

    瀏覽量

    122707
  • pytorch
    +關注

    關注

    2

    文章

    809

    瀏覽量

    13899

原文標題:這17 種方法讓 PyTorch 訓練速度更快!

文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Pytorch模型訓練實用PDF教程【中文】

    本教程以實際應用、工程開發為目的,著重介紹模型訓練過程中遇到的實際問題和方法。在機器學習模型開發中,主要涉及三大部分,分別是數據、模型和損失函數及優化器。本文也按順序的依次介紹數據、模型和損失函數
    發表于 12-21 09:18

    pytorch訓練出來的模型參數保存為嵌入式C語言能夠調用形式的方法

    深度學習算法嵌入式開發應用中,如何把在pytorch訓練得到的模型參數,提取出來保存成C語言能夠調用的數組形式,是嵌入式應用開發的重要步驟。以下介紹一個簡單的例子,下文中的代碼來自
    發表于 12-15 06:57

    為什么學習深度學習需要使用PyTorch和TensorFlow框架

    如果你需要深度學習模型,那么 PyTorch 和 TensorFlow 都是不錯的選擇。 并非每個回歸或分類問題都需要通過深度學習來解決。
    的頭像 發表于 09-14 10:57 ?3670次閱讀

    基于PyTorch深度學習入門教程之PyTorch的安裝和配置

    神經網絡結構,并且運用各種深度學習算法訓練網絡參數,進而解決各種任務。 本文從PyTorch環境配置開始。PyTorch是一種Python接
    的頭像 發表于 02-16 15:15 ?2852次閱讀

    基于PyTorch深度學習入門教程之PyTorch簡單知識

    計算 Part3:使用PyTorch構建一個神經網絡 Part4:訓練一個神經網絡分類器 Part5:數據并行化 本文是關于Part1的內容。 Part1:PyTorch簡單知識 PyTorc
    的頭像 發表于 02-16 15:20 ?2491次閱讀

    PyTorch教程12.1之優化和深度學習

    電子發燒友網站提供《PyTorch教程12.1之優化和深度學習.pdf》資料免費下載
    發表于 06-05 15:08 ?0次下載
    <b class='flag-5'>PyTorch</b>教程12.1之優化和<b class='flag-5'>深度</b><b class='flag-5'>學習</b>

    深度學習框架pytorch入門與實踐

    深度學習框架pytorch入門與實踐 深度學習是機器學習中的一個分支,它使用多層神經網絡對大量數
    的頭像 發表于 08-17 16:03 ?1910次閱讀

    深度學習框架區分訓練還是推理嗎

    深度學習框架區分訓練還是推理嗎 深度學習框架是一個非常重要的技術,它們能夠加速深度
    的頭像 發表于 08-17 16:03 ?1711次閱讀

    深度學習框架pytorch介紹

    深度學習框架pytorch介紹 PyTorch是由Facebook創建的開源機器學習框架,其中TensorFlow是完全基于數據流圖的。它是
    的頭像 發表于 08-17 16:10 ?2268次閱讀

    視覺深度學習遷移學習訓練框架Torchvision介紹

    Torchvision是基于Pytorch的視覺深度學習遷移學習訓練框架,當前支持的圖像分類、對象檢測、實例分割、語義分割、姿態評估模型的遷
    的頭像 發表于 09-22 09:49 ?1270次閱讀
    視覺<b class='flag-5'>深度</b><b class='flag-5'>學習</b>遷移<b class='flag-5'>學習</b><b class='flag-5'>訓練</b>框架Torchvision介紹

    TensorFlow與PyTorch深度學習框架的比較與選擇

    深度學習作為人工智能領域的一個重要分支,在過去十年中取得了顯著的進展。在構建和訓練深度學習模型的過程中,
    的頭像 發表于 07-02 14:04 ?1644次閱讀

    PyTorch如何訓練自己的數據集

    PyTorch是一個廣泛使用的深度學習框架,它以其靈活性、易用性和強大的動態圖特性而聞名。在訓練深度學習
    的頭像 發表于 07-02 14:09 ?3491次閱讀

    解讀PyTorch模型訓練過程

    PyTorch作為一個開源的機器學習庫,以其動態計算圖、易于使用的API和強大的靈活性,在深度學習領域得到了廣泛的應用。本文將深入解讀PyTorch
    的頭像 發表于 07-03 16:07 ?1860次閱讀

    PyTorch深度學習開發環境搭建指南

    PyTorch作為一種流行的深度學習框架,其開發環境的搭建對于深度學習研究者和開發者來說至關重要。在Windows操作系統上搭建
    的頭像 發表于 07-16 18:29 ?2429次閱讀

    PyTorch GPU 加速訓練模型方法

    深度學習領域,GPU加速訓練模型已經成為提高訓練效率和縮短訓練時間的重要手段。PyTorch
    的頭像 發表于 11-05 17:43 ?1367次閱讀
    主站蜘蛛池模板: 日本双渗透 | 亚洲精品高清中文字幕完整版 | 又黄又猛又爽大片免费 | 美女张开腿让我了一夜 | 免费一区二区三区久久 | 免费看片A级毛片免费看 | 欧美 国产 日产 韩国 在线 | 亚洲一区二区三区乱码在线欧洲 | 欧美xxxxb| 性盈盈剧场 | 国产精品第1页在线观看 | 有人有片的观看免费视频 | 亚洲人成无码久久久AAA片 | 久青草国产在线视频 | 国产亚洲精品久久综合阿香 | 国产XXXXXX农村野外 | 亚洲色视在线观看视频 | 无限好资源免费观看 | 成人高清网站 | 亚洲免费久久 | 中文字幕网站在线观看 | 亚洲精品天堂无码中文字幕影院 | 日本一区精品久久久久影院 | 无码天堂亚洲国产AV久久 | 日韩AV片无码一区二区三区不卡 | 亚洲精品无码专区在线播放 | 乌克兰女人与动ZOZO | 亚洲日本国产综合高清 | 欲香欲色天天天综合和网 | 黄色三级图片 | 午夜片神马影院福利 | 久久99国产亚洲高清观着 | avtt一区 | 国精产品一区一区三区有限公司 | 欧美日韩一区不卡在线观看 | 18国产精品白浆在线观看免费 | 国产69精品久久久久乱码 | 国产乱人精品视频AV麻豆 | 国产精品一库二库三库 | 内射白浆一区二区在线观看 | 欧美最新色p图 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品