[分布式訓練] 單機多卡的正確打開方式:理論基礎

[分布式訓練] 單機多卡的正確打開方式:理論基礎

轉自:https://fyubang.com/2019/07/08/distributed-training/

瓦礫由于最近bert-large用的比較多,踩了很多分布式訓練的坑,加上在TensorFlow和PyTorch之間更換,算是熟悉了一下各類框架的分布式訓練接口,由于集中在一起講可能比較亂,筆者準備分三到四篇來講一下深度學習的分布式訓練。這一篇先講一下“分布式訓練的類型與算法”。

分布式訓練的需求和重要性不需要多說,隨著GPT、BERT、xlnet這些預訓練模型的出現,普通的16G的顯存已經不足以支撐深度學習模型訓練的要求了,這時候就需要用到分布式訓練來提高效率。

注意:這個系列主要介紹單機多卡的分布式訓練情況(這種情況比較常見,土豪和大佬們請忽略)。

總的來說,分布式訓練分為這幾類:

  • 按照并行方式來分:模型并行 vs 數據并行
  • 按照更新方式來分:同步更新 vs 異步更新
  • 按照算法來分:Parameter Server算法 vs AllReduce算法

模型并行 vs. 數據并行

假設我們有n張GPU:

  • 模型并行:不同的GPU輸入相同的數據,運行模型的不同部分,比如多層網絡的不同層。
  • 數據并行:不同的GPU輸入不同的數據,運行相同的完整模型。

在這里插入圖片描述

當模型非常大,一張GPU已經存不下的時候,可以使用模型并行,把模型的不同部分交給不同的機器負責,但是這樣會帶來很大的通信開銷,而且模型并行各個部分存在一定的依賴,規模伸縮性差。因此,通常一張可以放下一個模型的時候,會采用數據并行的方式,各部分獨立,伸縮性好。

同步更新 vs. 異步更新

對于數據并行來說,由于每個GPU負責一部分數據,那就涉及到如果更新參數的問題,分為同步更新和異步更新兩種方式。

  • 同步更新:每個batch所有GPU計算完成后,再統一計算新權值,然后所有GPU同步新值后,再進行下一輪計算。
  • 異步更新:每個GPU計算完梯度后,無需等待其他更新,立即更新整體權值并同步。

在這里插入圖片描述

在這里插入圖片描述

同步更新有等待,速度取決于最慢的那個GPU;異步更新沒有等待,但是涉及到更復雜的梯度過時,loss下降抖動大的問題。所以實踐中,一般使用同步更新的方式。

Parameter Server算法 vs. Ring AllReduce算法

這里講一下常用的兩種參數同步的算法:PS 和 Ring AllReduce。

假設有5張GPU:

  • Parameter Server:GPU 0將數據分成五份分到各個卡上,每張卡負責自己的那一份mini-batch的訓練,得到grad后,返回給GPU 0上做累積,得到更新的權重參數后,再分發給各個卡。
  • Ring AllReduce:5張以環形相連,每張卡都有左手卡和右手卡,一個負責接收,一個負責發送,循環4次完成梯度累積,再循環4次做參數同步。分為Scatter Reduce和All Gather兩個環節。

Parameter Server算法

在這里插入圖片描述

Parameter Server的思想其實有點類似于MapReduce,以上講同步異步的時候,都是用的這種算法,但是它存在兩個缺點:

  1. 每一輪的訓練迭代都需要所有卡都將數據同步完做一次Reduce才算結束,并行的卡很多的時候,木桶效應就會很嚴重,計算效率低。
  2. 所有的GPU卡需要和Reducer進行數據、梯度和參數的通信,當模型較大或者數據較大的時候,通信開銷很大。

假設有NNN個GPU,通信一次完整的參數所需時間為KKK,那么使用PS架構,花費的通信成本為:
T=2(N?1)KT=2(N-1)K T=2(N?1)K
所以我們亟需一種新的算法來提高深度學習模型訓練的并行效率。

Ring AllReduce算法

2017 年 Facebook 發布了《Accurate, large minibatch SGD: Training ImageNet in 1 hour 》驗證了大數據并行的高效性,同年百度發表了《Bringing HPC techniques to deep learning 》,驗證了全新的梯度同步和權值更新算法的可行性,并提出了一種利用帶寬優化環解決通信問題的方法——Ring AllReduce。

