- 単一のプロセスをトラッキングする: rank 0 のプロセス (「リーダー」または「コーディネーター」とも呼ばれます) を W&B でトラッキングします。これは、PyTorch Distributed Data Parallel (DDP) クラスを使用した分散トレーニングの実験をログする際の一般的な方法です。
- 複数のプロセスをトラッキングする: 複数のプロセスをトラッキングするには、次のいずれかの方法を使用できます。
- プロセスごとに 1 つの run を使用して、各プロセスを個別にトラッキングします。必要に応じて、W&B App UI でこれらの run をグループ化できます。
- すべてのプロセスを単一の run にトラッキングします。
単一プロセスをトラッキングする
このセクションでは、rank 0 のプロセスで取得できる値とメトリクスをトラッキングする方法について説明します。この方法は、単一のプロセスから取得できるメトリクスのみをトラッキングする場合に使用します。代表的なメトリクスには、GPU/CPU 使用率、共有検証セットでの動作、勾配とパラメーター、代表的なデータサンプルに対する損失値などがあります。 rank 0 のプロセス内でwandb.init() を使用して W&B run を初期化し、その run に実験をログします (wandb.Run.log()) 。
次のサンプル Python スクリプト (log-ddp.py) は、PyTorch DDP を使用して 1 台のマシン上の 2 つの GPU でメトリクスをトラッキングする方法の一例です。PyTorch DDP (torch.nn の DistributedDataParallel) は、分散トレーニングで広く使われているライブラリです。基本的な考え方はどのような分散トレーニング構成にも当てはまりますが、実装は異なる場合があります。
この Python スクリプトは次の処理を行います。
torch.distributed.launchで複数のプロセスを起動します。--local_rankコマンドライン引数で rank を確認します。- rank が 0 の場合は、
train()関数内でwandbによるログを条件付きで設定します。


複数のプロセスをトラッキングする
W&B で複数のプロセスをトラッキングするには、次のいずれかの方法を使用します。- プロセスごとに run を作成して、各プロセスを個別にトラッキングする。
- すべてのプロセスを単一の run でトラッキングする。
各プロセスを個別にトラッキングする
このセクションでは、プロセスごとに run を作成して、各プロセスを個別にトラッキングする方法について説明します。各 run では、メトリクスやアーティファクトなどをそれぞれの run にログします。トレーニングの最後にwandb.Run.finish() を呼び出して run の完了を示し、すべてのプロセスが正しく終了するようにします。
複数の実験にまたがる run をトラッキングするのは難しい場合があります。これに対処するには、W&B の初期化時に group パラメーターに値を指定し (wandb.init(group='group-name'))、各 run がどの実験に属するかをトラッキングします。実験内のトレーニング用および評価用の W&B run をトラッキングする方法の詳細については、Group Runs を参照してください。
個々のプロセスのメトリクスをトラッキングしたい場合は、この方法を使用してください。典型的な例としては、各ノード上のデータと予測 (データ分布のデバッグ用) や、メインノード以外での個々のバッチのメトリクスが挙げられます。すべてのノードからシステムメトリクスを取得する場合や、メインノードで利用可能なサマリー統計を取得する場合には、この方法は必要ありません。

