PyTorch Distributed ElasticのEtcdRendezvousBackendで現在のジョブ状態を確認する方法


torch.distributed.elastic.rendezvous.etcd_rendezvous_backend.EtcdRendezvousBackend.get_state() は、PyTorch Distributed Elastic における EtcdRendezvousBackend ベックエンドの現在の状態を取得するための関数です。この関数は、分散トレーニングジョブに参加するワーカーノードが、ジョブの状態や他のワーカーノードの情報を確認するために使用されます。

引数

この関数は引数を取らず、現在の状態を返すだけです。

戻り値

この関数は辞書を返します。辞書には、以下のキーと値が含まれます。

  • "status": ジョブの現在のステータス
  • "master_port": マスターワーカーノードのポート
  • "master_address": マスターワーカーノードのアドレス
  • "world_size": 参加するワーカーノードの総数
  • "rank": 現在のワーカーノードのランク
  • "name": ベックエンドの名前

使用例

以下の例は、torch.distributed.elastic.rendezvous.etcd_rendezvous_backend.EtcdRendezvousBackend.get_state() を使用して、ジョブの状態と他のワーカーノードの情報を確認する方法を示しています。

import torch.distributed.elastic as te

rendezvous_backend = te.rendezvous_backend.EtcdRendezvousBackend(
    name="my-job",
    etcd_host="localhost",
    etcd_port=2379,
)

state = rendezvous_backend.get_state()

print(f"Job status: {state['status']}")
print(f"Number of workers: {state['world_size']}")
print(f"Master address: {state['master_address']}")
print(f"Master port: {state['master_port']}")
  • この関数は、デバッグ目的で使用することを想定されています。本番コードでは、ジョブの状態を確認するためにこの関数に依存しないでください。
  • torch.distributed.elastic.rendezvous.etcd_rendezvous_backend.EtcdRendezvousBackend.get_state() は、ジョブが進行中にのみ使用できます。ジョブが完了または失敗した後は、この関数は無効な情報を返す可能性があります。


import torch.distributed.elastic as te

# EtcdRendezvousBackend を作成
rendezvous_backend = te.rendezvous_backend.EtcdRendezvousBackend(
    name="my-job",
    etcd_host="localhost",
    etcd_port=2379,
)

# ジョブに参加
te.init_process_group(backend=rendezvous_backend)

# ジョブの状態を取得
state = rendezvous_backend.get_state()

# ジョブの状態と他のワーカーノードの情報を出力
print(f"Job status: {state['status']}")
print(f"Number of workers: {state['world_size']}")
print(f"Master address: {state['master_address']}")
print(f"Master port: {state['master_port']}")

# ジョブを終了
te.shutdown()

説明

  1. 最初の行は、torch.distributed.elastic モジュールをインポートします。
  2. 2行目は、EtcdRendezvousBackend オブジェクトを作成します。このオブジェクトは、Etcd を使用してワーカーノード間の通信を仲介します。
  3. 3行目は、te.init_process_group() 関数を使用して、現在のプロセスをジョブに参加させます。
  4. 4行目は、rendezvous_backend.get_state() 関数を使用して、ジョブの状態を取得します。
  5. 5行目は、ジョブの状態と他のワーカーノードの情報を出力します。
  6. 6行目は、te.shutdown() 関数を使用して、ジョブを終了します。
  • ジョブの名前、Etcd ホスト、および Etcd ポートは、実際の環境に合わせて変更する必要があります。
  • Etcd がインストールして実行されていることを確認してください。
  • このコードは、単一のワーカーノード上で実行する必要があります。


torch.distributed.is_initialized()

この関数は、分散トレーニングが初期化されているかどうかを返します。分散トレーニングが初期化されていれば、ジョブが実行中であると判断できます。

import torch.distributed as dist

if dist.is_initialized():
    print("Job is running!")
else:
    print("Job is not running!")

torch.distributed.get_rank()

この関数は、現在のプロセスがワーカーグループ内のランクを返します。ランクは 0 から始まり、参加しているワーカーノードの数と同じ値になります。この値を使用して、現在のワーカーがマスターワーカーかどうかを判断できます。

import torch.distributed as dist

rank = dist.get_rank()

if rank == 0:
    print("This is the master worker!")
else:
    print(f"This is worker number {rank}")

カスタムシグナリング

分散ライブラリに依存せずに、ワーカー間でカスタムシグナルを送信することもできます。例えば、すべてのワーカーが共有するファイルに書き込むことで、ジョブのステータスを伝達することができます。