背景:All-reduce 和 Ring 算法
GPU[并行計(jì)算]中需要大規(guī)模地在計(jì)算節(jié)點(diǎn)之間同步參數(shù)梯度,產(chǎn)生了大量的集合通信流量。為了優(yōu)化集合通信性能,業(yè)界開發(fā)了不同的集合通信庫(xCCL),其核心都是實(shí)現(xiàn) All-Reduce,這也是分布式訓(xùn)練最主要的通信方式。
LLM訓(xùn)練中的 All Reduce 操作一般分為三個(gè)步驟:
- 把每個(gè)節(jié)點(diǎn)的數(shù)據(jù)切分成N份;
- 通過reduce-scatter,讓每個(gè)節(jié)點(diǎn)都得到1/N的完整數(shù)據(jù)塊;
- 通過all-gather,讓所有節(jié)點(diǎn)的每個(gè)1/N數(shù)據(jù)塊都變得完整
基于這種流量模式,Ring算法是目前實(shí)現(xiàn)該操作最常見的基礎(chǔ)算法之一。
顧名思義,Ring算法構(gòu)建了一個(gè)環(huán)形網(wǎng)絡(luò)——每個(gè)節(jié)點(diǎn)的數(shù)據(jù)會(huì)被切分成N份數(shù)據(jù)在所有GPU之間移動(dòng),且每個(gè)GPU只和相鄰的GPU通信。這種流水線模式能充分利用所有節(jié)點(diǎn)的發(fā)送和接收帶寬,減少 GPU 等待數(shù)據(jù)的空閑時(shí)間,同時(shí)也改善了傳輸[大數(shù)據(jù)]塊時(shí)的性能和時(shí)延抖動(dòng)問題。(但對于小規(guī)模數(shù)據(jù)傳輸,Ring算法可能會(huì)表現(xiàn)出較高的延遲和低效。)
工具說明:NCCL-Tests
NVIDIA提供的NCCL是當(dāng)前面向AI的集合通信事實(shí)標(biāo)準(zhǔn),NCCL-Test 是 NVIDIA 開源的工具,我們可以在官方Github下載來進(jìn)行不同算法的 性能測試 (例如:ring,trees…)。本次測試使用All reduce的ring算法來進(jìn)行性能評估。
**代碼語言:**javascript
復(fù)制
root@bm-2204kzq:~# /usr/local/openmpi/bin/mpirun #多機(jī)集群測試需要使用MPI方式執(zhí)行
--allow-run-as-root
-bind-to none #不將進(jìn)程綁定到特定的CPU核心
-H 172.17.0.215:8,172.17.0.81:8 # host列表,:后指定每臺(tái)機(jī)器要用的GPU數(shù)量
-np 16 #指定要運(yùn)行的進(jìn)程數(shù),等于總GPU數(shù)量
-x NCCL_SOCKET_NTHREADS=16
-mca btl_tcp_if_include bond0
-mca pml ^ucx -mca btl ^openib #指定BTL的value為'^openib'
-x NCCL_DEBUG=INFO #NCCL的調(diào)試級別為info
-x NCCL_IB_GID_INDEX=3
-x NCCL_IB_HCA=mlx5_0:1,mlx5_2:1,mlx5_3:1,mlx5_4:1
-x NCCL_SOCKET_IFNAME=bond0 #指定了 NCCL 使用的網(wǎng)絡(luò)接口
-x UCX_TLS=sm,ud #調(diào)整MPI使用的傳輸模式
-x LD_LIBRARY_PATH -x PATH
-x NCCL_IBEXT_DISABLE=1 #如使用RoCE網(wǎng)絡(luò),此處應(yīng)禁用
-x NCCL_ALGO=ring
/root/nccl-tests/build/all_reduce_perf -b 512 -e 18G -f 2 -g 1 #執(zhí)行all reduce操作
NCCL-Tests常用參數(shù)及解釋
- GPU 數(shù)量
- -t,--nthreads 每個(gè)進(jìn)程的線程數(shù)量配置, 默認(rèn) 1;
- -g,--ngpus 每個(gè)線程的 GPU 數(shù)量,默認(rèn) 1;
- 數(shù)據(jù)大小配置
- -b,--minbytes 開始的最小數(shù)據(jù)量,默認(rèn) 32M;
- -e,--maxbytes 結(jié)束的最大數(shù)據(jù)量,默認(rèn) 32M;
- 數(shù)據(jù)步長設(shè)置
- -i,--stepbytes 每次增加的數(shù)據(jù)量,默認(rèn): 1M;
- -f,--stepfactor 每次增加的倍數(shù),默認(rèn)禁用;
- NCCL 操作相關(guān)配置
- -o,--op 指定哪種操作為reduce,僅適用于Allreduce、Reduce或ReduceScatter等操作。默認(rèn)值為:求和(Sum);
- -d,--datatype 指定使用哪種數(shù)據(jù)類型,默認(rèn) : Float;
- 性能相關(guān)配置
- 測試相關(guān)配置
- -p,--parallel_init <0/1> 使用線程并行初始化 NCCL,默認(rèn): 0;
- -c,--check <0/1> 檢查結(jié)果的正確性。在大量GPU上可能會(huì)非常慢,默認(rèn):1;
- -z,--blocking <0/1> 使NCCL集合阻塞,即在每個(gè)集合之后讓CPU等待和同步,默認(rèn):0;
- -G,--cudagraph 將迭代作為CUDA圖形捕獲,然后重復(fù)指定的次數(shù),默認(rèn):0;
案例驗(yàn)證:優(yōu)化GPU互連拓?fù)?/h2>
下圖是一個(gè)未優(yōu)化的雙機(jī)8卡(H20)組網(wǎng)測試拓?fù)洌?/p>
按照一般CPU云數(shù)據(jù)中心的連接方式,將同服務(wù)器的網(wǎng)卡連接到一臺(tái)交換機(jī)上,兩臺(tái)交換機(jī)之間有4條400G鏈路相連。參與測試的為星融元(Asterfusion)交換機(jī)(CX732Q-N,32 x 400GE QSFP-DD, 2 x 10GE SFP+)。
NCCL-Test 性能測試結(jié)果
**代碼語言:**javascript
復(fù)制
# out-of-place in-place
# size count type redop root time algbw busbw #wrong time algbw busbw #wrong
# (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s)
512 128 float sum -1 56.12 0.01 0.02 0 54.54 0.01 0.02 0
1024 256 float sum -1 55.09 0.02 0.03 0 53.85 0.02 0.04 0
2048 512 float sum -1 55.67 0.04 0.07 0 54.84 0.04 0.07 0
4096 1024 float sum -1 55.70 0.07 0.14 0 55.05 0.07 0.14 0
8192 2048 float sum -1 56.36 0.15 0.27 0 56.53 0.14 0.27 0
16384 4096 float sum -1 57.21 0.29 0.54 0 57.02 0.29 0.54 0
32768 8192 float sum -1 60.74 0.54 1.01 0 59.87 0.55 1.03 0
65536 16384 float sum -1 67.42 0.97 1.82 0 68.41 0.96 1.80 0
131072 32768 float sum -1 109.6 1.20 2.24 0 108.8 1.20 2.26 0
262144 65536 float sum -1 108.3 2.42 4.54 0 108.3 2.42 4.54 0
524288 131072 float sum -1 115.0 4.56 8.55 0 112.8 4.65 8.72 0
1048576 262144 float sum -1 135.0 7.77 14.57 0 129.4 8.10 15.19 0
2097152 524288 float sum -1 144.6 14.51 27.20 0 142.9 14.67 27.51 0
4194304 1048576 float sum -1 222.0 18.89 35.43 0 220.0 19.07 35.75 0
8388608 2097152 float sum -1 396.5 21.15 39.66 0 392.1 21.40 40.12 0
16777216 4194304 float sum -1 736.3 22.78 42.72 0 904.7 18.55 34.77 0
33554432 8388608 float sum -1 1405.5 23.87 44.76 0 1542.0 21.76 40.80 0
67108864 16777216 float sum -1 2679.0 25.05 46.97 0 2721.0 24.66 46.24 0
134217728 33554432 float sum -1 5490.1 24.45 45.84 0 5291.6 25.36 47.56 0
268435456 67108864 float sum -1 10436 25.72 48.23 0 11788 22.77 42.70 0
536870912 134217728 float sum -1 25853 20.77 38.94 0 23436 22.91 42.95 0
1073741824 268435456 float sum -1 47974 22.38 41.97 0 54979 19.53 36.62 0
2147483648 536870912 float sum -1 117645 18.25 34.23 0 117423 18.29 34.29 0
4294967296 1073741824 float sum -1 248208 17.30 32.44 0 229171 18.74 35.14 0
8589934592 2147483648 float sum -1 474132 18.12 33.97 0 476988 18.01 33.77 0
17179869184 4294967296 float sum -1 949191 18.10 33.94 0 965703 17.79 33.36 0
# Out of bounds values : 0 OK
- size (B):操作處理的數(shù)據(jù)的大小,以字節(jié)為單位;
- count (elements):操作處理的元素的數(shù)量;
- type:元素的數(shù)據(jù)類型;
- redo p:使用的歸約操作;
- root:-1 表示這個(gè)操作沒有根節(jié)點(diǎn)(all-reduce 操作涉及到所有的節(jié)點(diǎn));
- time (us):操作的執(zhí)行時(shí)間,以微秒為單位;
- algbw (GB/s):算法帶寬,以 GB/s 為單位;
- busbw (GB/s):總線帶寬,以 GB/s 為單位;
- wrong:錯(cuò)誤的數(shù)量,如果這個(gè)值不是 0,那可能表示有一些錯(cuò)誤發(fā)生。
查看結(jié)果時(shí)需要關(guān)注如下幾點(diǎn):
- 數(shù)據(jù)量增加時(shí),帶寬是否會(huì)下降(下降明顯不符合預(yù)期);
- 帶寬的峰值,每次算到的帶寬峰值,可以只關(guān)注 in 或者 out;
- 平均值,在數(shù)據(jù)量遞增的情況下,可能無法體現(xiàn)最終的結(jié)果;
- 請確保數(shù)據(jù)量足夠大,可以壓到帶寬上限(通過調(diào)整 b、e 或者 n 選項(xiàng))。
分析以上信息可以發(fā)現(xiàn):平均總線帶寬僅22GB/s,在達(dá)到47GB/s左右的峰值流量后,隨著數(shù)據(jù)量越大帶寬性能卻在下降,與正常值相差甚遠(yuǎn)。
機(jī)內(nèi)拓?fù)浞治?/h2>
通過 nvidia-smi topo -m 可以得知機(jī)內(nèi)設(shè)備拓?fù)?/p>
將上表轉(zhuǎn)化為如下示意圖:
NCCL通信路徑分析
NCCL中用Channel的概念表示一個(gè)通信路徑,在初始化的過程會(huì)自動(dòng)感知拓?fù)洳⒂?jì)算最佳的通信路徑。為了更好的利用帶寬和網(wǎng)卡實(shí)現(xiàn)并發(fā)通信,NCCL會(huì)使用多channel。NCCL-test運(yùn)行日志里列出了16組channel如下:
**代碼語言:**javascript
復(fù)制
### ChannelNum:16
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 00/16 : 0 7 5 6 4 3 1 2 8 15 13 14 12 11 9 10
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 01/16 : 0 7 5 6 4 3 1 10 8 15 13 14 12 11 9 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 02/16 : 0 7 5 6 12 11 9 10 8 15 13 14 4 3 1 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 03/16 : 0 7 5 14 12 11 9 10 8 15 13 6 4 3 1 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 04/16 : 0 7 5 6 4 3 1 2 8 15 13 14 12 11 9 10
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 05/16 : 0 7 5 6 4 3 1 10 8 15 13 14 12 11 9 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 06/16 : 0 7 5 6 12 11 9 10 8 15 13 14 4 3 1 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 07/16 : 0 7 5 14 12 11 9 10 8 15 13 6 4 3 1 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 08/16 : 0 7 5 6 4 3 1 2 8 15 13 14 12 11 9 10
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 09/16 : 0 7 5 6 4 3 1 10 8 15 13 14 12 11 9 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 10/16 : 0 7 5 6 12 11 9 10 8 15 13 14 4 3 1 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 11/16 : 0 7 5 14 12 11 9 10 8 15 13 6 4 3 1 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 12/16 : 0 7 5 6 4 3 1 2 8 15 13 14 12 11 9 10
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 13/16 : 0 7 5 6 4 3 1 10 8 15 13 14 12 11 9 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 14/16 : 0 7 5 6 12 11 9 10 8 15 13 14 4 3 1 2
bm-2204kzq:252978:253054 [0] NCCL INFO Channel 15/16 : 0 7 5 14 12 11 9 10 8 15 13 6 4 3 1 2
Device map 顯示 Rank #0-7、#8-15在同一服務(wù)器
**代碼語言:**javascript
復(fù)制
### Device maps
## GPU map
# Rank 0 Group 0 Pid 252978 on bm-2204kzq device 0 [0x0f] NVIDIA H20
# Rank 1 Group 0 Pid 252979 on bm-2204kzq device 1 [0x34] NVIDIA H20
# Rank 2 Group 0 Pid 252980 on bm-2204kzq device 2 [0x48] NVIDIA H20
# Rank 3 Group 0 Pid 252981 on bm-2204kzq device 3 [0x5a] NVIDIA H20
# Rank 4 Group 0 Pid 252982 on bm-2204kzq device 4 [0x87] NVIDIA H20
# Rank 5 Group 0 Pid 252983 on bm-2204kzq device 5 [0xae] NVIDIA H20
# Rank 6 Group 0 Pid 252984 on bm-2204kzq device 6 [0xc2] NVIDIA H20
# Rank 7 Group 0 Pid 252985 on bm-2204kzq device 7 [0xd7] NVIDIA H20
# Rank 8 Group 0 Pid 253834 on bm-2204qhn device 0 [0x0f] NVIDIA H20
# Rank 9 Group 0 Pid 253835 on bm-2204qhn device 1 [0x34] NVIDIA H20
# Rank 10 Group 0 Pid 253836 on bm-2204qhn device 2 [0x48] NVIDIA H20
# Rank 11 Group 0 Pid 253837 on bm-2204qhn device 3 [0x5a] NVIDIA H20
# Rank 12 Group 0 Pid 253838 on bm-2204qhn device 4 [0x87] NVIDIA H20
# Rank 13 Group 0 Pid 253839 on bm-2204qhn device 5 [0xae] NVIDIA H20
# Rank 14 Group 0 Pid 253840 on bm-2204qhn device 6 [0xc2] NVIDIA H20
# Rank 15 Group 0 Pid 253841 on bm-2204qhn device 7 [0xd7] NVIDIA H20
結(jié)合每個(gè)channel的具體路徑信息(詳見文末),在所有16條channel下的機(jī)間流量僅有以下8種固定的rank組合:10-0、2-8、1-10、9-2、6-12、14-4、5-14、13-6,對應(yīng)的,產(chǎn)生通信的網(wǎng)卡有且僅有:
**代碼語言:**javascript
復(fù)制
優(yōu)化前性能不佳的原因是: 所有跨節(jié)點(diǎn)的并行流量都需跨交換機(jī)在四條互聯(lián)鏈路上[負(fù)載均衡],而現(xiàn)有的ECMP負(fù)載均衡對大流不夠友好,形成了性能瓶頸。
所以在設(shè)計(jì)Scale-out網(wǎng)絡(luò)拓?fù)涞臅r(shí)候,我們應(yīng)讓集群內(nèi)所有同軌道的網(wǎng)卡連接在一臺(tái)交換機(jī)上,使集群性能達(dá)到最優(yōu)。
按此方式調(diào)整后,測得單機(jī)四卡模式跨RoCE交換機(jī)(CX732Q-N)的總線帶寬與網(wǎng)卡直連數(shù)值相近,約195GB/s。
更多內(nèi)容請參考:
https://asterfusion.com/
https://mp.weixin.qq.com/s/HHCxpaidUfAZwH6G6PwmKg
審核編輯 黃宇
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7553瀏覽量
88727 -
AI
+關(guān)注
關(guān)注
87文章
30728瀏覽量
268880 -
SCALE
+關(guān)注
關(guān)注
3文章
14瀏覽量
14059
發(fā)布評論請先 登錄
相關(guān)推薦
評論