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()
説明
- 最初の行は、
torch.distributed.elastic
モジュールをインポートします。 - 2行目は、
EtcdRendezvousBackend
オブジェクトを作成します。このオブジェクトは、Etcd を使用してワーカーノード間の通信を仲介します。 - 3行目は、
te.init_process_group()
関数を使用して、現在のプロセスをジョブに参加させます。 - 4行目は、
rendezvous_backend.get_state()
関数を使用して、ジョブの状態を取得します。 - 5行目は、ジョブの状態と他のワーカーノードの情報を出力します。
- 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}")
カスタムシグナリング
分散ライブラリに依存せずに、ワーカー間でカスタムシグナルを送信することもできます。例えば、すべてのワーカーが共有するファイルに書き込むことで、ジョブのステータスを伝達することができます。