在這里插入圖片描述

Parameter Service最大的問題就是通信成本和GPU的數量線性相關。而Ring AllReduce的通信成本與GPU數量無關。Ring AllReduce分為兩個步驟:Scatter Reduce和All Gather。

Scatter Reduce過程:首先,我們將參數分為N份,相鄰的GPU傳遞不同的參數,在傳遞N-1次之后,可以得到每一份參數的累積(在不同的GPU上)。

在這里插入圖片描述

All Gather:得到每一份參數的累積之后,再做一次傳遞,同步到所有的GPU上。

在這里插入圖片描述

根據這兩個過程,我們可以計算到All Reduce的通信成本為:
T=2(N?1)KNT=2(N-1)\frac{K}{N} T=2(N?1)NK?
可以看到通信成本T與GPU數量無關。

由于All Reduce算法在通信成本上的優勢,現在幾個框架基本上都實現了其對于的官方API,后面幾篇,瓦礫會跟大家一起過一遍TF,Torch的分布式訓練API具體是怎么用的,有哪些坑。

Reference

  1. 是時候放棄Tensorflow,擁抱Horovod了
  2. Tensorflow單機多卡實現
  3. Binging HPC Techniques to Deep Learning
  4. Training Neural Nets on Larger Batches: Practical Tips for 1-GPU, Multi-GPU & Distributed setups

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532787.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532787.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532787.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

s3c2416開發板 linux,S3C2416移植內核Linux3.1的wm9713聲卡過程

移植內核的聲卡驅動。原因沒有聲卡驅動,WM9713聲卡驅動移植(原來的內核有UDA1341聲卡驅動,我們再次基礎上直接修改)1、直接復制內核得到三個文件:s3c2416_wm9713.c , wm9713.c , s3c2416_ac97.c.linux-3.1\sound\soc\codecs\Wm9713.c---->wm9713.c;li…

Linux查看文件內容命令:cat, tail, head, more, less

Linux查看文件內容命令:cat, tail, head, more, less cat 直接顯示整個文件。 cat直接顯示全部文件內容,沒有換頁等交互。 cat filenamemore more命令,功能類似 cat ,cat命令是整個文件的內容從上到下顯示在屏幕上。 more會…

linux查看隊列 msg,linux第10天 msg消息隊列

cat /proc/sys/kernel/msgmax最大消息長度限制cat /proc/sys/kernel/msgmnb消息隊列總的字節數cat /proc/sys/kernel/msgmni消息條目數消息隊列綜合案例//server#include #include #include #include #include #include #include #include #define ERR_EXIT(m)do{perror(m);}wh…

Linux中 C++ main函數參數argc和argv含義及用法

Linux中 C main函數參數argc和argv含義及用法 簡介 argc 是 argument count的縮寫,表示傳入main函數的參數個數; argv 是 argument vector的縮寫,表示傳入main函數的參數序列或指針,并且第一個參數argv[0]一定是程序的名稱&…

c語言六位搶答器課程設計,51單片機八路搶答器課程設計

;說明:本人的這個設計改進后解決了前一個版本中1號搶答優先的問題,并增加了錦囊的設置,當參賽選手在回答問題時要求使用錦囊,則主持人按下搶答開始鍵,計時重新開始。;八路搶答器電路請看下圖是用ps仿真的,已…

ELF文件詳解—初步認識

ELF文件詳解—初步認識 轉自:https://blog.csdn.net/daide2012/article/details/73065204 一、 引言 在講解ELF文件格式之前,我們來回顧一下,一個用C語言編寫的高級語言程序是從編寫到打包、再到編譯執行的基本過程,我們知道在C…

埃及分數問題c語言,埃及分數問題(轉)

今日,小雨和小明來到網絡中心,繼續與劉老師討論“數的認識”問題。劉老師說:“還有一種‘埃及分數’需要認識。這是一類分裂分數的思維題,對思維能力的訓練很有價值。”小明說:“有意思,愿洗耳恭聽。”劉老…

linux常用命令--開發調試篇

