視頻説明

MNNVL 超節點集合通信初識、NCCL、SuperPod、SuperNode,scale-up,Multi-Node NvLink、啥是超節點_嗶哩嗶哩_bilibili

前言

NCCL、ACCL等集合通信庫發展的早期,並沒有超節點(SuperNode/SuperPod)的概念,這些集合通信庫是如何支撐超節點集合通信的?

AllReduce、AlltoAll等集合通信,是現在大模型訓練/推理必不可少的底層支撐。並且隨着大模型參數量不斷上升,對集合通信性能的要求越來越高,超節點(SuperNode/SuperPod)應運而生。

哈哈哈,本文分享:

1、什麼是超節點

2、非超節點的傳統集合通信

3、超節點集合通信

一、什麼是超節點

隨着 AIGC 等大模型參數規模的不斷增長,對 GPU 集羣的規模需求也在不斷擴大,從千卡級到萬卡級甚至更高。傳統的單台服務器受限於空間、功耗和散熱等因素,能塞入的 GPU 數量有限,且基於 PCIe 協議的數據傳輸速率慢、時延高,無法滿足需求。為了解決這些問題,超節點(SuperNode/SuperPod)被提出。超節點是通過超大帶寬低延遲互聯的多 GPU系統,由多台服務器和網絡設備共同組成,這些設備處於同一個超帶寬域。

在集合通信超節點編程中,一個超節點就被叫做一個NvLink域或AccLink域。也就是大家所熟知的MNNVL(Multi-Node NvLink)多節點NvLink或MNACL(Multi-Node AccLink)多節點AccLink。

來個形象點的解釋就是:能夠通過Nvlink/AccLink進行跨服務器(跨節點)超高帶寬超低延遲通信的眾多GPU,就構成了一個超節點。

哈哈哈,再來兩個圖直觀的感受下。


超節點集合通信MNNVL(Multi-Node NvLink)_多節點


圖1是一個超節點麼?顯然不是!服務器A是節點,服務器B是節點,但是服務器A和B之間是通過延遲較高網卡相連,不是通過高帶寬低延遲的NvLink/AccLink相連,不構成一個超節點。

下面的圖2是一個超節點麼?哈哈哈,是的!服務器節點A和服務器節點B的眾多GPU通過NvLink/AccLink相連,構成了NvLink/AccLink域,是多節點的NvLink/AccLink。


超節點集合通信MNNVL(Multi-Node NvLink)_多級_02

二、非超節點的傳統集合通信

哈哈哈,淺淺回顧一下非超節點的集合通信。集合通信早期沒有超節點,集合通信也相對簡單點。

2.1 拓撲識別

非超節點的傳統集合通信拓撲識別核心流程如圖3所示。

1.構建GPU的PCIe樹

2.將網卡添加到GPU的PCIe樹中

3.如果有NvLink/AccLink連接,將NvLink/AccLink添加到拓撲中。


超節點集合通信MNNVL(Multi-Node NvLink)_多節點_03


沒有超節點時,每個服務器節點只需完成自生的拓撲識別,如圖4所示,給出了ACCL識別出來的一台服務器拓撲文件,可以看到CPU、GPU、NIC、直連AccLink、PCIe等信息。

超節點集合通信MNNVL(Multi-Node NvLink)_多節點_04


可以看出,沒有超節點時,每個服務器只完成服務器內拓撲識別,難以滿足超節點集合通信需求。那超節點的拓撲識別是如何做的,見下一章?

2.2 集合通信算法

傳統非超節點集合通信,由於節點內NvLink/AccLink的通信延遲帶寬性能遠高於跨服務器的網卡通信,因此集合通信算法嚴格區分節點內和節點間通信。

最常見的集合通信算法就是服務器內構建ring環,服務器間構建tree樹。

如下圖所示,rank就代表GPU,服務器內構建ring環。

超節點集合通信MNNVL(Multi-Node NvLink)_多級_05

node就代表服務器節點,服務器間構建tree樹。

超節點集合通信MNNVL(Multi-Node NvLink)_服務器_06

由於超節點NvLink/AccLink是跨服務器的,還這麼搞肯定有問題。

三、超節點集合通信

超節點出現後,集合通信的整個框架都做了相應修改和調整。今天呢,我們初步瞭解一下其中一部分內容。

3.1 拓撲識別

3.1.1 NvSwitch/AccSwitch交換芯識別

早期集合通信中,由於GPU數量有限,直接GPU間直連即可,沒有NvSwitch/AccSwitch(NVS/ACS),不需要識別交換芯片。因此在超節點拓撲識別中所要做的第一步就是將NvSwitch/AccSwitch交換芯識別出來。


超節點集合通信MNNVL(Multi-Node NvLink)_多節點_07

如上圖代碼所示,ACS就代表AccSwitch交換芯,將AccSwitch交換芯識別出來,並增加到集合通信的拓撲圖中。

並且只要在system->nodes[ACS].count == 0時才會創建ACS節點,本質如圖5所示,不管實際有多少個AccSwitch交換芯拓撲上將其合併為一個,標識當前服務器裏面有AccSwitch。當然探微芯聯ACCL集合通信庫也支持不合並AccSwitch交換芯的拓撲架構,來進行通信優化,這又是另外一套了,挖個坑,有時間再介紹,哈哈哈,此次我們還是偏NCCL。

超節點集合通信MNNVL(Multi-Node NvLink)_多節點_08

3.1.2 跨服務器拓撲識別

超節點,當然不能只在服務器節點內搞一搞,必須得跨服務器。如下面的圖所示,建立集羣和AccLink域的超節點標識clusterUuid、CliqueId。

超節點集合通信MNNVL(Multi-Node NvLink)_多節點_09

超節點集合通信MNNVL(Multi-Node NvLink)_多級_10

標識通信域之後,進行跨服務器拓撲融合,得到如圖6的AccLink域的超節點拓撲。自此,ACCL構建了自己的超節點拓撲,一個AccLink通信域


超節點集合通信MNNVL(Multi-Node NvLink)_服務器_11

3.2 集合通信算法

針對超節點的集合通信,有一個兩個需要注意的點。

1.有跨服務器的AccLink,當然不用網卡進行通信。

2.多級AccSwitch的影響。

針對第一條,如下圖所示,集合通信時,檢測兩個服務器間能否進行AccLink通信,如果能進行AccLink通信,用AccLink通信,否則才使用網卡進行通信。

超節點集合通信MNNVL(Multi-Node NvLink)_服務器_12

針對第二條,多級AccSwitch的影響,我們將下面的圖7抽象一下。

超節點集合通信MNNVL(Multi-Node NvLink)_多節點_13


抽象一下,得到下面的圖8,可以明顯看出GPU1和GPU2只通過一級ACS(AccSwitch)就能進行通信,而GPU1和和GPU9需要進行兩級ACS(AccSwitch)進行通信,在集合通信中,對能夠一級ACS(AccSwitch)進行通信的GPU進行標記,優先一級ACS,優化通信過程。

超節點集合通信MNNVL(Multi-Node NvLink)_服務器_14


當然ACCL/NCCL超節點還有在網計算、Symmetric Memory對稱內存、單端put/fetch操作,AccSwitch/NvSwitch特性等等。記得點個關注、我們下次有時間繼續分享。就道是紙短情長啊,哈哈哈紙也不短,畢竟電子紙,就是得早點睡覺明天繼續奮鬥。


超節點集合通信MNNVL(Multi-Node NvLink)_服務器_15

文章出處:https://mp.weixin.qq.com/s/OUmLAvBpK_U_QBtO36IOmw