NVIDIA英偉達的Multi-GPU多卡通信框架NCCL

NVIDIA英偉達的Multi-GPU多卡通信框架NCCL

筆者注:NCCL 開源項目地址:https://github.com/NVIDIA/nccl

轉自:https://www.zhihu.com/question/63219175/answer/206697974

NCCL是Nvidia Collective multi-GPU Communication Library的簡稱,它是一個實現多GPU的collective communication通信(all-gather, reduce, broadcast)庫,Nvidia做了很多優化,以在PCIe、Nvlink、InfiniBand上實現較高的通信速度。

下面分別從以下幾個方面來介紹NCCL的特點,包括基本的communication primitive、ring-base collectives、NCCL在單機多卡上以及多機多卡實現、最后分享實際使用NCCL的一些經驗。

communication primitive

并行任務的通信一般可以分為Point-to-point communication和Collective communication。P2P通信這種模式只有一個sender和一個receiver,實現起來比較簡單。第二種Collective communication包含多個sender多個receiver,一般的通信原語包括broadcast, gather, all-gather, scatter, reduce, all-reduce, reduce-scatter, all-to-all等。簡單介紹幾個常用的操作:

Reduce:從多個sender那里接收數據,最終combine到一個節點上。

在這里插入圖片描述

All-reduce:從多個sender那里接收數據,最終combine到每一個節點上。

在這里插入圖片描述

而傳統Collective communication假設通信節點組成的topology是一顆fat tree,如下圖所示,這樣通信效率最高。但實際的通信topology可能比較復雜,并不是一個fat tree。因此一般用ring-based Collective communication。

在這里插入圖片描述

ring-base collectives

ring-base collectives將所有的通信節點通過首尾連接形成一個單向環,數據在環上依次傳輸。以broadcast為例, 假設有4個GPU,GPU0為sender將信息發送給剩下的GPU,按照環的方式依次傳輸,GPU0–>GPU1–>GPU2–>GPU3,若數據量為N,帶寬為B,整個傳輸時間為(K-1)N/B。時間隨著節點數線性增長,不是很高效。

在這里插入圖片描述

下面把要傳輸的數據分成S份,每次只傳N/S的數據量,傳輸過程如下所示:

在這里插入圖片描述

GPU1接收到GPU0的一份數據后,也接著傳到環的下個節點,這樣以此類推,最后花的時間為 S*(N/S/B) + (k-2)*(N/S/B) = N(S+K-2)/(SB) --> N/B,條件是S遠大于K,即數據的份數大于節點數,這個很容易滿足。所以通信時間不隨節點數的增加而增加,只和數據總量以及帶寬有關。其它通信操作比如reduce、gather以此類推。

那么在以GPU為通信節點的場景下,怎么構建通信環呢?如下圖所示:

單機4卡通過同一個PCIe switch掛載在一棵CPU的場景:

在這里插入圖片描述

單機8卡通過兩個CPU下不同的PCIe switch掛載的場景:

在這里插入圖片描述

NCCL實現

NCCL實現成CUDA C++ kernels,包含3種primitive operations: Copy,Reduce,ReduceAndCopy。目前NCCL 1.0版本只支持單機多卡,卡之間通過PCIe、NVlink、GPU Direct P2P來通信。NCCL 2.0會支持多機多卡,多機間通過Sockets (Ethernet)或者InfiniBand with GPU Direct RDMA通信。

下圖所示,單機內多卡通過PCIe以及CPU socket通信,多機通過InfiniBand通信。

在這里插入圖片描述

同樣,在多機多卡內部,也要構成一個通信環

在這里插入圖片描述

下面是單機 4卡(Maxwel GPU)上各個操作隨著通信量增加的帶寬速度變化,可以看到帶寬上限能達到10GB/s,接近PCIe的帶寬。

在這里插入圖片描述

下圖是Allreduce在單機不同架構下的速度比較:

在這里插入圖片描述

先不看DGX-1架構,這是Nvidia推出的深度學習平臺,帶寬能達到60GB/s。前面三個是單機多卡典型的三種連接方式,第三種是四張卡都在一個PCIe switch上,所以帶寬較高,能達到>10GB/s PCIe的帶寬大小,第二種是兩個GPU通過switch相連后再經過CPU連接,速度會稍微低一點,第一種是兩個GPU通過CPU然后通過QPI和另一個CPU上的兩塊卡相連,因此速度最慢,但也能達到>5GB/s。

下圖是Allreduce多機下的速度表現,左圖兩機8卡,機內PCIe,機間InfiniBand能達到>10GB/s的速度,InfiniBand基本上能達到機內的通信速度。

在這里插入圖片描述

下圖是NCCL在CNTK ResNet50上的scalability,32卡基本能達到線性加速比。

在這里插入圖片描述

我們的實測實驗

首先,在一臺K40 GPU的機器上測試了GPU的連接拓撲(筆者注:可在命令行通過nvidia-smi topo --matrix查看),如下:

在這里插入圖片描述

可以看到前四卡和后四卡分別通過不同的CPU組連接,GPU0和GPU1直接通過PCIe switch相連,然后經過CPU與GPU2和GPU3相連。

下面是測試PCIe的帶寬,可以看到GPU0和GU1通信能達到10.59GB/s,GPU0同GPU2~3通信由于要經過CPU,速度稍慢,和GPU4~7的通信需要經過QPI,所以又慢了一點,但也能達到9.15GB/s。

在這里插入圖片描述

而通過NVlink連接的GPU通信速度能達到35GB/s:

在這里插入圖片描述

NCCL在不同的深度學習框架(CNTK/Tensorflow/Torch/Theano/Caffe)中,由于不同的模型大小,計算的batch size大小,會有不同的表現。比如上圖中CNTK中Resnet50能達到32卡線性加速比,Facebook之前能一小時訓練出ImageNet,而在NMT任務中,可能不會有這么大的加速比。因為影響并行計算效率的因素主要有并行任務數、每個任務的計算量以及通信時間。我們不僅要看絕對的通信量,也要看通信和計算能不能同時進行以及計算/通信比,如果通信占計算的比重越小,那么并行計算的任務會越高效。NMT模型一般較大,多大幾十M上百M,不像現在image的模型能做到幾M大小,通信所占比重會較高。

下面是NMT模型單機多卡加速的一個簡單對比圖:

在這里插入圖片描述

以上就是對NCCL的一些理解,很多資料也是來自于NCCL的官方文檔,歡迎交流討論。

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

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

相關文章

C語言n個坐標點間的最大距離,c語言已知兩點坐標,求另一點到穿過這兩點的直線最短距離。...

c語言已知兩點坐標,求另一點到穿過這兩點的直線最短距離。以下文字資料是由(歷史新知網www.lishixinzhi.com)小編為大家搜集整理后發布的內容,讓我們趕快一起來看一下吧!c語言已知兩點坐標,求另一點到穿過這兩點的直線最短距離。#…

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

[分布式訓練] 單機多卡的正確打開方式:理論基礎 轉自:https://fyubang.com/2019/07/08/distributed-training/ 瓦礫由于最近bert-large用的比較多,踩了很多分布式訓練的坑,加上在TensorFlow和PyTorch之間更換,算是熟…

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)描述了一種…