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