- 単一プロセスを追跡する: W&B を使って、rank 0 プロセス(「leader」や「coordinator」とも呼ばれます)を追跡します。これは、PyTorch Distributed Data Parallel (DDP) クラスを使う分散学習 Experiments をログに記録する際の一般的な方法です。
- 複数プロセスを追跡する: 複数プロセスの場合、次のいずれかを行います:
- プロセスごとに 1 つの run を用いて、それぞれのプロセスを個別に追跡します。必要に応じて、W&B App UI でそれらをグループ化できます。
- すべてのプロセスを 1 つの run に対して追跡します。
単一プロセスをトラッキングする
wandb.init() を使って W&B の run を初期化し、その run に対して実験をログ(wandb.log)に記録します。
次の サンプル Python スクリプト(log-ddp.py) は、PyTorch DDP を使用して単一マシン上の 2 つの GPU でメトリクスをトラッキングする 1 つの方法を示しています。PyTorch DDP(torch.nn の DistributedDataParallel)は、分散学習用の一般的なライブラリです。基本原則はあらゆる分散学習セットアップに適用できますが、実装は異なる場合があります。
この Python スクリプトは次のことを行います:
torch.distributed.launchで複数のプロセスを起動します。- コマンドライン引数
--local_rankを使って rank を確認します。 - rank が 0 に設定されている場合、
train()関数内で、条件に応じてwandbのロギングを設定します。


複数プロセスをトラッキングする
- 各プロセスを個別にトラッキングする:各プロセスごとに run を作成します。
- すべてのプロセスを単一の run にトラッキングする。
各プロセスを個別にトラッキングする
wandb.Run.finish() を呼び出して run の完了をマークし、すべてのプロセスが正しく終了するようにします。
複数の実験にまたがる run を管理し続けるのが難しくなる場合があります。その対策として、W&B を初期化する際に group パラメータに値を指定してください(wandb.init(group='group-name'))。これにより、どの run がどの実験に属しているかを整理できます。Experiments 内での学習および評価用の W&B Runs のトラッキング方法については、Group Runs を参照してください。
個々のプロセスからのメトリクスをトラッキングしたい場合は、このアプローチを使用してください。 典型的な例としては、各ノード上のデータと予測(データ分散のデバッグ用)や、メインノード以外での個々のバッチに関するメトリクスなどがあります。このアプローチは、すべてのノードからのシステムメトリクスを取得したり、メインノードで利用可能な要約統計量を取得したりするためには必要ありません。

分散実行の run を整理する
job_type パラメータを設定します(wandb.init(job_type='type-name'))。たとえば、メインの調整用ノードと、いくつかのレポート用ワーカーノードがあるとします。メインの調整用ノードには job_type を main に、レポート用ワーカーノードには worker に設定します。
job_type を設定したら、ワークスペース内で保存済みビューを作成して run を整理できます。右上の … アクションメニューをクリックし、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 を
複数のプロセスを 1 つの run にトラッキングする
要件複数のプロセスを 1 つの run にトラッキングするには、次が必要です。
-
W&B Python SDK バージョン
v0.19.9以降 - W&B Server v0.68 以降
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パラメータをTrueに設定します。 - 任意で、W&B がメトリクスをトラッキングする GPU を指定するために、GPU インデックスのリスト ([0,1,2]) を
x_stats_gpu_device_idsに渡します。リストを指定しない場合、W&B はマシン上のすべての GPU のメトリクスをトラッキングします。
x_primary=True は、プライマリノードとワーカーノードを区別します。プライマリノードだけが、設定ファイルやテレメトリなど、ノード間で共有されるファイルをアップロードします。ワーカーノードはこれらのファイルをアップロードしません。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パラメータをFalseに設定します。
- 共有モードを有効にするために、
- プライマリノードで使用した run ID を
idパラメータに渡します。 - 任意で、
x_update_finish_stateをFalseに設定します。これにより、非プライマリノードが run の状態 を早期にfinishedに更新することを防ぎ、run の状態がプライマリノードによって一貫して管理されるようにします。
- すべてのノードで同じ entity と project を使用してください。これにより、正しい run ID が見つかりやすくなります。
- 各ワーカーノードで、プライマリノードの run ID を設定する環境変数を定義することを検討してください。
GKE 上の複数ノード・複数 GPU の Kubernetes クラスターでモデルを学習する方法をエンドツーエンドで示した例については、Distributed Training with Shared Mode レポートを参照してください。
- run を含むプロジェクトに移動します。
- プロジェクトのサイドバーで Runs タブをクリックします。
- 表示したい run をクリックします。
- プロジェクトのサイドバーで Logs タブをクリックします。
x_label に指定したラベルに基づいてコンソールログをフィルタリングできます。たとえば、次の画像は、x_label に rank0、rank1、rank2、rank3、rank4、rank5、rank6 という値を指定した場合に、どのオプションでコンソールログをフィルタリングできるかを示しています。

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

使用例
プロセスの生成
wandb.setup() メソッドを呼び出してください。
トラブルシューティング
- 学習の開始時にハングする - 分散学習で使用しているマルチプロセッシングと
wandbのマルチプロセッシングが干渉すると、wandbプロセスがハングする場合があります。 - 学習の終了時にハングする -
wandbプロセスがいつ終了すべきか分からない場合、学習ジョブがハングすることがあります。Python スクリプトの最後でwandb.Run.finish()API を呼び出して、run が完了したことを W&B に通知してください。wandb.Run.finish()API はデータのアップロードを完了し、W&B を終了させます。 W&B は、分散ジョブの信頼性を向上させるためにwandb serviceコマンドの使用を推奨しています。上記 2 つの問題は、wandb service が利用できないバージョンの W&B SDK でよく見られます。
W&B Service を有効化する
W&B SDK 0.13.0 以上
0.13.0 以上では、W&B Service がデフォルトで有効になります。
W&B SDK 0.12.5 以上
wandb.require メソッドを使用し、文字列 "service" を引数として渡します。
WANDB_START_METHOD 環境変数を "thread" に設定してください。