PyTorch 分散通信における `torch.distributed.is_torchelastic_launched()` の詳細解説

2024-11-07

Torchelastic とは、PyTorch における分散訓練のための高レベルなライブラリです。大規模なモデルを複数のノードに分散して効率的に訓練するために設計されています。

torch.distributed.is_torchelastic_launched() の役割

  • False の場合、分散訓練は Torchelastic を用いて開始されていないことを示します。
  • True の場合、分散訓練は Torchelastic を用いて開始されていることを示します。
  • 判定結果は True または False で返されます。
  • 分散訓練が Torchelastic を用いて開始されたかどうかを判定します。

torch.distributed.is_torchelastic_launched() の使い所

  • また、Torchelastic 以外の分散訓練バックエンドを使用している場合に、適切なコードパスを実行する際に役立ちます。
  • 例えば、Torchelastic の分散データ並列化 API を使用するかどうかを判断する際に使用できます。
  • 分散訓練中に、Torchelastic 固有の機能を使用するかどうかを判断する際に役立ちます。
import torch.distributed

if torch.distributed.is_torchelastic_launched():
    # Torchelastic 固有の機能を使用する
    print("Torchelastic を用いて分散訓練が開始されました。")
else:
    # Torchelastic 以外の分散訓練バックエンドを使用する
    print("Torchelastic を用いて分散訓練が開始されていません。")
  • torch.distributed.is_torchelastic_launched() は、PyTorch 1.8 以降で使用可能です。


例 1: Torchelastic を用いて分散訓練を実行

この例では、torch.distributed.launch を使用して Torchelastic を用いて分散訓練を開始し、torch.distributed.is_torchelastic_launched() を使用して Torchelastic が使用されていることを確認します。

import torch
import torch.distributed
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

# データローダーを作成
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)

# モデルを作成
model = nn.Sequential(
    nn.Conv2d(1, 32, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(2),
    nn.Conv2d(32, 64, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(2),
    nn.Flatten(),
    nn.Linear(960, 10),
    nn.Softmax(dim=1)
)

# 分散訓練を開始
torch.distributed.launch(rank=0, world_size=2)

# Torchelastic が使用されていることを確認
if torch.distributed.is_torchelastic_launched():
    print("Torchelastic を用いて分散訓練が開始されました。")

# 損失関数と最適化アルゴリズムを設定
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())

# 訓練ループ
for epoch in range(10):
    for images, labels in train_loader:
        # データを分散化
        images = images.to(device='cuda')
        labels = labels.to(device='cuda')

        # 予測と損失計算
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 勾配の計算と更新
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

print("訓練完了")

例 2: Torchelastic 以外の分散訓練バックエンドを使用

この例では、torch.distributed.init_process_group() を使用して Torchelastic 以外の分散訓練バックエンドを使用し、torch.distributed.is_torchelastic_launched() が False を返すことを確認します。

import torch
import torch.distributed
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

# データローダーを作成
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True)

# モデルを作成
model = nn.Sequential(
    nn.Conv2d(1, 32, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(2),
    nn.Conv2d(32, 64, kernel_size=3, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(2),
    nn.Flatten(),
    nn.Linear(960, 10),
    nn.Softmax(dim=1)
)

# 分散訓練を開始 (Torchelastic 以外)
backend = 'nccl'
os.environ['GLOO_SOCKET_IFNAME'] = 'eth0'
torch.distributed.init_process_group(backend=backend, rank=0, world_size=2)

# Torchelastic が使用されていないことを確認
if torch.distributed.is_torchelastic_launched():
    print("Torchelastic を用いて分散訓練が開始されました。")
else:
    print("Torchelastic を用いて分散訓練が開始されていません。")

# 損失関数と最適化アルゴリズムを設定
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())

# 訓練ループ
for epoch in range(10):


代替手段

  1. hasattr(dist, 'is_tpu_launched') を使用する:
    • この関数は、PyTorch が TPU 上で分散訓練を実行しているかどうかを判断します。
    • TPU を使用している場合にのみ使用できます。
    • 例:
if hasattr(dist, 'is_tpu_launched') and dist.is_tpu_launched():
    print("分散訓練は TPU 上で実行されています。")
else:
    # Torchelastic または他の分散訓練バックエンドを使用している可能性があります。
    if torch.distributed.is_torchelastic_launched():
        print("Torchelastic を用いて分散訓練が開始されました。")
    else:
        print("分散訓練が実行されていますが、Torchelastic は使用されていません。")
  1. 環境変数を確認する:
    • Torchelastic を使用している場合は、いくつかの環境変数が設定されます。
    • 例えば、以下の環境変数が設定されます。
      • TORCHELASTIC_LOCAL_RANK
      • TORCHELASTIC_GLOBAL_RANK
    • これらの環境変数が設定されていることを確認することで、Torchelastic が使用されているかどうかを判断できます。
    • 例:
if os.environ.get('TORCHELASTIC_LOCAL_RANK', None) is not None:
    print("Torchelastic を用いて分散訓練が開始されました。")
else:
    # Torchelastic 以外の分散訓練バックエンドを使用している可能性があります。
    if torch.distributed.is_torchelastic_launched():
        print("Torchelastic を用いて分散訓練が開始されました。")
    else:
        print("分散訓練が実行されていますが、Torchelastic は使用されていません。")
  1. torch.distributed.get_backend() を使用する:
    • この関数は、現在使用されている分散訓練バックエンドの種類を取得します。
    • 結果が 'torch_elastic' である場合は、Torchelastic が使用されていることを示します。
    • 例:
backend = torch.distributed.get_backend()
if backend == 'torch_elastic':
    print("Torchelastic を用いて分散訓練が開始されました。")
else:
    print(f"分散訓練バックエンド: {backend}")
  • 特定の状況では、torch.distributed.is_torchelastic_launched() を使用することが最善の方法となる場合があります。
  • 上記の代替手段は、torch.distributed.is_torchelastic_launched() と完全に同じではない場合があります。