Alibaba Collective Communication Library (ACCL) は、Nvidia collective communication library (NCCL) に基づいてAlibaba Cloudによって開発された集団コミュニケーションライブラリです。 大規模モデルジョブの通信最適化におけるAlibaba Cloudのネットワーク機能と深い専門知識を活用し、ジョブの通信パフォーマンスを向上させます。 ACCLは、故障診断と自己回復も備えています。 このトピックでは、ACCLの主な機能とそのインストール方法について説明します。
ACCLがサポートする拡張機能
ACCLは、環境変数を使用して有効または無効にできるさまざまな拡張機能をサポートしています。
NCCLの対応するオープンソースバージョンで見つかったFixsのバグ。
集団通信のためのさまざまな演算子とメッセージサイズを最適化し、オープンソースNCCLに優れたパフォーマンスを提供します。
トレーニング中の集団通信の統計分析を提供し、デバイス障害によるスローダウンやハングの診断に役立ちます。 Alibaba Cloud PAIのAIMaster: ElasticフォールトトレランスエンジンとC4D: モデルトレーニングジョブ診断ツールを併用すると、迅速な異常検出と自動フォールトトレランスが可能になります。
マルチパス送信と負荷分散をサポートし、不均一なハッシュによって引き起こされるトレーニングクラスターの輻輳を軽減または排除し、全体的なトレーニングスループットを向上させます。
制限事項
Lingjunリソースが利用可能なリージョンでLingjunリソースとカスタムイメージを使用してDLCジョブを送信する前に、ACCLをインストールする必要があります。
ACCLライブラリのインストール
Platform for AI (PAI) が提供する公式画像は、ACCLとともにプリインストールされています。 公式画像を使用してDLCジョブを送信する場合、以下の手順は必要ありません。
手順1: Pytorchが画像で使用するNCCLライブラリが動的かどうかを確認します
カスタムイメージコンテナでは、次の手順を実行します。
PyTorchライブラリの場所を決定します。
PyTorchがインストールされているパスがわかっている場合は、パス内で検索します。 たとえば、PyTorchが
/usr/local/lib
にある場合は、次のコマンドを使用してlibtorch.so
ファイルを見つけます。find /usr/local/lib -name "libtorch*" # Example results: /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchcuda.so /usr/local/lib/python3.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
同様の結果が返された場合、NCCLライブラリは動的であり、ACCLのダウンロードとインストールに進むことができます。
libnccl.so.2=>/usr/lib/x86_64-linux-gnu/libnccl.so.2(0x00007feab3b27000)
結果が返されない場合、NCCLは静的であり、ACCLをインストールすることはできません。 公式のNVIDIA NGCイメージに基づいてカスタムイメージを作成するか、動的NCCLライブラリに依存するPyTorchバージョンに切り替える必要があります。
ステップ2: 画像で使用されているCUDAバージョンを確認する
カスタムイメージコンテナで、次のコマンドを使用してCUDAのバージョンを確認します。
nvidia-smi
以下の出力は、CUDAバージョンが12.2であることを示します。 コマンドによって返される実際のバージョンを参照してください。
ステップ3: CUDAバージョンに対応するACCLをダウンロード
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
ステップ4: 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/
手順5: 動的ライブラリの更新
次のコマンドで動的ライブラリキャッシュを更新します。
sudo ldconfig
ステップ6: チェック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
推奨される環境変数の設定
PAIチームは、ACCLの豊富な経験に基づいて、さまざまな設定で通信スループットを向上させることができる環境変数のリストを作成します。
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 | Alibaba Cloudが使用するネットワークマッピングルールを指定します。 パラメータが設定されていないか無効である場合、ネットワークパフォーマンスが影響を受ける可能性があります。 |
NCCL_IB_GID_INDEX | RDMAプロトコルの使用のためのGID。 パラメーターが設定されていないか無効な場合、NCCLでエラーが発生する可能性があります。 |
NCCL_SOCKET_IFNAME | NCCLが接続を確立するためのポート。 異なる仕様は異なるポートを必要とする。 パラメータが設定されていないか無効な場合、NCCLは接続の確立に失敗する可能性があります。 |
NCCL_デバッグ | NCCLのログレベル。 より多くのログと効率的なトラブルシューティングのために、このパラメータをINFOに設定します。 |
NCCL_IB_HCA | RDMA通信用のネットワークインターフェースカード。 パラメータが設定されていないか無効である場合、ネットワークパフォーマンスが影響を受ける可能性があります。 |
NCCL_IB_タイムアウト | RDMA接続のタイムアウト時間。トレーニングジョブ中のフォールトトレランスを強化できます。 パラメータが設定されていないか無効である場合、中断が発生します。 |
NCCL_IB_QPS_PER_接続 | 接続ごとのキューペアの数。 数を適切に増やして、ネットワークスループットを大幅に向上させることができます。 |
NCCL_NET_プラグイン | NCCLのネットワークプラグイン。 パフォーマンスを確保するために他のプラグインがロードされないように、このパラメーターをnoneに設定することを推奨します。 |
ACCL_C4_STATS_MODE | ACCL統計情報の粒度。 このパラメーターをCONNに設定することを推奨します。これにより、接続ごとに統計が集計されます。 |
ACCL_IB_SPLIT_DATA_NUM | 送信のためにデータを複数のキューペアに分割するかどうかを指定します。 |
ACCL_IB_QPS_LOAD_バランス | 負荷分散を有効にするかどうかを指定します。 |
ACCL_IB_GID_INDEX_FIX | ジョブ開始前にGID異常を自動的にチェックしてバイパスするかどうかを指定します。 パラメーターを1に設定して有効にします。 |
ACCL_LOG_TIME | トラブルシューティングのためにログエントリに時間を追加するかどうかを指定します。 パラメーターを1に設定して有効にします。 |