萬字長文詳解 InfiniBan
GPU 在高性能計算和深度學習加速中扮演着非常重要的角色, GPU 的強大的並行計算能力,大大提升了運算性能。隨着運算數據量的不斷攀升,GPU 間需要大量的交換數據,因此,GPU 通信性能成爲了非常重要的指標。
在 AI 集羣中進行分佈式訓練時,通信是必要環節,同時也是相比於單機訓練而言多出來的系統開銷。通信與計算的時間比例往往決定了分佈式機器學習系統加速比的上限。
因此,分佈式機器學習的關鍵是設計通信機制,從而降低通信與計算的時間比例,更加高效地訓練出高精度模型。
下面給大家介紹 AI 集羣通信的軟硬件、NCLL 集合通信庫、InfiniBand 網絡通信技術協議、AI 集羣和 AI 框架中對於 InfiniBand 的應用。
通信硬件
通信硬件的實現方式
通信的實現方式分爲兩種類型:機器內通信與機器間通信。
機器內通信:
-
共享內存(QPI/UPI),比如:CPU 與 CPU 之間的通信可以通過共享內存。
-
PCIe,通常是 CPU 與 GPU 之間的通信。
-
NVLink,通常是 GPU 與 GPU 之間的通信,也可以用於 CPU 與 GPU 之間的通信。
機器間通信:
-
TCP/IP 網絡協議。
-
RDMA (Remote Direct Memory Access) 網絡協議。
-
InfiniBand
-
iWARP
-
RoCE
PCIe
PCI-Express(peripheral component interconnect express),簡稱 PCIe,是一種高速串行計算機擴展總線標準,主要用於擴充計算機系統總線數據吞吐量以及提高設備通信速度。
PCIE 本質上是一種全雙工的的連接總線,傳輸數據量的大小由通道數(lane,信道)決定的。
通常,1 個連接通道 lane 稱爲 X1,每個通道 lane 由兩對數據線組成,一對發送,一對接收,每對數據線包含兩根差分線。即 X1 只有 1 個 lane,4 根數據線,每個時鐘每個方向 1bit 數據傳輸。依此類推,X2 就有 2 個 lane,由 8 根數據線組成,每個時鐘傳輸 2bit。類似的還有 X12、X16、X32。
2003 年 PCIe 1.0 正式發佈,可支持每通道傳輸速率爲 250MB/s,總傳輸速率爲 2.5 GT/s。
2007 年推出 PCIe 2.0 規範。在 PCIe 1.0 的基礎上將總傳輸速率提高了一倍,達到 5 GT/s,每通道傳輸速率從 250 MB/s 上升至 500 MB/s。
2022 年 PCIe 6.0 規範正式發佈,總傳輸速率提高至 64 GT/s。
2022 年 6 月,PCI-SIG 聯盟宣佈 PCIe 7.0 版規範,單條通道(x1)單向可實現 128 GT/s 傳輸速率,計劃於 2025 年推出最終版本。
PCIe 吞吐量 (可用帶寬) 計算方法:
吞吐量=傳輸速率*編碼方案
傳輸速率爲每秒傳輸量(GT/s),而不是每秒位數(Gbps),是因爲傳輸量包括不提供額外吞吐量的開銷位,比如:PCIe 1x 和 PCIe 2x 使用 8b/10b 編碼方案,導致佔用了 20%(=2/10) 的原始信道帶寬。
-
GT/s,Giga transtion per second (千兆傳輸 / 秒),即每一秒內傳輸的次數,重點在於描述物理層通信協議的速率屬性,可以不和鏈路寬度等關聯。
-
Gbps,Giga Bits per second (千兆位 / 秒)。GT/s 和 Gbps 之間不存在成比例的換算關係。
PCIe 2.0 協議支持 5.0GT/s,即每一條 Lane 上支持每秒鐘傳輸 5G 個 Bit,但這並不意味着 PCIe 2.0 協議的每一條 Lane 支持 5Gbps 的速率。爲什麼這麼說呢,因爲 PCIe 2.0 的物理層協議中使用的是 8b/10b 編碼方案,即每傳輸 8 個 Bit,需要發送 10 個 Bit,這多出來的 2Bit 並不是對上層有意義的信息。那麼,PCIe 2.0 協議的每一條 Lane 支持5*8/10=4Gbps=500MB/s
的速率。以一個 PCIe 2.0 x8 的通道爲例,x8 的可用帶寬爲4*8=32Gbps=4GB/s
。
同理,PCIe 3.0 協議支持 8.0GT/s,即每一條 Lane 上支持每秒鐘傳輸 8G 個 Bit。而 PCIe 3.0 的物理層協議中使用的是 128b/130b 編碼方案,即每傳輸 128 個 Bit,需要發送 130 個 Bit,那麼,PCIe 3.0 協議的每一條 Lane 支持8*128/130=7.877GB/s=984.6MB/s
的速率。以一個 PCIe 3.0 x16 的通道爲例,x16 的可用帶寬爲7.877*16=126.032 Gbps=15.754GB/s
。
PCIE 體系架構:
PCIE 體系架構一般包含根組件 RC(root-complex),交換器 switch,終端設備 EP(endpoint)等類型的 PCIE 設備組成。RC 在總線架構中只有一個,用於處理器和內存子系統與 I/O 設備之間的連接,而 switch 的功能通常是以軟件形式提供的,它包括兩個或更多的邏輯 PCI 到 PCI 的連接橋(PCI-PCI Bridge),以保持與現有 PCI 兼容。
NVLink
背景:
算力的提升不僅依靠單張 GPU 卡的性能提升,往往還需要多 GPU 卡組合。在多 GPU 系統內部,GPU 間通信的帶寬通常在數百 GB/s 以上,PCIe 總線的數據傳輸速率容易成爲瓶頸,且 PCIe 鏈路接口的串並轉換會產生較大延時,影響 GPU 並行計算的效率和性能。
GPU 發出的信號需要先傳遞到 PCIe Switch, PCIe Switch 中涉及到數據的處理,CPU 會對數據進行分發調度,這些都會引入額外的網絡延遲,限制了系統性能。
爲此,NVIDIA 推出了能夠提升 GPU 通信性能的技術——GPUDirect P2P 技術,使 GPU 可以通過 PCI Express 直接訪問目標 GPU 的顯存,避免了通過拷貝到 CPU host memory 作爲中轉,大大降低了數據交換的延遲,但受限於 PCI Express 總線協議以及拓撲結構的一些限制,無法做到更高的帶寬。此後,NVIDIA 提出了 NVLink 總線協議。
NVLink 簡介:
NVLink 是一種高速互連技術,旨在加快 CPU 與 GPU、GPU 與 GPU 之間的數據傳輸速度,提高系統性能。NVLink 通過 GPU 之間的直接互聯,可擴展服務器內的多 GPU I/O,相較於傳統 PCIe 總線可提供更高效、低延遲的互聯解決方案。
NVLink 的首個版本於 2014 年發佈,首次引入了高速 GPU 互連。2016 年發佈的 P100 搭載了第一代 NVLink,提供 160GB/s 的帶寬,相當於當時 PCIe 3.0 x16 帶寬(雙向)的 5 倍。之後陸續發佈了很多新版本,V100 搭載的 NVLink2 將帶寬提升到 300GB/s ,A100 搭載了 NVLink3 帶寬爲 600GB/s。H100 中包含 18 條第四代 NVLink 鏈路,總帶寬(雙向)達到 900 GB/s,是 PCIe 5.0 x16 帶寬(雙向)的 7 倍。
NVLink 高速互聯主要有兩種:
-
第一種是以橋接器的形式實現。
-
另一種是在主板上集成
NVLink
接口。
NVSwitch
爲了解決 GPU 之間通訊不均衡問題,NVIDIA 引入 NVSwitch。NVSwitch 芯片是一種類似交換機的物理芯片(ASIC),通過 NVLink 接口可以將多個 GPU 高速互聯到一起,可創建無縫、高帶寬的多節點 GPU 集羣,實現所有 GPU 在一個具有全帶寬連接的集羣中協同工作,從而提升服務器內部多個 GPU 之間的通訊效率和帶寬。NVLink 和 NVSwitch 的結合使 NVIDIA 得以高效地將 AI 性能擴展到多個 GPU。
第一代 NVSwitch 於 2018 年發佈,採用臺積電 12nm FinFET 工藝製造,共有 18 個 NVLink 2.0 接口。目前 NVSwitch 已經迭代至第三代。第三代 NVSwitch 採用臺積電 4N 工藝(臺積電 4N 工藝專爲 NVIDIA 定製設計,並進行了一系列優化,它與普通臺積電 5nm 節點相比,可實現更好的電源效率與性能,並且密度有所提升)構建,每個 NVSwitch 芯片上擁有 64 個 NVLink 4.0 端口,GPU 間通信速率可達 900GB/s。
Nvidia GPU 服務器 PCIe 版 和 SXM 版的區別
英偉達 GPU 卡間互連的內存插槽有 2 種,一種是 PCIe 口,一種是 SXM 口。
PCIe 口是一個相對通用的協議,PCIe 口相對慢一些,SXM 是專門用來做卡間互連的,SXM 協議是鋪在電路板上,SXM 協議做卡間互連會更快,對 NVLink 原生支持更好,顯存帶寬比 PCIe 高一些。PCIe 和 SXM 都可以用 NVLink,但是 SXM 是更好使用 NVLink 的方法。
SXM 架構是一種高帶寬插座式解決方案,用於將 GPU 連接到 NVIDIA 專有的 DGX 和 HGX 系統。SXM 版 GPU 通過主板上集成的 NVSwitch 實現 NVLink 的連接,不需要通過主板上的 PCIe 進行通信,它能支持 8 塊 GPU 卡的互聯互通,實現了 GPU 之間的高帶寬。未閹割的 A100 是 600GB/s、H100 是 900GB/s,閹割過的 A800、H800 爲 400GB/s。
把 PCIe 版 GPU 卡插到 PCIe 插槽上,就可以和 CPU、同一個服務器上其他的 GPU 卡進行通信,也可以通過網卡與其他的服務器節點上的設備進行通信,這種就是 PCIe 的通信方式,但是這種傳輸速度不快。如果想要和 SXM 一樣,有很快的傳輸速度,可以使用 NVlink 橋接器實現 GPU 和 CPU 之間的通信,但是和 SXM 不一樣的地方就是它只能實現 2 塊 GPU 卡之間的通信。即 PCIe 版只有成對的 GPU 通過 NVLink Bridge 連接,通過 PCIe 通道進行數據通信。同時,最新的 PCIe 網絡帶寬有 128GB/s 的限制。
TCP/IP
TCP/TP (或傳輸控制協議 / Internet 協議)用於通過 Internet 互連網絡設備。它確定了數據應該如何被打包、尋址、傳輸、路由和接收。TCP/IP 非常重視兩臺計算機之間的準確數據傳輸。如果系統在一次發送消息時遇到問題,則必須重新發送整個消息。
此外,TCP/IP 的功能分爲四個不同的層:數據鏈路層、互聯網層、傳輸層和應用層。數據在被另一端接收之前必須經過這四層。然後,TCP/IP 將通過以相反順序傳遞層來重組數據並將其呈現給接收器。這樣,您可以通過升級某些層而不是整個系統來提高數據中心的性能或安全性。
RDMA
RDMA(遠程直接數據存取) 就是爲了解決網絡傳輸中服務器端數據處理的延遲而產生的,無需使用 CPU,就可以從一個主機或服務器的內存直接訪問另一主機或服務器的內存。它釋放了 CPU 去執行其應做的工作,比如:運行應用程序和處理大量數據。這既提高了帶寬又降低了延遲、抖動和 CPU 消耗。
對比傳統的網絡傳輸機制,RDMA 無需操作系統和 TCP/IP 協議棧的介入。RDMA 的內核旁路機制,允許應用與網卡之間的直接數據讀寫,將服務器內的數據傳輸時延降低到 1us 以下。同時,RDMA 的內存零拷貝機制,允許接收端直接從發送端的內存讀取數據,極大的減少了 CPU 的負擔,提升 CPU 的效率。
大致有三類 RDMA 網絡,分別是 Infiniband、RoCE、iWARP。其中,Infiniband 是一種專爲 RDMA 設計的網絡,從硬件級別保證可靠傳輸 ,而 RoCE 和 iWARP 都是基於以太網的 RDMA 技術,支持相應的 verbs 接口。
RDMA 最早在 Infiniband 傳輸網絡上實現,技術先進,但是價格高昂 (只有 Mellanox(現已被英偉達收購)和 Intel(2012 年,英特爾公司出資收購了 QLogic 的 InfiniBand 技術)供應商提供全套網絡解決方案),後來業界廠家把 RDMA 移植到傳統 Ethernet 以太網上,降低了 RDMA 的使用成本,推動了 RDMA 技術普及。在 Ethernet 以太網上,根據協議棧融合度的差異,分爲 iWARP 和 RoCE 兩種技術,而 RoCE 又包括 RoCEv1 和 RoCEv2 兩個版本 (RoCEv2 的最大改進是支持 IP 路由)。各 RDMA 網絡協議棧的對比,如下圖所示:
IB(InfiniBand): 基於 InfiniBand 架構的 RDMA 技術,由 IBTA(InfiniBand Trade Association)提出。搭建基於 IB 技術的 RDMA 網絡需要專用的 IB 網卡和 IB 交換機。
iWARP(Internet Wide Area RDMA Protocal): 基於 TCP/IP 協議的 RDMA 技術,由 IETF 標 準定義。iWARP 支持在標準以太網基礎設施上使用 RDMA 技術,但服務器需要使用支持 iWARP 的網卡。
RoCE(RDMA over Converged Ethernet): 基於以太網的 RDMA 技術,也是由 IBTA 提出。RoCE 支持在標準以太網基礎設施上使用 RDMA 技術,但是需要交換機支持無損以太網傳輸,需要服務器使用 RoCE 網卡。
在三種主流的 RDMA 技術中,可以劃分爲兩大陣營。一個是 IB 技術,另一個是支持 RDMA 的以太網技術 (RoCE 和 iWARP)。其中, IBTA 力挺的技術自然是 IB 和 RoCE, Mellanox 公司是這方面的急先鋒。而 iWARP 則是 IEEE/IETF 力挺的技術,主要是 Chelsio 公司在推進。
在存儲領域,支持 RDMA 的技術早就存在,比如:SRP(SCSI RDMA Protocol) 和 iSER(iSCSI Extensions for RDMA)。如今興起的 NVMe over Fabrics 如果使用的不是 FC 網絡的話,本質上就是 NVMe over RDMA。換句話說,NVMe over InfiniBand, NVMe over RoCE 和 NVMe over iWARP 都是 NVMe over RDMA。
InfiniBand
InfiniBand(直譯爲 “無限帶寬” 技術,縮寫爲 IB)是一個爲大規模、易擴展機羣而設計的網絡通信技術協議。可用於計算機內部或外部的數據互連,服務器與存儲系統之間直接或交換互連,以及存儲系統之間的互連。
InfiniBand 最重要的一個特點就是高帶寬、低延遲,因此在高性能計算項目中廣泛的應用。主要用於高性能計算(HPC)、高性能集羣應用服務器和高性能存儲。
InfiniBand 鏈路速率
InfiniBand 在物理層定義了多種鏈路速度,例如:1X,4X,12X。每個單獨的鏈路是四線串行差分連接(每個方向兩根線)。
以早期的 SDR(單數據速率)規範爲例,1X 鏈路的原始信號帶寬爲 2.5Gbps,4X 鏈路是 10Gbps,12X 鏈路是 30Gbps。1X 鏈路的實際數據帶寬爲 2.0Gbps(因爲採用 8b/10b 編碼)。由於鏈路是雙向的,因此相對於總線的總帶寬是 4Gbps。
隨着時間的推移,InfiniBand 的網絡帶寬不斷升級,下圖展示了 InfiniBand 從 SDR、DDR、QDR、FDR、EDR 發展到 HDR、NDR 的網絡帶寬,其速度是基於 4x 鏈路速度。
-
SDR(Single Data Rate):2.5Gb/s (10Gb/s for 4x)。
-
DDR(Double Data Rate):5 Gb/s (20Gb/s for 4x)。
-
QDR(Quad Data Rate):10 Gb/s (40Gb/s for 4x)。
-
FDR(Fourteen Data Rate):14Gb/s (56Gb/s for 4x)。
-
EDR(Enhanced Data Rate):25 Gb/s (100Gb/s for 4x)。
-
HDR(High Data Rate):50 Gb/s (200Gb/s for 4x)。
-
NDR(Next Data Rate):100 Gb/s (400Gb/s for 4x)。
InfiniBand 網絡互連產品
InfiniBand 網絡中,使用的線纜區別於傳統的以太網線纜和光纖線纜。針對不同的連接場景,需使用專用的 InfiniBand 線纜。
InfiniBand 網絡互連產品包括:DAC 高速銅纜、AOC 有源線纜以及光模塊。
DAC 高速線纜和 AOC 有源光纜都是用於數據中心、高性能計算機等大容量儲存器設備間的傳輸設備。
DAC 高速線纜,也叫直連銅纜(Direct Attach Copper cable), 它的線材是銅纜,是低壓脈衝傳輸信號;因爲材料的不同導致功耗、傳輸距離和價格的不同,DAC 高速線纜的功耗比較低,但傳輸距離相對比較短,低於 10 米。價格方面相對便宜一些。
AOC 有源光纜(Active Optial Cable),它的線材是光纜,爲光信號傳輸,通過電 - 光 - 電的轉換;功耗相對比較大些但傳輸的距離可達到 100 米,價格方面相對高些。
光模塊的作用也是光電信號之間的轉換,主要用於交換機與設備之間傳輸的載體,和光纖收發器的原理相同,只是光模塊相比收發器更具效率性、安全性。光模塊按照封裝形式分類,常見的有 SFP,SFP+,XFP,SFP28,QSFP+,QSFP28 等。
光纖收發器是將短距離的電信號和長距離的光信號進行轉換的設備,一般應用在遠距離傳輸中,通過光纖進行傳輸,將電信號轉換成光信號發送出去,同時,在接收端將接收到的光信號轉換成電信號。在很多地方也被稱之爲光電轉換器 (Fiber Converter)。光纖收發器爲需要將系統從銅線升級到光纖,爲缺少資金、人力或時間的用戶提供了一種廉價的方案。
光模塊與光纖收發器如何配對使用?
-
波長和傳輸距離必須一致,比如:採用 1310nm 波長,傳輸距離應該是 10KM/20KM。
-
光纖跳線尾纖接口選擇需注意,一般光纖收發器採用的 SC 口,光模塊採用的是 LC 口。
-
速率必須一樣,比如:千兆收發器對應 1.25G 光模塊,百兆連百兆,千兆連千兆。4、光模塊類型需要採用相同類型,單纖對單纖,雙纖對雙纖。
InfiniBand 的網絡架構
InfiniBand 是一種基於通道的結構,組成單元主要分爲四類:
-
HCA(Host Channel Adapter,主機通道適配器)
-
TCA(Target Channel Adapter,目標通道適配器)
-
InfiniBand link(連接通道,可以是電纜或光纖,也可以是板上鍊路)
-
InfiniBand 交換機和路由器(組網用的)
通道適配器就是搭建 InfiniBand 通道用的。所有傳輸均以通道適配器開始或結束,以確保安全或在給定的 QoS(服務質量)級別下工作。
使用 InfiniBand 的系統可以由多個子網(Subnet)組成,每個子網最大可由 6 萬多個節點組成。
-
子網內部,InfiniBand 交換機進行二級處理。
-
子網之間,使用路由器或網橋進行連接。
InfiniBand 的二級處理過程非常簡單,每個 InfiniBand 子網都會設一個子網管理器,生成 16 位的 LID(本地標識符)。InfiniBand 交換機包含多個 InfiniBand 端口,並根據第二級本地路由標頭中包含的 LID,將數據包從其中一個端口轉發到另一個端口。除管理數據包外,交換機不會消耗或生成數據包。
簡單的處理過程,加上自有的 Cut-Through 技術,InfiniBand 將轉發時延大幅降低至 100ns 以下,明顯快於傳統以太網交換機。
在 InfiniBand 網絡中,數據同樣以數據包(最大 4KB)的形式傳輸,採用的是串行方式。
InfiniBand 的協議棧
InfiniBand 協議同樣採用了分層結構,各層相互獨立,下層爲上層提供服務,如下圖所示:
-
物理層定義了在線路上如何將比特信號組成符號,然後再組成幀、數據符號以及包之間的數據填充等,詳細說明了構建有效包的信令協議等。
-
鏈路層定義了數據包的格式以及數據包操作的協議,如:流控、 路由選擇、編碼、解碼等。
-
網絡層通過在數據包上添加一個 40 字節的全局的路由報頭(Global Route Header, GRH)來進行路由的選擇,對數據進行轉發。在轉發的過程中,路由器僅僅進行可變的 CRC 校驗,這樣就保證了端到端的數據傳輸的完整性。Infiniband 報文封裝格式如下圖所示:
- 傳輸層再將數據包傳送到某個指定的隊列偶(Queue Pair, QP)中,並指示 QP 如何處理該數據包。
可以看出,InfiniBand 擁有自己定義的 1-4 層格式,是一個完整的網絡協議。端到端流量控制,是 InfiniBand 網絡數據包發送和接收的基礎,可以實現無損網絡。
QP(隊列偶)說明:
QP 是 RDMA 技術中通信的基本單元。隊列偶就是一對隊列,SQ(Send Queue,發送工作隊列)和 RQ(Receive Queue,接收工作隊列)。用戶調用 API 發送接收數據的時候,實際上是將數據放入 QP 當中,然後以輪詢的方式,將 QP 中的請求一條條的處理。
Mellanox OFED 軟件棧
Mellanox OFED 是一個單一的軟件堆棧,包括驅動、中間件、用戶接口,以及一系列的標準協議 IPoIB、SDP、SRP、iSER、RDS、DAPL(Direct Access Programming Library),支持 MPI、Lustre/NFS over RDMA 等協議,並提供 Verbs 編程接口;Mellanox OFED 由開源 OpenFabrics 組織維護。
Mellanox OFED 軟件堆棧是承載在 InfiniBand 硬件和協議之上的,軟件通過協議和硬件進行有效的數據傳輸。
OpenSM 子網管理器
OpenSM 軟件是符合 InfiniBand 的子網管理器 (SM),運行在 Mellanox OFED 軟件堆棧進行 IB 網絡管理,管理控制流走業務通道,屬於帶內管理方式。
OpenSM 包括子網管理器、背板管理器和性能管理器三個組件,綁定在交換機內部的必備部件。提供非常完備的管理和監控能力,如:設備自動發現、設備管理、Fabric 可視化、智能分析、健康監測等等。
InfiniBand 組網
InfiniBand 組網跟普通的交換機不太一樣,InfiniBand 的組網成本很高。如果希望這個網絡中任何兩個計算節點的網卡之間互相無損地通信,需要使用一種叫做胖樹(Fat Tree)的網絡拓撲,大概是如下一種拓撲結構,方塊是交換機,橢圓是計算節點。
胖樹主要有兩層,上面一層是核心層,不連任何計算節點,它的功能就是轉發流量;下面一層是接入層,接入各類計算節點。
胖樹拓撲成本高的主要原因是:某一個匯聚交換機上,假如有 36 個口,那如果爲了達到無損速率,一半的口,也就是 18 個口可以給計算節點連,剩下一半要連到上層的核心交換機上。要知道,任何一根線,就是 1 萬多塊錢呢,如果達到無損,就要冗餘地做這些連接。
NVIDIA InfiniBand 商用產品
Mellanox 在全球 InfiniBand 市場的佔有率基本上無敵的存在,在英偉達收購 Mellanox 之後,也於 2021 年推出了自己的第七代 NVIDIA InfiniBand 架構:NVIDIA Quantum-2。
NVIDIA Quantum-2 平臺包括:NVIDIA Quantum-2 系列交換機、NVIDIA ConnectX-7 InfiniBand 適配器、BlueField-3 InfiniBand DPU 以及電纜。
NVIDIA Quantum-2 系列交換機採用緊湊型 1U 設計,包括風冷和液冷版本。交換機的芯片製程工藝爲 7nm,單芯片擁有 570 億個晶體管(比 A100 GPU 還多)。單個交換機採用 64 個 400Gb/s 端口或 128 個 200Gb/s 端口的靈活搭配,提供總計 51.2Tb/s 的雙向吞吐量。NVIDIA NDR 400Gb/s InfiniBand 交換機如下圖所示:
NVIDIA ConnectX-7 InfiniBand 適配器支持 PCIe Gen4 和 Gen5,具有多種外形規格,可提供 400Gb/s 吞吐量。
InfiniBand 常用命令
-
ibv_asyncwatch
:監視 InfiniBand 異步事件 -
ibv_devices
或ibv_devinfo
:列舉 InfiniBand 設備或設備信息 -ibstatus
:查詢 IB 設備的基本狀態 -
ibping
:驗證 IB 節點之間的連通性 -
ibtracert
:跟蹤 IB 路徑 -
iblinkinfo
:查看 IB 交換模塊的所有端口的連接狀態。此命令會將集羣內所有的 IB 交換模塊都進行列舉。
通信軟件
通信軟件指用於分佈式訓練時,多個計算設備之間的集合通信。在分佈式系統中,各個節點間往往存在大量的集合通信需求,而我們可以用消息傳遞接口 (Message Passing Interface,MPI,一套集合通信相關的接口標準) 來定義一些比較底層的消息通信行爲。譬如 Reduce、AllReduce、Scatter、Gather、AllGather 等。
常見的集合通信庫(如:Open MPI、Gloo、NCCL 等)都在 MPI 的基礎上,對各種集合通信的模式和算法作了各自的實現。
Open MPI:
Open MPI 是一個開源 MPI(消息傳遞接口 )的實現,由學術,研究和行業合作伙伴聯盟開發和維護。因此,Open MPI 可以整合高性能計算社區中所有專家,技術和資源,以構建可用的最佳 MPI 庫。
Gloo:
Gloo 是 Facebook 開源的一套集體通信庫,提供了對機器學習中有用的一些集合通信算法。如:Barrier,Broadcast,AllReduce。
NCCL:
NCCL(Nvidia Collective multi-GPU Communication Library)是英偉達基於 NVIDIA GPU 的一套開源的集合通信庫,如其官網描述:NVIDIA 集合通信庫(NCCL)實現了針對 NVIDIA GPU 性能優化的多 GPU 和多節點集合通信原語。NCCL 提供了諸如 All Gather,All Reduce,Broadcast,Reduce,Reduce-Scatter 等實現,這些實現優化後可以通過 PCIe、 NVLink、InfiniBand 等高速互聯,從而實現高帶寬和低延遲。
因爲 NCCL 是 NVIDIA 基於自身硬件定製的,能做到更有針對性且更方便優化,故在英偉達硬件上,NCCL 的效果往往比其它的通信庫更好。
NCCL 主要做幾件事:探測計算節點的網絡設備和拓撲結構,使用算法自動調優選擇一個最優的通信方式。
NCCL 集合通信庫
通信原語
並行任務的通信一般可以分爲 Point-to-point communication 和 Collective communication 。
P2P 通信這種模式只有一個 sender 和一個 receiver,實現起來比較簡單。
集合通信包含多個 sender 多個 receiver,一般的通信原語包括 broadcast,gather,all-gather,scatter,reduce,all-reduce,reduce-scatter,all-to-all 等。
簡單介紹幾個常用的操作:
Reduce:從多個 sender 那裏接收數據,最終 combine 到一個節點上。
All-reduce:從多個 sender 那裏接收數據,最終 combine 到每一個節點上。
NCCL 實現
NCCL 實現成 CUDA C++ kernels,包含 3 種 primitive operations:Copy,Reduce,ReduceAndCopy。
-
NCCL 1.0 版本只支持單機多卡,卡之間通過 PCIe、NVlink、GPUDirect P2P 來通信。
-
NCCL 2.0 支持多機多卡,多機間通過 Sockets (Ethernet) 或者 InfiniBand with GPUDirect RDMA 通信。
單機內多卡通過 PCIe 以及 CPU socket 通信。
多機通過 InfiniBand 通信,在多機多卡內部,也要構成一個通信環。
對比 NCCL 在不同硬件架構下網絡帶寬
下圖是 Allreduce 在單機不同架構下的速度比較:
前面三個是單機多卡典型的三種連接方式:
-
第一種是兩個 GPU 通過 CPU 然後通過 QPI 和另一個 CPU 上的兩塊卡相連,因此速度最慢,但也能達到 > 5GB/s。
-
第二種是兩個 GPU 通過 PCIe switch 相連後再經過 CPU 連接,速度會稍微低一點。
-
第三種是四張卡都在一個 PCIe switch 上,所以帶寬較高,能達到 > 10GB/s PCIe 的帶寬大小。
第四種是 DGX-1 架構,這是 Nvidia 推出的深度學習平臺,帶寬能達到 60GB/s。
下圖是 Allreduce 多機下的速度表現。其中,左圖 2 機 8 卡,機內 PCIe,機間 InfiniBand 能達到 > 10GB/s 的速度,InfiniBand 基本上能達到機內的通信速度;右圖 4 機 32 卡,機內 NVLink,機間 InfiniBand,帶寬能達到 > 40GB/s。
下圖是 NCCL 在 CNTK ResNet50 上的可擴展性(scalability),32 卡基本能達到線性加速比。
NCCL 常見的環境變量設置
NCCL_P2P_DISABLE
該變量禁用 P2P 傳輸,該傳輸使用 NVLink 或 PCI 在 GPU 之間使用 CUDA 直接訪問。
設定爲 1 相當於設置 NCCL_P2P_LEVEL=0
,並且會被 NCCL_P2P_LEVEL 的值所覆蓋。
NCCL_P2P_LEVEL:
該變量允許用戶精細地控制何時在 GPU 之間使用 P2P 傳輸。該級別定義了 NCCL 將使用 P2P 傳輸的 GPU 之間的最大距離。
如果未指定,NCCL 將嘗試根據其運行的體系結構和環境來最佳選擇一個值。
可選值:
-
LOC:從不使用 P2P(始終禁用)
-
NVL :當 GPU 通過 NVLink 連接時使用 P2P
-
PIX :當 GPU 位於同一 PCI 交換機上時使用 P2P。
-
PXB:當 GPU 通過 PCI 交換機(可能是多跳)連接時使用 P2P。
-
PHB :當 GPU 位於同一 NUMA 節點上時使用 P2P。流量將通過 CPU。
-
SYS :在 NUMA 節點之間使用 P2P,可能跨越 SMP 互連(例如:QPI/UPI)。
NCCL_NET_GDR_LEVEL:
該變量允許用戶精細控制何時在 NIC 和 GPU 之間使用 GPUDirect RDMA。該級別定義 NIC 和 GPU 之間的最大距離。
如果未指定,NCCL 將嘗試根據其運行的體系結構和環境來最佳選擇一個值。
可選值:
-
LOC:從不使用 GPU Direct RDMA。(始終禁用)
-
PIX:當 GPU 和 NIC 位於同一 PCI 交換機上時,使用 GPU Direct RDMA。
-
PXB:當 GPU 和 NIC 通過 PCI 交換機(可能是多跳)連接時,使用 GPU Direct RDMA。
-
PHB :當 GPU 和 NIC 位於同一 NUMA 節點上時,使用 GPU Direct RDMA。流量將通過 CPU。
-
SYS :即使跨 NUMA 節點之間的 SMP 互連(例如 QPI/UPI)也使用 GPU Direct RDMA。(始終啓用)
NCCL_NET_GDR_READ:
只要 GPU-NIC 距離在 NCCL_NET_GDR_LEVEL 指定的距離內,NCCL_NET_GDR_READ 變量就會在發送數據時啓用 GPU Direct RDMA。
-
2.4.2 之前,默認情況下禁用 GDR 讀取,即發送數據時,數據先存儲在 CPU 內存中,然後再發送到 InfiniBand 卡。
-
自 2.4.2 起,基於 NVLink 的平臺默認啓用 GDR 讀取。
注意:已知在某些平臺(例如:PCI-E)上,發送數據時直接從 GPU 內存讀取比從 CPU 內存讀取稍慢。
可選值爲 0 或 1。定義並設置爲 1 以使用 GPU Direct RDMA 直接將數據發送到 NIC(繞過 CPU)。
在 2.4.2 之前,所有平臺的默認值都是 0。自 2.4.2 起,基於 NVLink 的平臺的默認值爲 1,否則爲 0。
NCCL_IB_DISABLE:
該變量將禁用 NCCL 要使用的 IB 傳輸。NCCL 將使用 IP sockets 。
定義並設置爲 1 以強制使用 IP sockets 。
NCCL_SOCKET_IFNAME:
指定 NCCL 使用的 SOCKET 網卡。如:NCCL_SOCKET_IFNAME=bond0,eth0
。
NCCL_IB_HCA:
該變量指定要用於通信的 RDMA 接口。使用 IB 通信必須要設置的(指定 NCCL 使用的 IB 網卡)。可以通過 ibstat 查看 IB 網卡名。
用法:
定義一個前綴列表來過濾要由 NCCL 使用的接口。使用 ^ 符號,NCCL 將排除以列表中任何前綴開頭的接口。還可以使用 : 符號來指定特定的端口。要匹配(或不匹配)確切的接口名稱而不是前綴,在字符串前面加上 = 字符。
示例:
-
mlx5
:使用以 mlx5 開頭的所有卡的所有端口。 -
=mlx5_0:1,mlx5_1:1
:使用卡 mlx5_0 和 mlx5_1 的端口 1。 -
^=mlx5_1
:不使用卡 mlx5_1。
比如:NCCL_IB_HCA=mlx5_2,mlx5_3,mlx5_4,mlx5_5
注意:
如果不加前綴 =,使用 mlx5_1 將同時選擇 mlx5_1 和 mlx5_10 到 mlx5_19(如果存在)。因此,始終建議添加前綴 = 以確保精確匹配。
使用建議:
通過這個環境變量可以調整 NIC(Network Interface Controller)數量,NIC 通常是一塊插入計算機主板上的擴展卡,更多 NIC,節點帶寬更大。通過控制 NIC 數量可以控制節點間通信帶寬。
NCCL_IB_TIMEOUT:
該變量用於控制 InfiniBand Verbs 超時。取值範圍 1-22。
超時時間的計算公式爲 4.096 微秒 * 2 ^ timeout,正確的值取決於網絡的大小。增加該值可以在非常大的網絡上提供幫助,例如,如果 NCCL 在調用 ibv_poll_cq 時出現錯誤 12。
使用建議:
在大模型訓練任務中設置成最大值 22,可以減少不少 nccl timeout 異常。
NCCL_IB_RETRY_CNT
該變量控制 InfiniBand 的重試次數。
使用建議:
在大模型訓練任務中設置成 13,儘可能多重試。
NCCL_PXN_DISABLE:
禁止使用非本地 NIC 的進行節點間通信,使用 NVLink 和一箇中間 GPU。
使用建議:
設置成 1。在 PyTorch 中進行跨節點 all-to-all 通信時,如果該環境變量是 0 會出現異常。
NCCL_DEBUG_FILE:
設置一個文件地址,變量用於將 NCCL 的調試日誌輸出到文件中,有助於調試 NCCL。
NCCL_IB_PCI_RELAXED_ORDERING:
啓用 IB Verbs 傳輸的 Relaxed Ordering。Relaxed Ordering 可以極大地提高虛擬化環境下 InfiniBand 網絡的性能。
傳統的順序執行(Strict Ordering)要求數據在發送和接收之間按照嚴格的順序進行傳輸和處理。這種機制可以確保數據的順序性,但可能會導致性能瓶頸,特別是在高負載和複雜通信模式下。
而 Relaxed Ordering 允許數據在發送和接收之間進行亂序傳輸和處理。這意味着系統可以更靈活地調度和處理數據,提高並行性和吞吐量。Relaxed Ordering 機制在虛擬化環境中尤其有益,因爲它可以減少虛擬機之間的爭用和延遲,提高整體性能。
接受的取值:
-
設置爲 2,如果可用,自動使用 Relaxed Ordering。
-
設置爲 1,強制使用 Relaxed Ordering,如果不可用,則失敗。
-
設置爲 0,禁用使用 Relaxed Ordering。
默認值爲 2。建議設置成 1。
NCCL_SHM_DISABLE:
該變量禁用共享內存(SHM)傳輸。
在 P2P 不能生效的情況下,是否使用 CPU 的共享內存來傳輸數據。當 SHM 禁用時,NCCL 使用網絡( InfiniBand 或 IP sockets)在 CPU sockets 之間進行通信。
InfiniBand 在 AI 集羣中的應用
GPUDirect 簡介
GPUDirect 是 NVIDIA 開發的一項技術,可實現 GPU 與其他設備(例如網絡接口卡 (NIC) 和存儲設備)之間的直接通信和數據傳輸,而不涉及 CPU。
傳統上,當數據需要在 GPU 和另一個設備之間傳輸時,數據必須通過 CPU,從而導致潛在的瓶頸並增加延遲。使用 GPUDirect,網絡適配器和存儲驅動器可以直接讀寫 GPU 內存,減少不必要的內存消耗,減少 CPU 開銷並降低延遲,從而顯著提高性能。GPU Direct 技術包括 GPUDirect Storage、GPUDirect RDMA、GPUDirect P2P 和 GPUDirect Video。
GPUDirect 發展簡史
-
GPUDirect Shared Memory (2012) :Nvidia 在 PCIe 上實現了單機上的 GPUDirect Shared Memory 技術;
-
GPUDirect P2P (2014):Nvidia 在 PCIe 上實現了單機上的 GPUDirect P2P 技術;
-
NVLink(2014) :解決了單機多卡通信時 PCIe 瓶頸問題;
-
GPUDirect RDMA(2014):提升多機多卡通信性能;
GPUDirect Peer to Peer(P2P)簡介
GPUDirect Peer-to-Peer(P2P) 技術主要用於單機 GPU 間的高速通信,它使得 GPU 可以通過 PCI Express 直接訪問目標 GPU 的顯存,避免了通過拷貝到 CPU host memory 作爲中轉,大大降低了數據交換的延遲。
以深度學習應用爲例,主流的開源深度學習框架(如:TensorFlow、MXNet)都提供了對 GPUDirect P2P 的支持,NVIDIA 開發的 NCCL(NVIDIA Collective Communications Library) 也提供了針對 GPUDirect P2P 的特別優化。
通過使用 GPUDirect P2P 技術可以大大提升深度學習應用單機多卡的擴展性,使得深度學習框架可以獲得接近線性的訓練性能加速比。
GPUDirect RDMA 簡介
所謂 GPUDirect RDMA,就是計算機 1 的 GPU 可以直接訪問計算機 2 的 GPU 內存。而在沒有這項技術之前,GPU 需要先將數據從 GPU 內存搬移到系統內存,然後再利用 RDMA 傳輸到計算機 2,計算機 2 的 GPU 還要做一次數據從系統內存到 GPU 內存的搬移動作。GPUDirect RDMA 技術使得進一步減少了 GPU 通信的數據複製次數,通信延遲進一步降低。
使用 GPUDirect RDMA 兩個 GPU 設備必須共享相同的上游 PCI Express root complex。
InfiniBand 在 NVIDIA DGX 集羣中應用
DGX-1 集羣中應用 InfiniBand:
下圖展示了 DGX-1 配有四個 EDR InfiniBand 卡(每個 100 Gb/s)和兩個 10Gb/s 以太網卡(銅質)。這些網絡接口可用於將 DGX-1 連接到網絡以進行通信和存儲。
每兩個 GPU 都連接到系統板上的一個 PCIe 交換機。該交換機還連接到 InfiniBand (IB) 網卡。爲了減少延遲並提高吞吐量,來自這兩個 GPU 的網絡流量應流向關聯的 IB 卡。這就是 DGX-1 設備中有四張 IB 卡的原因。
如果您想使用 InfiniBand(IB)網絡連接 DGX 設備,理論上,您只需使用其中一張 IB 卡即可。然而,這些數據流量將強行通過 CPU 之間的 QPI 鏈路,這對於 GPU 流量來說是一個非常慢的鏈路(即,它成爲瓶頸)。更好的解決方案是使用兩張 IB 卡,一張連接到每個 CPU。這可以是 IB0 和 IB2,或者 IB1 和 IB3,或者 IB0 和 IB3,或者 IB1 和 IB2。這將大大減少必須穿越 QPI 鏈路的流量。最佳性能始終是使用 IB 交換機的所有四個 IB 鏈路。
使用 IB 鏈路是將所有四個 IB 卡連接到 IB 結構的最佳方法。如果您使用多個 DGX 設備進行訓練,這將帶來最佳性能(完全的平分帶寬和最低延遲)。
通常,最小的 IB 交換機配有 36 個端口。這意味着單個 IB 交換機可容納使用全部四張 IB 卡的九個 DGX-1 設備。這允許從 DGX-1 到交換機的帶寬爲 400 Gb/s。
如果您的應用程序不需要 DGX-1 設備之間的帶寬,則可以如前所述爲每個 DGX-1 使用兩個 IB 連接。這允許您將最多 18 個 DGX-1 設備連接到單個 36 端口 IB 交換機。
注意:不建議僅使用單個 IB 卡,但如果由於某種原因採用這種配置,則您最多可以將 36 個 DGX-1 設備連接到單個交換機。
對於大量 DGX-1 設備,您可能必須使用兩級交換網絡。經典的 HPC 配置是在第一級使用 36 端口 IB 交換機(有時稱爲葉子(Leaf)交換機),並將它們連接到單個大型核心交換機,有時稱爲導向器級(director class)交換機。最大的導向器級 InfiniBand 交換機有 648 個端口。當然您也可以使用多個核心交換機,但配置會變得相當複雜。
對於兩級交換網絡,如果每個 DGX-1 設備的全部 4 個 IB 卡都用於連接到 36 端口交換機,並且沒有過度訂閱,則每個交換機的 DGX-1 設備的最大數量爲 4。這時每個 DGX-1 有 4 個端口進入交換機,總共 16 個端口。然後,從葉子交換機到核心交換機(導向器級交換機)有 16 個上行鏈路。總共 40 臺 36 端口葉子交換機可連接到 648 端口核心交換機 (648/16)。這導致 160(40 * 4) 個 DGX-1 設備(共 640 卡)以全對分帶寬連接。
當然您還可以在設計 IB 網絡時使用所謂的過度訂閱。過度訂閱意味着來自上行鏈路的帶寬小於進入設備的帶寬(換句話說,帶寬性能較差)。如果我們使用從 DGX-1 設備到第一級交換機(36 端口葉交換機)的 2:1 超額訂閱,則每個 DGX-1 設備僅使用兩個 IB 卡連接到交換機。與使用所有四張卡相比,這會導致帶寬更少,並且延遲也會更高。
如果我們保持從葉子交換機到核心交換機的網絡帶寬爲 1:1(換句話說,沒有過度訂閱,全對分帶寬),那麼我們可以將九個 DGX-1 設備放入一個單葉子交換機(從 DGX 設備到葉子交換機的總共 18 個端口以及到核心交換機的 18 個上行鏈路端口)。結果是總共 36(648/18)臺葉子交換機可以連接到核心交換機。這使得總共 324(36 * 9) 個 DGX-1 設備可以連接在一起。
您還可以通過使用從葉子交換機到核心交換機的超額訂閱來進一步定製 IB 網絡。這可以通過使用每個 DGX 設備到葉子交換機的四個 IB 連接,然後對核心交換機進行 2:1 超額訂閱,甚至使用到葉子交換機的兩個 IB 連接,然後對核心交換機進行 2:1 超額訂閱來完成。
InfiniBand 網絡的另一個重要方面是子網管理器 (SM)。SM 僅管理 IB 網絡。任何時候都有一個 SM 管理 IB 結構,但您可以讓其他 SM 運行並準備好在第一個 SM 崩潰時接管。選擇運行多少個 SM 以及在何處運行它們會對集羣的設計產生重大影響。
首先要做的決定是在哪裏運行 SM。
如果您願意,它們可以在 IB 交換機上運行。這稱爲硬件 SM,因爲它在交換機硬件上運行。這樣做的優點是您不需要任何其他也可以運行 SM 的服務器。
在節點上運行 SM 稱爲軟件 SM。運行硬件 SM 的一個缺點是,如果 IB 流量很大,SM 可能會遇到困難。對於大量 IB 流量和較大的網絡,最佳實踐是在專用服務器上使用軟件 SM。
要做的第二個決定是您想要運行多少個 SM。您至少必須運行一個 SM。最便宜的解決方案是運行單個硬件 SM。這對於 DGX-1 設備的小集羣(可能是 2-4 個)來說效果很好。隨着單元數量的增加,您將需要考慮同時運行兩個 SM 以獲得 HA(高可用性)功能。您需要 HA 的原因是集羣上有更多用戶,並且集羣故障比少量設備故障產生的影響更大。
隨着設備數量的增長,請考慮在專用服務器(軟件 SM)上運行 SM。您還需要爲集羣運行至少兩個 SM。理想情況下,這意味着 SM 有兩臺專用服務器。
DGX SuperPOD 中廣泛應用 InfiniBand:
下圖爲 DGX A100/H100 256 SuperPOD 網絡拓撲圖:
下圖爲 DGX A100/H100 1K POD 網絡拓撲圖:
InfiniBand 在 AI 框架中的應用
在之前文章(AI 集羣基礎設施 NVMe SSD 詳解)中談到了 NVMe 在 DeepSpeed 中的應用。DeepSpeed 通過 ZeRO-Infinity 技術嘗試利用 NVMe 的空間進一步打破內存牆的限制訓練超大模型。除此之外,該方法也充分利用了 InfiniBand 網絡進行多機通信,具體如下圖所示。
另外,像 NCCL、Gloo 等集合通信庫都繼承了 InfiniBand,Pytorch 框架也能夠通過通信庫輕鬆應用 InfiniBand 進行分佈式訓練。
總結
本文講述了 AI 集羣通信的軟硬件;同時,針對 NCLL 集合通信庫以及 InfiniBand 網絡通信技術協議進行了更爲詳細的介紹;另外,也講述了 AI 集羣以及 AI 框架中對於 InfiniBand 的應用。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/A0C2DkAoM8Udds2eOaLIZg