0Pricing
Learn AI with Python · 课时

DistributedDataParallel(DDP)

进程组、dist.init_process_group、DistributedSampler 和梯度同步。

DistributedDataParallel(DDP) 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。

什么是 DDP

DistributedDataParallel(DDP)是 PyTorch 用于数据并行训练的高性能方案。它为每个 GPU 启动一个进程,每个进程都持有一份完整的模型副本,并高效地同步梯度。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()

固定 device

每个进程应负责一个 GPU。请使用本地编号设置 device,使进程 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 会按照进程编号划分数据集,使所有分片的并集在每个轮次中恰好覆盖整个数据集一次。

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 会执行全归约:每个进程发送自己的梯度并接收平均后的结果,因此所有副本都会应用完全相同的 update。全归约会与反向传播重叠执行,从而隐藏通信成本。

没有 GPU 0 瓶颈

与 DataParallel 不同,DDP没有负责汇总输出的中央 GPU。每个进程都会计算自己的损失和梯度,只有梯度会通过全归约进行交换。这种对称性正是 DDP 扩展能力强得多的原因。

使用 torchrun 启动

torchrun会启动每个 GPU 对应的进程,并设置编号相关的环境变量。--nproc_per_node=4会在此节点上启动 4 个进程(每个 GPU 对应一个)。

torchrun --nproc_per_node=4 train.py

仅在编号 0 上保存

所有进程都持有完全相同的权重,因此只应由一个进程写入检查点,以避免相互覆盖。请使用进程编号检查来控制保存操作。

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)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。

「DistributedDataParallel(DDP)」这节课中我会学到什么?

进程组、dist.init_process_group、DistributedSampler 和梯度同步。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 DataParallel 进行多 GPU 训练
  2. DistributedDataParallel(DDP)
  3. 使用 AMP 进行混合精度训练
  4. 使用 Hugging Face Accelerate 高效训练
← 返回 Learn AI with Python