Alibaba Collective Communication Library (ACCL) は、Nvidia Collective Communication Library (NCCL) をベースに、Alibaba Cloud によって開発されたコレクティブ通信ライブラリです。大規模モデル ジョブの通信最適化における Alibaba Cloud のネットワーキング機能と深い専門知識を活用し、ジョブの通信パフォーマンスを向上させます。ACCL は、エラー診断と自己回復機能も備えています。このトピックでは、ACCL の主な機能とインストール方法について説明します。
ACCL でサポートされている拡張機能
ACCL は、環境変数を使用して有効または無効にできる、さまざまな拡張機能をサポートしています。
対応するオープンソース版の NCCL で見つかったバグを修正します。
コレクティブ通信のさまざまなオペレーターとメッセージサイズを最適化し、オープンソースの NCCL よりも優れたパフォーマンスを提供します。
トレーニング中のコレクティブ通信の統計分析を提供し、デバイスのエラーによる速度低下やハングの診断に役立ちます。Alibaba Cloud PAI の Aimaster: エラスティック フォールトトレランス エンジン および C4D: モデル トレーニング ジョブ診断ツール と併用することで、迅速な異常検出と自動フォールトトレランスを実現します。
マルチパス伝送と負荷分散をサポートし、不均一なハッシュによって引き起こされるトレーニング クラスタの輻輳を軽減または解消し、全体的なトレーニング スループットを向上させます。
制限事項
凌雲リソース が利用可能なリージョンでは、凌雲リソースとカスタムイメージを使用して DLC ジョブを送信する前に、ACCL をインストールする必要があります。
ACCL ライブラリのインストール
凌雲が提供する公式イメージには、ACCL がプリインストールされています。公式の凌雲イメージを使用して DLC ジョブを送信する場合、以下の手順は不要です。
ステップ 1: イメージ内の 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/python3.10/dist-packages/torch/lib/libtorch.so /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchbindtest.solddコマンドを使用して、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.8 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.8/lib/libnccl.so.2 |
12.6 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.6/lib/libnccl.so.2 |
12.5 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.5/lib/libnccl.so.2 |
12.4 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.4/lib/libnccl.so.2 |
12.3 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.3/lib/libnccl.so.2 |
12.2 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.2/lib/libnccl.so.2 |
12.1 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.1/lib/libnccl.so.2 |
11.8 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.8/lib/libnccl.so.2 |
11.7 | http://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.7/lib/libnccl.so.2 |
11.4 | http://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/lib64libnccl.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
推奨される環境変数の構成
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 | Alibaba Cloud で使用されるネットワーク マッピングルールを指定します。パラメータが設定されていないか無効な場合、ネットワーク パフォーマンスに影響を与える可能性があります。 |
NCCL_IB_GID_INDEX | RDMA プロトコルで使用する GID。パラメータが設定されていないか無効な場合、NCCL でエラーが発生する可能性があります。 |
NCCL_SOCKET_IFNAME | NCCL が接続を確立するためのポート。仕様によって必要なポートが異なります。パラメータが設定されていないか無効な場合、NCCL は接続を確立できない可能性があります。 |
NCCL_DEBUG | NCCL のログレベル。ログを増やし、効率的なトラブルシューティングを行うには、このパラメータを INFO に設定します。 |
NCCL_IB_HCA | RDMA 通信用のネットワーク インターフェース カード。パラメータが設定されていないか無効な場合、ネットワーク パフォーマンスに影響を与える可能性があります。 |
NCCL_IB_TIMEOUT | RDMA 接続タイムアウト時間。トレーニング ジョブ中のフォールトトレランスを向上させることができます。パラメータが設定されていないか無効な場合、中断が発生する可能性があります。 |
NCCL_IB_QPS_PER_CONNECTION | 接続ごとのキューペアの数。数を適切に増やすことで、ネットワーク スループットを大幅に向上させることができます。 |
NCCL_NET_PLUGIN | NCCL のネットワーク プラグイン。パフォーマンスを確保するために、このパラメータを none に設定して、他のプラグインがロードされないようにすることをお勧めします。 |
ACCL_C4_STATS_MODE | ACCL 統計情報の粒度。このパラメータを CONN に設定して、接続ごとに統計を集計することをお勧めします。 |
ACCL_IB_SPLIT_DATA_NUM | 複数のキューペアにデータを分割して送信するかどうかを指定します。 |
ACCL_IB_QPS_LOAD_BALANCE | 負荷分散を有効にするかどうかを指定します。 |
ACCL_IB_GID_INDEX_FIX | ジョブ開始前に GID の異常を自動的にチェックしてバイパスするかどうかを指定します。有効にするには、パラメータを 1 に設定します。 |
ACCL_LOG_TIME | トラブルシューティングのためにログエントリに時間を追加するかどうかを指定します。有効にするには、パラメータを 1 に設定します。 |