在進入大模型時代后,大模型發(fā)展已是人工智能的核心,但訓練大模型實際上是一項比較復雜的工作,因為它需要大量的 GPU 資源和較長的訓練時間。
此外,由于單個 GPU 工作線程的內存有限,并且許多大型模型的大小已經超出了單個 GPU 的范圍。所以就需要實現(xiàn)跨多個 GPU 的模型訓練,這種訓練方式就涉及到了分布式通信和 NVLink。
當談及分布式通信和 NVLink 時,我們進入了一個引人入勝且不斷演進的技術領域,下面我們將簡單介紹分布式通信的原理和實現(xiàn)高效分布式通信背后的技術 NVLink 的演進。
分布式通信是指將計算機系統(tǒng)中的多個節(jié)點連接起來,使它們能夠相互通信和協(xié)作,以完成共同的任務。而 NVLink 則是一種高速、低延遲的通信技術,通常用于連接 GPU 之間或連接 GPU 與其他設備之間,以實現(xiàn)高性能計算和數據傳輸。
分布式并行
當前深度學習進入了大模型時代,即 Foundation Models。大模型,顧名思義主打的就是“大”。主要包括以下幾個方面:
數據規(guī)模大,大模型通常采用自監(jiān)督學習方法,減少了數據標注,降低訓練研發(fā)成本,而大量的數據又可以提高模型的泛化能力和性能。
參數規(guī)模大,隨著模型參數規(guī)模的不斷增大,模型可以更好地捕捉數據中的復雜關系和模式,有望進 一步突破現(xiàn)有模型結構的精度局限。
算力需求大,大規(guī)模的數據和參數,使得模型無法在單機上運行和計算,這一方面要求計算硬件的不斷進步,另一方面也要求 AI 框架具有分布式并行訓練的能力。
所以說,為了解決上述問題我們需要引入分布式并行策略。
數據并行
數據并行(Data Parallel, DP)是一種常用的深度學習訓練策略,它通過在多個 GPU 上分布數據來實現(xiàn)并行處理。在數據并行的框架下,每個 GPU(或稱作工作單元)都會存儲模型的完整副本,這樣每個 GPU 都能獨立地對其分配的數據子集進行前向和反向傳播計算。
數據并行的工作流程:
參數同步:在開始訓練之前,所有的工作單元同步模型參數,確保每個 GPU 的模型副本是相同的。
分配數據:訓練數據被劃分為多個批次,每個批次進一步被分割成多個子集,每個 GPU 負責處理一個數據子集。
獨立計算梯度:每個 GPU 獨立地對其數據子集進行前向傳播和反向傳播,計算出相應的梯度。
梯度聚合:計算完成后,所有工作單元的梯度需要被聚合起來。這通常通過網絡通信來實現(xiàn),比如使用 All-Reduce 算法,它允許在不同的 GPU 間高效地計算梯度的平均值。
更新參數:一旦梯度被平均,每個 GPU 使用這個平均梯度來更新其模型副本的參數。
重復過程:這個過程在每個數據批次上重復進行,直到模型在整個數據集上訓練完成。
數據并行的優(yōu)勢和挑戰(zhàn):
數據并行可以允許訓練過程水平擴展到更多的 GPU 上,從而加速訓練。其優(yōu)勢是實現(xiàn)簡單,而且可以靈活的調整工作單元的數量來適應可用的硬件資源,當前多種深度學習框架提供了內置支持。
不過數據并行隨著并行的 GPU 數量增加,需要存儲更多的參數副本,這會導致顯著的內存開銷。此外,梯度聚合步驟需要在 GPU 之間同步大量數據,這可能成為系統(tǒng)的瓶頸,特別是當工作單元的數量增多時。
異步同步方案在數據并行中的應用:
為了解決數據并行中的通信瓶頸問題,研究者們提出了各種異步同步方案。在這些方案中,每個 GPU 工作線程可以獨立于其他線程處理數據,無需等待其他工作線程完成其梯度計算和同步。這種方法可以顯著降低因通信導致的停滯時間,從而提高系統(tǒng)的吞吐量。
其實現(xiàn)原理為,在梯度計算階段,每個 GPU 在完成自己的前向和反向傳播后,不等待其他 GPU,立即進行梯度更新。其次,每個 GPU 在需要時讀取最新可用的全局權重,而不必等待所有 GPU 達到同步點。
然而,這種方法也有其缺點。由于不同 GPU 上的模型權重可能不同步,工作線程可能會使用過時的權重進行梯度計算,這可能導致統(tǒng)計效率的降低,即精度上無法嚴格保證。
模型并行
模型并行(Model Parallel, MP)通常是指在多個計算節(jié)點上分布式地訓練一個大型的深度學習模型,其中每個節(jié)點負責模型的一部分。這種方法主要用于解決單個計算節(jié)點無法容納整個模型的情況。模型并行可以進一步細分為幾種策略,包括但不限于流水并行(Pipeline Parallel, PP)和張量并行(Tensor Parallel, TP)。
模型并行是一種解決單個計算節(jié)點無法容納模型所有參數的方法。不同于數據并行,其中每個節(jié)點處理完整模型的不同數據子集,模型并行將模型的不同部分分布到多個節(jié)點上,每個節(jié)點只負責模型的一部分參數。這樣可以有效降低單個節(jié)點的內存需求和計算負載。
在模型并行中,深度神經網絡的多個層可以被分割并分配給不同的節(jié)點。例如,我們可以將連續(xù)的幾層分為一組,然后將這組層分配給一個節(jié)點。這種分層策略使得每個節(jié)點只處理分配給它的一部分模型參數,減少了內存和計算資源的使用。
然而,簡單的模型并行實現(xiàn)可能會導致顯著的等待時間和計算資源的低效利用,因為具有順序依賴的層需要等待前一層的計算完成。
為了減少這種效率損失,流水并行(Pipeline Parallel, PP)被提出。在流水并行中,一個大的數據批次被分成多個小的微批次(micro-batches),每個微批次的處理速度應該成比例地更快,并且每個 Worker 一旦可用就開始處理下一個微批次,從而加快流水的執(zhí)行速度。如果有足夠的微批次,則可以充分利用 Worker(GPU 卡),并在步驟開始和結束時將空閑時間“氣泡”降至最低。
在流水并行中,每個節(jié)點按順序處理不同的模型層,微批次在節(jié)點間流動,就像在流水線上一樣。梯度在所有微批次處理完畢后被平均,然后更新模型參數。
流水并行性按層“垂直”分割模型。我們還可以“水平”分割層內的某些操作,這通常稱為張量并行訓練(Tensor Parallel, TP)來進一步提高效率。
在張量并行中,模型中的大型矩陣乘法操作被分割成更小的部分,這些部分可以在多個計算節(jié)點上并行執(zhí)行。例如,在 Transformer 模型中,矩陣乘法是一個主要的計算瓶頸,通過張量并行,我們可以將權重矩陣分割成更小的塊,每個塊在不同的節(jié)點上并行處理。
在實踐中,模型并行可以包括流水并行和張量并行的組合。一個節(jié)點可以負責模型的一部分(模型并行),同時處理不同的微批次(流水并行),并且在這個節(jié)點內部,大型的矩陣運算可以進一步在多個處理器間分割(張量并行)。這樣的組合可以充分利用分布式計算資源,提高大規(guī)模模型訓練的效率。
AI 框架分布式
對于模型訓練來說,不管是哪一種并行策略其本質上包括將模型進行“縱向”或“橫向”的切分,然后將單獨切分出來的放在不同的機器上進行計算,來充分的利用計算資源。
在現(xiàn)在的 AI 框架中,通常都是采取的多種策略的混合并行來加速模型訓練的。而要支持這種多種并行策略的訓練模型,就需要涉及不同“切分”的模型部分如何通信。
AI 訓練圖切分
如上圖所示,在 AI 計算框架中,我們需要將原來的一個網絡模型進行切分,將其分布在不同的機器上進行計算,這里通過在模型中插入 Send 和 Recv 節(jié)點來進行通信。
除此以外,在分布式的模型訓練中,由于模型的切分我們也需要將模型參數放在不同模型部分所在的機器上,在訓練過程中我們會涉及到不同模型節(jié)點參數的交互和同步,那也需要跨節(jié)點的同步數據和參數,這種就是分布式訓練。
以上我們介紹的都是軟件層面的分布式策略和算法,接下來我們來看下通訊的硬件上是如何實現(xiàn)的。
通訊硬件
在 AI 訓練中,分布式通信是至關重要的,特別是在處理大型模型和海量數據時。分布式通信涉及不同設備或節(jié)點之間的數據傳輸和協(xié)調,以實現(xiàn)并行計算和模型參數同步,如下圖所示。
GPU 服務結構
在機器內通信方面,有幾種常見的硬件:
共享內存:多個處理器或線程可以訪問相同的物理內存,這樣它們可以通過讀寫內存中的數據來進行通信。共享內存適用于在同一臺機器上進行并行計算的情況。
PCIe(Peripheral Component Interconnect Express):PCIe 總線是連接計算設備的一種標準接口,通常用于連接 GPU、加速器卡或其他外部設備。通過 PCIe 總線,數據可以在不同的計算設備之間傳輸,以實現(xiàn)分布式計算。
NVLink:NVLink 是一種由 NVIDIA 開發(fā)的高速互連技術,可實現(xiàn) GPU 之間的直接通信。NVLink 可以提供比 PCIe 更高的帶寬和更低的延遲,適用于要求更高通信性能的任務。
在機器間通信方面,常見的硬件包括:
TCP/IP 網絡:TCP/IP 協(xié)議是互聯(lián)網通信的基礎,它允許不同機器之間通過網絡進行數據傳輸。在分布式計算中,可以使用 TCP/IP 網絡進行機器間的通信和數據傳輸。
RDMA(Remote Direct Memory Access)網絡:RDMA 是一種高性能網絡通信技術,它允許在不涉及 CPU 的情況下直接從一個內存區(qū)域傳輸數據到另一個內存區(qū)域。RDMA 網絡通常用于構建高性能計算集群,提供低延遲和高吞吐量的數據傳輸。
在了解在硬件之后,實現(xiàn)通信不可或缺的是提供集合通信功能的庫。其中,最常用的集合通信庫之一是 MPI(Message Passing Interface),在 CPU 上被廣泛應用。而在 NVIDIA GPU 上,最常用的集合通信庫則是 NCCL(NVIDIA Collective Communications Library)。
NVLink&NVSwitch
如上圖所示,通過 NCCL 庫,我們可以利用 NVLink 或 NVSwitch 將不同的 GPU 相互連接起來。NCCL 在算法層面提供了外部 API,通過這些 API,我們可以方便地進行跨多個 GPU 的集合通信操作。NCCL 的 API 覆蓋了常見的集合通信操作,如廣播、歸約、全局歸約、全局同步等,為開發(fā)者提供了豐富而高效的并行計算工具。
集合通信
集合通信(Collective Communications)是一種涉及進程組中所有進程的全局通信操作。它包括一系列基本操作,如發(fā)送(send)、接收(receive)、復制(copy)、組內進程柵欄同步(Barrier),以及節(jié)點間進程同步(signal + wait)。這些基本操作經過組合可以構成一組通信模板,也稱為通信原語。例如,1 對多的廣播(broadcast)、多對 1 的收集(gather)、多對多的收集(all-gather)、1 對多的發(fā)散(scatter)、多對 1 的規(guī)約(reduce)、多對多的規(guī)約(all-reduce)、組合的規(guī)約與發(fā)散(reduce-scatter)、多對多的全互連(all-to-all)等。下面我們簡單介紹幾個。
集合通信
Gather 操作屬于多對 1 的通信原語,具有多個數據發(fā)送者,一個數據接收者,可以在集群內把多個節(jié)點的數據收集到一個節(jié)點上,他的反向操作對應 Scatter。
Broadcast 屬于 1 對多的通信原語,一個數據發(fā)送者,多個數據接收者,可以在集群內把一個節(jié)點自身的數據廣播到其他節(jié)點上。如上圖所示,當主節(jié)點 0 執(zhí)行 Broadcast 時,數據即從主節(jié)點 0 被廣播至其他節(jié)點。
Scatter 是數據的 1 對多的分發(fā),它將一張 GPU 卡上的數據進行分片再分發(fā)到其他所有的 GPU 卡上。
AllReduce 屬于多對多的通信原語,具有多個數據發(fā)送者,多個數據接收者,其在集群內的所有節(jié)點上都執(zhí)行相同的 Reduce 操作,可以將集群內所有節(jié)點的數據規(guī)約運算得到的結果發(fā)送到所有的節(jié)點上。簡單來說,AllReduce 是數據的多對多的規(guī)約運算,它將所有的 GPU 卡上的數據規(guī)約(比如 SUM 求和)到集群內每張 GPU 卡上。
AllGather 屬于多對多的通信原語,具有多個數據發(fā)送者,多個數據接收者,可以在集群內把多個節(jié)點的數據收集到一個主節(jié)點上(Gather),再把這個收集到的數據分發(fā)到其他節(jié)點上。
AllToAll 操作每一個節(jié)點的數據會 Scatter 到集群內所有節(jié)點上,同時每一個節(jié)點也會 Gather 集群內所有節(jié)點的數據。AllToAll 是對 AllGather 的擴展,區(qū)別是 AllGather 操作中,不同節(jié)點向某一節(jié)點收集到的數據是相同的,而在 AllToAll 中,不同的節(jié)點向某一節(jié)點收集到的數據是不同的。
NVLlink 與 NVSwitch 發(fā)展
NVLink 和 NVSwitch 是英偉達推出的兩項革命性技術,它們正在重新定義 CPU 與 GPU 以及 GPU 與 GPU 之間的協(xié)同工作和高效通信的方式。
NVLink 是一種先進的總線及其通信協(xié)議。NVLink 采用點對點結構、串列傳輸,用于中央處理器(CPU)與圖形處理器(GPU)之間的連接,也可用于多個圖形處理器(GPU)之間的相互連接。
NVSwitch:是一種高速互連技術,同時作為一塊獨立的 NVLink 芯片,其提供了高達 18 路 NVLink 的接口,可以在多個 GPU 之間實現(xiàn)高速數據傳輸。
這兩項技術的引入,為 GPU 集群和深度學習系統(tǒng)等應用場景帶來了更高的通信帶寬和更低的延遲,從而提升了系統(tǒng)的整體性能和效率。
NVLink 發(fā)展
NVLink 發(fā)展
如上圖所示,從 Pascal 架構到 Hoppe 架構,NVLink 已經經過了四代的發(fā)展演進。在 2024 年的 GTC 大會上,NVIDIA 發(fā)布了 Blackwell 架構,其中 NVLink 再次更新,發(fā)布了第五代 NVLink,其中互聯(lián)帶寬達到了 1800GB/s。
如上圖所示,每一層 NVLink 的更新,其每個 GPU 的互聯(lián)帶寬都是在不斷的提升,其中 NVLink 之間能夠互聯(lián)的 GPU 數,也從第一代的 4 路到第四代的 18 路。最新的 Blackwell 架構其最大互聯(lián) GPU 數,并未增加。
NVLink 發(fā)展
從上圖可以看出,在 P100 中每一個 NVLink 只有 40GB/s,而從第二代 V100 到 H100 每一個 NVLink 鏈路都有 50GB/s,通過增加了鏈路的數量使得整體帶寬增加。
NVSwitch 發(fā)展
NVSwitch 發(fā)展
如上圖所示,NVSwitch 技術從 Volta 架構到 Hopper 架構,經歷了三代的演進與發(fā)展。在每一代中,每個 GPU 互聯(lián)的芯片模組數量保持不變,都為 8 個,這意味著互聯(lián)的基本結構保持了穩(wěn)定性和一致性。隨著 NVLink 架構的升級,GPU 到 GPU 之間的帶寬卻實現(xiàn)了顯著的增長,因為 NVSwitch 就是 NVLink 具體承載的芯片模組,從 Volta 架構的 300GB/s 增加到了 Hopper 架構的 900GB/s。
下面我們來看下 NVLink 與 NVSwitch 在服務器中的關系。
NVSwitch 發(fā)展
如上圖所示,在 P100 中是只有 NVLink 的,GPU 間通過 CubeMesh 進行互聯(lián)。在 P100 中,每一個 GPU 有 4 路進行互聯(lián),每 4 個組成一個 CubeMesh。
而到了 V100 中,每一個 GPU 可以通過 NVSwitch 合另外一個 GPU 進行互聯(lián)。到了 A100 中,NVSwitch 再次升級,節(jié)省了很多的鏈路,每一個 GPU 可以通過 NVSwitch 和任何一個 GPU 進行互聯(lián)。
到了 H100 中,又有了新的技術突破,單機內有 8 塊 H100 GPU 卡,任意兩個 H100 卡之間都有 900 GB/s 的雙向互聯(lián)帶寬。值得注意的是,在 DGX H100 系統(tǒng)里,四個 NVSwitch 留出了 72 個 NVLink4 連接,用于通過 NVLink-Network Switch 連接到其他 DGX H100 系統(tǒng),從而方便組成 DGX H100 SuperPod 系統(tǒng)。其中,72 個 NVLink4 連接的總雙向帶寬是~3.6TB/s。
總結
在大模型時代,人工智能的發(fā)展越來越依賴于強大的計算資源,尤其是 GPU 資源。為了訓練這些龐大的模型,我們需要采用分布式并行策略,將模型訓練任務分散到多個 GPU 或計算節(jié)點上。這不僅涉及到數據并行和模型并行等策略,還需要高效的分布式通信技術,如 NVLink 和 NVSwitch,來保證數據在不同計算單元間的快速傳輸和同步。
大模型時代的 AI 框架不僅需要支持不同的分布式并行策略,還需要涉及和考慮到分布式通信技術,例如 NVLink 和 NVSwitch 來支持高效的跨節(jié)點通信。
未來隨著模型的規(guī)模將繼續(xù)增長,對計算資源的需求也將不斷上升。我們需要不斷優(yōu)化分布式并行策略,并發(fā)展更高效的分布式通信技術。這不僅僅是軟件上的策略優(yōu)化更新,也涉及到硬件層面的優(yōu)化更新。
NVLink 和 NVSwitch 不斷的更新,進一步提升深度學習模型訓練的速度和效率。通過了解這些通信技術創(chuàng)新和進步,可以幫助我們更好的訓練更大的模型,推動人工智能向更深層次的方向發(fā)展。
-
通信
+關注
關注
18文章
6024瀏覽量
135949 -
gpu
+關注
關注
28文章
4729瀏覽量
128887 -
AI
+關注
關注
87文章
30728瀏覽量
268873
原文標題:淺析GPU分布式通信技術-PCle、NVLink、NVSwitch
文章出處:【微信號:Rocker-IC,微信公眾號:路科驗證】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論