分散 run を整理する
W&B の初期化時にjob_type パラメーターを設定すると (wandb.init(job_type='type-name')) 、ノードを役割ごとに分類できます。たとえば、全体を調整するメインノードと、結果を報告する複数のワーカーノードがあるとします。この場合、メインの調整ノードでは job_type を main に、報告を行うワーカーノードでは worker に設定します:
job_type を設定したら、Workspace に 保存済みビュー を作成して run を整理できます。右上の action () メニューをクリックし、Save as new view をクリックします。
たとえば、次のような保存済みビューを作成できます。
- Default view: ワーカーノードを除外してノイズを減らします
-
Filter をクリックし、Job Type を
workerに設定します。 - レポート用のノードのみが表示されます
-
Debug view: トラブルシューティング用にワーカーノードに絞り込みます
- Filter をクリックし、Job Type を
==workerに、State をINcrashedに設定します。 - クラッシュしたワーカーノード、またはエラー状態のワーカーノードのみが表示されます
- Filter をクリックし、Job Type を
-
All nodes view: すべてのノードをまとめて表示します
- フィルターなし
- 全体をモニタリングする場合に便利です
-
Filter をクリックし、Job Type を
すべてのプロセスを単一の run にトラッキングする
要件複数のプロセスを単一の run にトラッキングするには、次の要件を満たす必要があります。
-
W&B Python SDK バージョン
v0.19.9以降。 - W&B Server v0.68 以降。
wandb.init() で W&B run を初期化します。その際、次の内容を指定した wandb.Settings オブジェクトを settings パラメーター (wandb.init(settings=wandb.Settings()) に渡します。
- 共有モードを有効にするため、
modeパラメーターを"shared"に設定します。 x_labelに一意のラベルを指定します。x_labelに指定した値は、W&B App UI のログやシステムメトリクスで、データの送信元ノードを識別するために使用します。指定しない場合は、ホスト名とランダムなハッシュを使用したラベルが W&B によって自動的に作成されます。- このノードがプライマリノードであることを示すため、
x_primaryパラメーターをTrueに設定します。 - 必要に応じて、
x_stats_gpu_device_idsに GPU インデックスのリスト ([0,1,2]) を指定し、W&B がメトリクスをトラッキングする GPU を指定します。リストを指定しない場合、W&B はマシン上のすべての GPU のメトリクスをトラッキングします。
WANDB_RUN_ID 環境変数に設定します。プロセスが wandb.init() を呼び出すと、W&B は WANDB_RUN_ID を自動的に読み取ります。
x_primary=True によって、プライマリノードとワーカーノードが区別されます。設定ファイルやテレメトリなど、ノード間で共有されるファイルをアップロードするのはプライマリノードだけです。ワーカーノードはこれらのファイルをアップロードしません。wandb.init() で W&B run を初期化し、次のように指定します。
settingsパラメーター (wandb.init(settings=wandb.Settings()) に、次の内容を指定したwandb.Settingsオブジェクトを渡します。- 共有モードを有効にするため、
modeパラメーターを"shared"に設定します。 x_labelに一意のラベルを指定します。x_labelに指定した値は、W&B App UI のログやシステムメトリクスで、データの送信元ノードを識別するために使用します。指定しない場合は、ホスト名とランダムなハッシュを使用したラベルが W&B によって自動的に作成されます。- このノードがワーカーノードであることを示すため、
x_primaryパラメーターをFalseに設定します。
- 共有モードを有効にするため、
- ワーカープロセスを開始する前に、プライマリノードと同じ生成済みの run ID を
WANDB_RUN_IDに設定します。 - 必要に応じて、
x_update_finish_stateをFalseに設定します。これにより、プライマリ以外のノードが run の状態 を途中でfinishedに更新してしまうことを防ぎ、run の状態をプライマリノードで一貫して管理できます。
WANDB_RUN_ID を設定した後に、各プロセス内で行う W&B のセットアップを示しています。
次の例では、プライマリノードで run を初期化します。
GKE 上のマルチノード・マルチ GPU の Kubernetes クラスターでモデルをトレーニングするエンドツーエンドの例については、Distributed Training with Shared Mode report を参照してください。
- run を含む project にアクセスします。
- プロジェクトのサイドバーで Runs タブをクリックします。
- 表示する run をクリックします。
- プロジェクトのサイドバーで Logs タブをクリックします。
x_label に指定したラベルでコンソールログをフィルターできます。たとえば次の画像は、x_label に rank0、rank1、rank2、rank3、rank4、rank5、rank6 の値を指定した場合に、コンソールログのフィルターで選択できるオプションを示しています。`

x_label パラメーターで指定した一意のラベル (rank_0、rank_1、rank_2) が付与されています。

ユースケースの例
以下のコードスニペットでは、高度な分散処理のユースケースでよく見られるシナリオを紹介します。プロセスの生成
生成されたプロセスで run を開始する場合は、メイン関数でwandb.setup() メソッドを使用します。
run を共有する
プロセス間で run を共有するには、Run オブジェクトを引数として渡します。トラブルシューティング
W&B と分散トレーニングを併用する際に発生しやすい、よくある問題が 2 つあります。- トレーニング開始時にハングする -
wandbのマルチプロセッシングが分散トレーニングのマルチプロセッシングと干渉すると、wandbプロセスがハングすることがあります。 - トレーニング終了時にハングする -
wandbプロセスが終了すべきタイミングを認識できないと、トレーニング ジョブがハングすることがあります。Python スクリプトの最後でwandb.Run.finish()API を呼び出し、run が終了したことを W&B に通知してください。wandb.Run.finish()API を呼び出すと、データのアップロードが完了し、W&B が終了します。 分散ジョブの信頼性を高めるため、W&B ではwandb serviceコマンドの使用を推奨しています。上記のトレーニングに関する問題はいずれも、wandb service を利用できないバージョンの W&B SDK でよく発生します。
W&B Service を有効にする
ご使用の W&B SDK のバージョンによっては、W&B Service がすでにデフォルトで有効になっている場合があります。W&B SDK 0.13.0 以降
W&B SDK0.13.0 以降のバージョンでは、W&B Service はデフォルトで有効になっています。
W&B SDK 0.12.5 以降
W&B SDK バージョン 0.12.5 以降で W&B Service を有効にするには、Python スクリプトを変更します。メイン関数内でwandb.require() メソッドを使用し、文字列 "service" を渡します。
WANDB_START_METHOD 環境変数を "thread" に設定し、代わりにマルチスレッドを使用してください。