DistributedDataParallel(DDP)
プロセスグループ、dist.init_process_group、DistributedSampler、勾配同期について学習します。
「DistributedDataParallel(DDP)」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
DDPとは
DistributedDataParallel(DDP)は、データ並列学習のためのPyTorchの高性能な手法です。GPUごとに1つのプロセスを起動し、各プロセスが完全なモデルの複製を保持して、勾配を効率的に同期します。DDPはGPU間でもマシン間でも、ほぼ線形にスケーリングします。
プロセスグループ
DDPはプロセスグループを通じてプロセスを調整します。各プロセスには一意のランクが割り当てられ、全体のワールドサイズを把握します。プロセス間の通信にはバックエンドを使用し、NVIDIA GPUではそのバックエンドとしてncclを使用します。
init_process_group
各プロセスは、まずグループに参加します。backend="nccl"を指定したdist.init_process_groupが、GPU間通信を設定します。
import torch.distributed as dist
import os
dist.init_process_group(backend="nccl")
rank = dist.get_rank()
world_size = dist.get_world_size()デバイスの割り当て
各プロセスは1つのGPUを所有する必要があります。ローカルランクを使ってデバイスを設定すると、プロセス0はcuda:0、プロセス1はcuda:1というように割り当てられます。
local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)モデルのラップ
モデルをそのGPUに移動してから、device_ids=[local_rank]を指定してDDPでラップします。DDPはフックを登録し、バックプロパゲーション中に勾配を同期します。
from torch.nn.parallel import DistributedDataParallel as DDP
model = MyModel().to(device)
model = DDP(model, device_ids=[local_rank])DistributedSampler
各プロセスは、重複しない異なるデータ分割を処理する必要があります。DistributedSamplerはデータセットをランク間で分割し、全ランクのデータを合わせると、各エポックでデータセット全体をちょうど1回処理できるようにします。
from torch.utils.data import DataLoader
from torch.utils.data.distributed import DistributedSampler
sampler = DistributedSampler(dataset)
loader = DataLoader(dataset, batch_size=32, sampler=sampler)エポックごとのシャッフル
各エポックの開始時にsampler.set_epoch(epoch)を呼び出します。これにより、全プロセスで一貫してシャッフルのシードが設定されます。その結果、すべてのランクが同じ方法でシャッフルし、分割が重複しない状態を保てます。
for epoch in range(epochs):
sampler.set_epoch(epoch)
for x, y in loader:
...勾配のオールリデュース
loss.backward()の実行中、DDPはオールリデュースを行います。各プロセスが勾配を送信して平均化された結果を受け取るため、すべての複製モデルが同じ更新を適用します。オールリデュースはバックプロパゲーションと重ねて実行されるため、通信コストを隠蔽できます。
GPU 0のボトルネックがない
DataParallelとは異なり、DDPには出力を集約する中央のGPUがありません。各プロセスが独自に損失と勾配を計算し、オールリデュースを通じて勾配だけを交換します。この対称的な構成が、DDPの優れたスケーリングを実現する理由です。
torchrunでの起動
torchrunはGPUごとのプロセスを起動し、ランクに関する環境変数を設定します。--nproc_per_node=4を指定すると、このノードで4つのプロセス(GPUごとに1つ)が起動します。
torchrun --nproc_per_node=4 train.pyランク0だけで保存
すべてのランクが同じ重みを保持しているため、チェックポイントの上書きを避けるには1つのランクだけが書き込みを行うべきです。ランクのチェックで保存処理を制御してください。
if rank == 0:
torch.save(model.module.state_dict(), "model.pt")
dist.barrier()確認テスト
DDPの理解度を確認しましょう。
まとめ
DistributedDataParallelについて学びました。
dist.init_process_group(backend="nccl")でプロセスグループに参加します- DistributedSamplerが各ランクに重複しないデータ分割を割り当てます
DDP(model, device_ids=[rank])がオールリデュースで勾配を同期しますtorchrun --nproc_per_node=4で起動します- ランク0だけが保存します
よくある質問
「DistributedDataParallel(DDP)」レッスンは無料ですか?
はい。「DistributedDataParallel(DDP)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「DistributedDataParallel(DDP)」で何を学びますか?
プロセスグループ、dist.init_process_group、DistributedSampler、勾配同期について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「DistributedDataParallel(DDP)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- DataParallelによるマルチGPU学習
- DistributedDataParallel(DDP)
- AMPによる混合精度学習
- Hugging Face Accelerateによる効率的な学習