分散トレーニングの構成には主に次の側面が含まれます。
- プロセス構成
- 総プロセス数を設定 RANK_SIZE
- 各プロセスに一意の RANK_ID を割り当てる
- プロセスごとに DEVICE_ID を指定します
- 通信配置
- Horovod または PyTorch を使用した分散バックエンド (gloo/nccl)
- 通信ポートやその他のパラメータを設定する
- データの並列性
- データセットをシャーディングして、各プロセスがデータの一部を担当するようにします。
- サンプラーのサンプリング モードを分散サンプリングとして設定する
- モデルの並列性
- モデルを異なるプロセスに分割して、モデルの並列トレーニングを実現します。
- グラデーションとパラメータを前方と後方で同期させる
- オプティマイザー構成
- DistributedOptimizer などの分散オプティマイザーを使用する
- さまざまなプロセスが勾配を集約し、モデルパラメータを更新します
- 初期化
- プロセスグループ、分散バックエンドの初期化、通信の確立
- ブロードキャストパラメータにより、さまざまなプロセスモデルの一貫した初期化を保証します
- 保存してロードする
- チェックポイントを保存するときに各プロセスのパラメータを集計します
- ロード時に各プロセスにブロードキャストする
- ロギング
- 追跡とデバッグを容易にするためにプロセス ID 情報を追加します。
上記のプロセスに従って分散環境を構成すると、分散データ並列処理またはモデル並列処理を実現し、モデルのトレーニングを高速化できます。
練習する:
実際の運用で使用される国産フレームワーク MindSpore とファーウェイの分散通信ツールhccl (付録 1 を参照):
まず、デバイスのネットワーク カード IP が物理環境で構成されていることを確認します。
hccn_tool -i 0 -ip -s address 192.168.100.101 netmask 255.255.255.0
hccn_tool -i 1 -ip -s address 192.168.101.101 netmask 255.255.255.0
hccn_tool -i 2 -ip -s address 192.168.102.101 netmask 255.255.255.0
hccn_tool -i 3 -ip -s address 192.168.103.101 netmask 255.255.255.0
hccn_tool -i 4 -ip -s address 192.168.100.100 netmask 255.255.255.0
hccn_tool -i 5 -ip -s address 192.168.101.100 netmask 255.255.255.0
hccn_tool -i 6 -ip -s address 192.168.102.100 netmask 255.255.255.0
hccn_tool -i 7 -ip -s address 192.168.103.100 netmask 255.255.255.0
次に、hccl_tool スクリプトをベアメタルにダウンロードして解凍します。
git clone https://gitee.com/mindspore/models/tree/master/utils/hccl_tools
使用法:
python3 hccl_tools.py --device_num "[0,8)"
生成された hccl_8p.json を実行スクリプトに移動します (ResNet を例にします)
mv ./hccl_8p.json models-master/official/cv/resnet/scripts/
よくあるエラー:
-
プロセスのrank_idとdevice_idが正しく構成されていません。
異なるプロセスが同じrank_idとdevice_idで構成されています。たとえば、複数のプロセスがrank_id=2とdevice_id=6で構成されています。
分散トレーニングにおける各プロセスのrank_idとdevice_idは一意である必要があります。 -
同じ構成の複数のプロセスが繰り返し起動されています。
一部のプロセスは同じ構成ですが、複数のインスタンスが起動されており、分散トレーニング例外が発生します。
構成ごとに開始する必要があるプロセスは 1 つだけです。 -
一部のプロセスのみが正常に実行されている
プロセスの実行時間の観点から、一部のプロセスが短時間実行されていますが、これは起動の失敗と終了によるものと考えられます。
失敗の原因を分析するには、これらのプロセスのログを確認する必要があります。 -
プロセス数が不足しています
一部のプロセスしか起動されておらず、分散学習に必要なプロセス数が不足しています。
十分な数のプロセスが起動されるようにするには、起動スクリプトが正しいかどうかを確認する必要があります。
次のような対策が考えられます。
- 各プロセスのrank_idおよびdevice_id設定を注意深くチェックして、一意性を確保してください。
- 冗長で繰り返されるプロセスを構成ごとに 1 つずつ削除します。
- 起動に失敗したプロセスのログを確認して、起動時の問題をトラブルシューティングします。
- 必要な数のプロセスを適切に開始するように起動スクリプトを調整します。
- 起動時にログを追加し、各プロセスのrank_idとdevice_idを出力し、構成が正しいことを確認します。
マルチカード並列トレーニング中のランク テーブルの設定ミス:
Invalid ranktable, with rank_id [4] and local device_id [4].
Rank_id と device_id が一致しません。ランクテーブル情報には4枚のカードが構成されており、rank_idはそれぞれ0、1、2、3である。
しかし、現在のプロセスのrank_idは4であり、ランクテーブルの範囲内にありません。同時に、device_id も 4 となり、ランク テーブルと一致しません。
解決策は次のとおりです。
- ランク テーブルの構成が正しいかどうかを確認し、現在のトレーニング スクリプトに設定されているデバイスの数がランク テーブルと一致していることを確認します。
- 環境変数 RANK_ID および DEVICE_ID が正しく設定されており、ランク テーブル設定の範囲を超えていないことを確認してください。
- バックアップ カードが構成されている場合は、バックアップ カードのrank_idを追加で構成する必要があります。
- 各カードのプロセスが異なる Rank_id で設定されていることを確認します。これは、ランク テーブル内の対応する device_id および Rank_id と一致します。
- Rank_id の重複を避けるために、各カードが 1 つのトレーニング スクリプト プロセスのみを開始するようにしてください。
- トレーニングを再開して、環境変数、プロセス、ランク テーブルの構成が一貫していることを確認します。
マルチカード トレーニングでは、分散タスクが正常に実行できるように、各プロセスの Rank_id がデバイスに完全に対応していることを確認する必要があります。
これにより、プロセス構成エラーが回避され、分散トレーニングが正常に続行できるようになります。
8 枚のカードの同時トレーニング:
- プロフィールチェック
hccl.json ファイルの構成が正しいかどうか、hccl.json ファイル内の IP アドレスがデバイスの実際の IP アドレスに対応しているかどうか、server_count が実際のデバイスの数と一致しているかどうか、 device_ip と Rank_id が 1 対 1 で対応しているかどうか、環境変数の設定が正しいかどうか、RANK_SIZE が 8 に設定されているかどうか、各カードの RANK_ID が一意であり、hccl.json の Rank_id と一致しているかどうか
- デバイスステータスチェック
npu-smi info を使用して 8 枚のカードすべてがオンラインかどうかを確認します。ps -ef | grep Python を使用して 8 つのプロセスすべてが開始されているかどうかを確認します。各プロセスのログを確認して 4 枚のカードのみが実行されているかどうかを確認します。プロセスが実行されているかどうかを確認します
。一部のデバイスでのみ開始されます。ログを出力して、スクリプトの実行時に DEVICE_ID が 0 ~ 7 であるかどうかを確認します。スクリプト内にデバイス
の一部のみを使用するロジックがあるかどうかを確認します。デバイス リソース制限のトラブルシューティングを行います。ulimit を使用します。デバイスのリソース制限が十分であるかどうかを確認します
hccl.json ファイル、環境変数、デバイスのステータス、プロセスが一部のカードでのみ開始されているかどうか、リソースの制限などを段階的に確認する必要があります。
矛盾した構成を見つけたら、それを修正し、8 カード プロセスが正常に実行されるまでトレーニングを再開します。
添付資料 1:
Huawei の HCCL (Heterogeneous Computing Communication Library) は分散通信ツールです。これは、異種コンピューティング用にファーウェイが独自に開発した高性能通信ライブラリであり、効率的でスケーラブルな通信および協調コンピューティング機能を提供するように設計されています。
HCCL は、GPU、FPGA などの異なるデバイス間のデータ送信と通信を実現できます。異なるデバイス間でのデータ交換、共有、共同コンピューティングを可能にする一連のインターフェイスとプロトコルを提供し、それによって複雑なコンピューティング タスクを高速化します。
HCCL は、人工知能の分野、特に深層学習と大規模コンピューティングで広く使用されています。HCCL を使用すると、ユーザーはコンピューティング タスクを複数のデバイスに分割し、効率的な通信メカニズムを通じてこれらのデバイスを接続して、分散コンピューティングと協調処理を実現し、コンピューティングのパフォーマンスと効率をさらに向上させることができます。