ACCL:阿里云自研高性能集合通信庫(kù)
ACCL(Alibaba Collective Communication Library)是阿里云自研的,基于NCCL(Nvidia Collective Communication Library)開(kāi)發(fā)的集合通信庫(kù)。它結(jié)合阿里云自身網(wǎng)絡(luò)特點(diǎn)以及豐富的大模型任務(wù)通信調(diào)優(yōu)經(jīng)驗(yàn),可為客戶任務(wù)提供更高的通信性能,并且具備一定的故障診斷和自愈能力。本文為您介紹ACCL的主要特性和安裝方法。
ACCL支持的增強(qiáng)特性
ACCL目前支持的主要增強(qiáng)特性清單如下,所有的增強(qiáng)特性都支持通過(guò)環(huán)境變量來(lái)開(kāi)啟或關(guān)閉:
修復(fù)了對(duì)應(yīng)NCCL社區(qū)開(kāi)源版本的BUG;
對(duì)集合通信不同算子和不同消息區(qū)間進(jìn)行了調(diào)優(yōu),使其相比開(kāi)源NCCL擁有更好的性能;
支持訓(xùn)練過(guò)程中集合通信統(tǒng)計(jì)分析,可用于診斷訓(xùn)練過(guò)程中設(shè)備故障導(dǎo)致的計(jì)算/通信Slow(慢)和Hang(掛起)等問(wèn)題,配合阿里云PAI的AIMaster:彈性自動(dòng)容錯(cuò)引擎和C4D:模型訓(xùn)練任務(wù)問(wèn)題診斷工具,可以快速的進(jìn)行任務(wù)的異常檢測(cè)和自動(dòng)容錯(cuò);
支持多路徑傳輸和負(fù)載均衡功能,在訓(xùn)練集群中降低甚至消除哈希不均導(dǎo)致的擁塞問(wèn)題,提升整體訓(xùn)練性能;
使用限制
僅在AI計(jì)算資源(靈駿智算資源)部署的地域,使用靈駿智算資源和自定義鏡像提交DLC任務(wù)時(shí),需要安裝ACCL。
安裝方法
PAI官方鏡像默認(rèn)已安裝ACCL,當(dāng)您使用官方鏡像提交DLC任務(wù)時(shí),無(wú)需執(zhí)行以下操作。
步驟一:確認(rèn)鏡像中使用的Pytorch依賴的NCCL庫(kù)是否為動(dòng)態(tài)庫(kù)
在自定義鏡像容器中執(zhí)行以下操作步驟:
確認(rèn)PyTorch庫(kù)所在位置。
如果已知PyTorch安裝于特定目錄,您可以直接在該目錄下進(jìn)行搜索。例如,在確認(rèn)PyTorch位于
/usr/local/lib
的情況下,通過(guò)執(zhí)行查詢命令,成功定位到libtorch.so
文件的具體路徑,如下所示:find /usr/local/lib -name "libtorch*" # 示例結(jié)果如下 /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchcuda.so /usr/local/lib/pvthon3.10/dist-packages/torch/lib/libtorch.so /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchbindtest.so
使用
ldd
命令查看PyTorch庫(kù)依賴NCCL庫(kù)的方式。ldd libtorch.so | grep nccl
如果命令返回結(jié)果為如下形式,則說(shuō)明PyTorch是以動(dòng)態(tài)庫(kù)的方式依賴NCCL,可以繼續(xù)根據(jù)后續(xù)步驟進(jìn)行ACCL的下載與安裝。
libnccl.so.2=>/usr/lib/x86_64-linux-gnu/libnccl.so.2(0x00007feab3b27000)
如果命令返回結(jié)果為空,說(shuō)明PyTorch是以非動(dòng)態(tài)庫(kù)的方式依賴NCCL,則無(wú)法安裝ACCL。您需要基于NVIDIA官方提供的NGC鏡像制作您自己的鏡像,或者將使用的PyTorch庫(kù)改為依賴NCCL動(dòng)態(tài)庫(kù)的版本,之后才能繼續(xù)下載安裝ACCL。
步驟二:確認(rèn)鏡像中使用的CUDA版本
您可以在自定義鏡像容器中,使用如下命令確認(rèn)當(dāng)前環(huán)境依賴的CUDA版本。
nvidia-smi
返回結(jié)果示例如下圖所示,表明使用的CUDA版本為12.2。您的CUDA版本以實(shí)際返回結(jié)果為準(zhǔn)。
步驟三:下載CUDA版本對(duì)應(yīng)的ACCL
CUDA版本對(duì)應(yīng)的ACCL下載鏈接如下:
CUDA版本 | ACCL庫(kù)下載鏈接 |
12.3 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.3/lib/libnccl.so.2 |
12.2 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.2/lib/libnccl.so.2 |
12.1 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.1/lib/libnccl.so.2 |
11.7 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.7/lib/libnccl.so.2 |
11.4 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.4/lib/libnccl.so.2 |
您可以在自定義鏡像容器中,使用如下命令下載與CUDA版本相對(duì)應(yīng)的ACCL,以CUDA 12.3版本為例:
wget http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.3/lib/libnccl.so.2
步驟四:安裝ACCL庫(kù)
在安裝ACCL庫(kù)之前,您需要先確認(rèn)系統(tǒng)是否已經(jīng)安裝NCCL。您可以使用如下命令確認(rèn)libnccl.so.2
庫(kù)文件是否已存在:
sudo find / -name "libnccl.so.2"
在查詢結(jié)果中,可能會(huì)出現(xiàn)以下兩種情況,并針對(duì)每種情況給出相應(yīng)的處理措施:
未發(fā)現(xiàn)
libnccl.so.2
文件,或者該文件存在于/usr/lib64
或/lib64
系統(tǒng)目錄中。針對(duì)該情況,您可以直接使用cp
命令,將新下載的libnccl.so.2
文件復(fù)制到上述任一缺失的系統(tǒng)目錄中,以確保其可用性。sudo cp -f ./libnccl.so.2 /usr/lib64
如果搜到
libnccl.so.2
文件位于其它目錄,比如/opt/xxx/
,這種情況可能是因?yàn)?span id="z68uejxpaoma" class="help-letter-space">NCCL的安裝目錄未使用默認(rèn)路徑導(dǎo)致的。您同樣可以使用cp命令直接將新下載的libnccl.so.2文件復(fù)制到該目錄,以覆蓋現(xiàn)有文件。sudo cp -f libnccl.so.2 /opt/xxx/
步驟五:刷新動(dòng)態(tài)庫(kù)
在自定義鏡像容器中,使用如下命令刷新動(dòng)態(tài)庫(kù)緩存。
sudo ldconfig
步驟六:確認(rèn)是否成功加載ACCL庫(kù)
使用自定義鏡像提交DLC任務(wù),詳情請(qǐng)參見(jiàn)創(chuàng)建訓(xùn)練任務(wù)。
查看任務(wù)日志,如果在任務(wù)啟動(dòng)日志中顯示了如下ACCL版本信息,則表明該任務(wù)已成功應(yīng)用了ACCL庫(kù)。如何查看任務(wù)日志,請(qǐng)參見(jiàn)查看訓(xùn)練詳情。
說(shuō)明日志中務(wù)必出現(xiàn)
accl-n
標(biāo)識(shí),缺失則表明ACCL庫(kù)未成功加載。NCCL version 2.20.5.7-accl-n+cuda12.4, COMMIT_ID Zeaa6674c2f1f896e3a6bbd77e85231e0700****, BUILD_TIME 2024-05-10 15:40:56
推薦的環(huán)境變量配置
基于日常使用ACCL的經(jīng)驗(yàn),PAI團(tuán)隊(duì)整理了一系列能夠在不同環(huán)境中提升通信吞吐率的環(huán)境變量,供您參考使用:
export NCCL_IB_TC=136
export NCCL_IB_SL=5
export NCCL_IB_GID_INDEX=3
export NCCL_SOCKET_IFNAME=eth
export NCCL_DEBUG=INFO
export NCCL_IB_HCA=mlx5
export NCCL_IB_TIMEOUT=22
export NCCL_IB_QPS_PER_CONNECTION=8
export NCCL_MIN_NCHANNELS=4
export NCCL_NET_PLUGIN=none
export ACCL_C4_STATS_MODE=CONN
export ACCL_IB_SPLIT_DATA_NUM=4
export ACCL_IB_QPS_LOAD_BALANCE=1
export ACCL_IB_GID_INDEX_FIX=1
export ACCL_LOG_TIME=1
關(guān)鍵環(huán)境變量說(shuō)明如下:
環(huán)境變量 | 描述 |
NCCL_IB_TC | 該變量匹配了阿里云網(wǎng)絡(luò)映射規(guī)則,若未配置或配置錯(cuò)誤可能會(huì)導(dǎo)致性能受損。 |
NCCL_IB_GID_INDEX | 設(shè)置RDMA協(xié)議使用的GID,若未配置或配置錯(cuò)誤會(huì)導(dǎo)致NCCL報(bào)錯(cuò)。 |
NCCL_SOCKET_IFNAME | NCCL需要選擇正確的端口以建立連接,不同的規(guī)格對(duì)端口的要求不同。若未配置或配置錯(cuò)誤可能會(huì)導(dǎo)致NCCL建連失敗。 |
NCCL_DEBUG | 通常將日志級(jí)別設(shè)置為INFO,這樣可以獲得更多NCCL相關(guān)的日志輸出,有助于定位和解決潛在問(wèn)題。 |
NCCL_IB_HCA | 指定RDMA通信使用的網(wǎng)卡,若未配置或配置錯(cuò)誤可能會(huì)導(dǎo)致性能受損。 |
NCCL_IB_TIMEOUT | 設(shè)置RDMA連接超時(shí)時(shí)間,可以提升訓(xùn)練任務(wù)時(shí)的容錯(cuò)性能。若未配置或配置錯(cuò)誤,可能會(huì)導(dǎo)致訓(xùn)練任務(wù)出現(xiàn)中斷。 |
NCCL_IB_QPS_PER_CONNECTION | 適當(dāng)增加NCCL中每個(gè)連接的QP(Queue Pair)數(shù)量,可以有效提高網(wǎng)絡(luò)吞吐率。 |
NCCL_NET_PLUGIN | 配置NCCL網(wǎng)絡(luò)插件,建議配置為none,以防止誤加載其他插件,從而影響系統(tǒng)性能。 |
ACCL_C4_STATS_MODE | 控制ACCL統(tǒng)計(jì)信息的維度,目前建議配置為CONN,代表按照連接維度進(jìn)行統(tǒng)計(jì)。 |
ACCL_IB_SPLIT_DATA_NUM | 將數(shù)據(jù)拆分到多個(gè)QP(Queue Pair)中進(jìn)行發(fā)送。 |
ACCL_IB_QPS_LOAD_BALANCE | 是否開(kāi)啟Load Balance功能。 |
ACCL_IB_GID_INDEX_FIX | 配置為1后,在任務(wù)啟動(dòng)前會(huì)自動(dòng)檢查GID是否異常,并且可以自動(dòng)繞過(guò)這類異常。 |
ACCL_LOG_TIME | 配置為1后,在打印的日志前會(huì)加上具體的時(shí)間,方便定位問(wèn)題。 |