DataParallel (DP) DistributedDataParallel (DDP)
DataParallel (DP) 和DistributedDataParallel (DDP)的区别
在 PyTorch 中,DataParallel (DP) 是将总 batch size 均分至每个 GPU 的实现方式,而 DistributedDataParallel (DDP) 则是每个 GPU 独立设置 batch size。具体区别如下:
1. DataParallel (DP):自动均分总 batch size
-
特点:
- 单进程多线程,所有 GPU 由主进程(rank 0)控制。
- 输入的
batch_size
表示所有 GPU 上的总样本数,会被自动均分至每个 GPU。 - 例如:
batch_size=128
且使用 4 个 GPU 时,每个 GPU 处理128/4 = 32
个样本。
-
代码示例:
model = nn.DataParallel(model) # 包裹模型 train_loader = DataLoader(dataset, batch_size=128) # 总 batch size
-
缺点:
- 主进程成为瓶颈,通信开销大,效率低于 DDP。
- 内存使用不均衡(主 GPU 占用更多)。
- 不支持模型并行(仅数据并行)。
2. DistributedDataParallel (DDP):每个 GPU 独立设置 batch size
-
特点:
- 多进程模式,每个 GPU 对应一个独立进程。
- 输入的
batch_size
表示每个 GPU 上的样本数,全局 batch size = 本地 batch size × GPU 数量。 - 例如:
batch_size=32
且使用 4 个 GPU 时,总 batch size 为32×4 = 128
。
-
代码示例:
# 初始化 DDP torch.distributed.init_process_group(backend='nccl') local_rank = torch.distributed.get_rank() model = model.to(local_rank) model = nn.DistributedDataParallel(model, device_ids=[local_rank])# 每个 GPU 的 DataLoader 加载本地 batch size train_loader = DataLoader(dataset, batch_size=32) # 每个 GPU 32 样本
-
优点:
- 高效通信(使用 NCCL 后端),支持大规模分布式训练。
- 内存使用更均衡,训练速度更快
DP 与单卡训练的核心区别
DataParallel 的核心作用是利用多卡进行数据并行训练,与单卡训练的关键差异体现在以下方面:
1. 计算方式
单卡训练:
模型和数据都放在单个 GPU 上,所有计算(前向传播、反向传播)都在这张卡上完成。
例如:batch_size=128 时,128 个样本全部在 GPU 0 上处理。
DP 训练:
主进程(通常是 GPU 0)将模型复制到所有参与训练的 GPU 上(如 GPU 0、1、2、3)。
输入的 batch_size=128 会被均分到每个 GPU(例如 4 卡时,每卡处理 32 个样本)。
每个 GPU 独立进行前向传播,计算各自的损失。
所有 GPU 的梯度会被汇总到主 GPU(GPU 0),主 GPU 执行参数更新后,再将更新后的权重同步到其他 GPU。
2. 性能与适用场景
单卡训练:
优点:实现简单,无多卡通信开销。
缺点:受限于单卡显存,无法处理过大的模型或 batch size。
DP 训练:
优点:只需一行代码(model = nn.DataParallel(model))即可实现多卡数据并行,适合中小规模多卡场景(如 2-4 卡)。
缺点:主 GPU(GPU 0)承担更多通信和计算任务(如汇总梯度、更新参数),容易成为瓶颈,内存占用也更高。
效率低于 DDP(多进程模式),不适合大规模分布式训练(如 8 卡以上)。