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後,在列印的日誌前會加上具體的時間,方便定位問題。 |