前言 Linux常用命令中有一些命令可以在開發或調試過程中起到很好的幫助作用,有些可以幫助了解或優化我們的程序,有些可以幫我們定位疑難問題。本文將簡單介紹一下這些命令。 轉自:https://www.yanbinghu.com/2018/09/26/61877.html 示例程序…

簡單有趣的c語言小程序,一個有趣的小程序

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓源碼:#include #include #include #include #include HINSTANCE g_hInstance 0;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nSh…

linux下ora 01110,ORA-01003ORA-01110

Oracle 9i數據庫登錄時,提示ORA-01003&ORA-01110,大概意思是數據文件存儲介質損壞。startup nomount,正常;alter database mount,也正常;alter database open,提示如下:alter database open*ERROR 位于第 1 行:ORA…

x11轉發:通過ssh遠程使用GUI程序

x11轉發:通過ssh遠程使用GUI程序 我們常常使用ssh服務遠程操控服務器,大多數操作我們都可以通過命令行命令來實現。 ssh遠程無法查看GUI程序 現在,筆者在x11-test目錄下放入一張圖片test.jpg,并通過opnencv-python寫一個簡單的…

操作系統引導詳細過程

操作系統引導詳細過程 轉自:https://blog.csdn.net/lijie45655/article/details/89366372 就直觀而言,我們所見到計算機啟動的過程是:按下電腦開機鍵,系統在黑色的屏幕下打印出一些英文語句、然后進入進度條狀態,最后…

android 自定義透明 等待 dialog,Android自定義Dialog內部透明、外部遮罩效果

Android自定義Dialog內部透明、外部遮罩效果發布時間:2020-09-09 03:01:41來源:腳本之家閱讀:117作者:zst1303939801本文實例為大家分享了Android自定義Dialog遮罩效果的具體代碼,供大家參考,具體內容如下圖…

對比損失的PyTorch實現詳解

對比損失的PyTorch實現詳解 本文以SiT代碼中對比損失的實現為例作介紹。 論文:https://arxiv.org/abs/2104.03602 代碼:https://github.com/Sara-Ahmed/SiT 對比損失簡介 作為一種經典的自監督損失,對比損失就是對一張原圖像做不同的圖像…

android 融云瀏覽大圖,融云 Android sdk kit 頭像昵稱更新機制

先申明筆者的實現方式不是唯一 也不一定是最優化的方案 如果您看到此篇博文 有不同看法 或者 更好的優化 更高的效率 歡迎在評論發表意見 融云官網點我融云頭像機制相關視頻詳解首先跟大家說一下 kit 跟 lib 的頭像機制 kit 是已經包含融云已經給開發者定制好的界面 諸如 會話界…

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one.

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. 報錯信息 報錯信息: RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates tha…

android訪問重定向地址,如何從android中重定向url加載圖像(示例代碼)

嗨,我正面臨這個問題我從RESTCall獲取了一個URL網址是http://hck.re/kWWxUI但是當我在瀏覽器中檢查時,它會重定向到https://s3-ap-southeast-1.amazonaws.com/he-public-data/afreen2ac5a33.jpg如何將此圖像加載到我的imageView中我已經知道如何將畢加索…

Linux中的awk、sed、grep及正則表達式詳解

Linux中的awk、sed、grep及正則表達式詳解 簡介 awk、sed和grep是Linux中文本操作的三大利器。 其中awk適用于取列,sed適用于取行,grep適用于過濾。 正則表達式 首先我們來介紹一下正則表達式,正則表達式(regular expression)描述了一種…

android聚焦時如何給控件加邊框,edittext設置獲得焦點時的邊框顏色

第一步:為了更好的比較,準備兩個一模一樣的EditText(當Activity啟動時,焦點會在第一個EditText上,如果你不希望這樣只需要寫一個高度和寬帶為0的EditText即可避免,這里就不這么做了),代碼如下:a…

gcc參數 -i, -L, -l, -include

gcc參數 -i, -L, -l, -include -i,-L,-l,-include -l和-L -l參數就是用來指定程序要鏈接的庫,-l參數緊接著就是庫名,那么庫名跟真正的庫文件名有什么關系呢?就拿數學庫來說,他的庫名是m&…