news 2026/4/17 6:24:37

《一文读懂 PyTorch DDP:原理详解、多卡并行训练流程及代码实现》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《一文读懂 PyTorch DDP:原理详解、多卡并行训练流程及代码实现》

原理图

1.ddp 初始化函数

#ddp初始化函数defsetup_ddp():dist.init_process_group(backend="nccl")#初始化**分布式通信组**。local_rank=int(os.environ["LOCAL_RANK"])#读取当前进程对应的 GPU 编号torch.cuda.set_device(local_rank)#让对应进程只使用对应的 GPUreturnlocal_rank

作用:初始化之后

init_process_group()会:

  1. 根据这些环境变量建立通信
  2. 让所有进程互相知道彼此存在
  3. 创建 NCCL 通信通道
  4. 建立 all_reduce / broadcast 等操作能力

才能用以下功能:

  1. dist.get_rank()
  2. dist.get_world_size()
  3. dist.all_reduce()
  4. dist.broadcast()

2.其他函数

#ddp清除函数defcleanup_ddp():dist.destroy_process_group()#计算所有卡上平均值defreduce_tensor(tensor,world_size):"""在所有rank之间求平均"""rt=tensor.clone()dist.all_reduce(rt,op=dist.ReduceOp.SUM)#求和rt/=world_size#计算均值returnrt

3.并行训练

加入已经有了模型和数据集

#模型classMyModel(nn.Module):def__init__(self):super(MyModel,self).__init__()self.fc=nn.Linear(10,1)defforward(self,x):returnself.fc(x)

准备开始训练


(1) 初始化 rank

importtorchimporttorch.distributedasdistfromtorch.nn.parallelimportDistributedDataParallelasDDP local_rank=setup_ddp()#初始化rankdevice=torch.device(f"cuda:{local_rank}")#绑定设备world_size=dist.get_world_size()#获取进程数,用于计算平均rank=dist.get_rank()#获取当前进程iddist.barrier()#进程排队:阻塞所有进程,直到所有进程都到达这个点,才继续执行

(2) 数据并行化

train_dataset=Dataset(.....,"train")val_dataset=Dataset(......,"val")#构建并行采样器train_sampler=DistributedSampler(train_dataset)val_sampler=DistributedSampler(val_dataset,shuffle=False)#并行化dotaloadertrain_loader=DataLoader(train_dataset,batch_size=args.batch_size,sampler=train_sampler,num_workers=8,pin_memory=True)val_loader=DataLoader(val_dataset,batch_size=args.batch_size,sampler=val_sampler,num_workers=8,pin_memory=True)

(3) 模型并行化

model=MyModel()model=model.to(device)# 将模型移动到指定的设备上model=DDP(model)# 使用DDP进行模型并行训练

(4) 训练

以下是基础的单卡训练

forepochinrange(num_epochs):model.train()forinputs,targetsintrain_loader:inputs=inputs.to(device)targets=targets.to(device)optimizer.zero_grad()outputs=model(inputs)loss=...# 计算损失函数loss.backward()optimizer.step()

!!!注意!!!:

因为 ddp 并行相当于是个进程,每个进程都是用相同的模型处理不同的 batch 数据

所以不同 rank得到的loss 也不同

要得到并行计算的平均 loss 就要处理:

#计算多卡并行的平均lossdefreduce_loss(loss):dist.all_reduce(loss,op=dist.ReduceOp.SUM)#计算所有rank的loss总和loss/=dist.get_world_size()#dist.get_world_size()为所有rank数,除以rank数得到平均returnloss

所以想要得到平均 loss 就需要经过上述处理

forepochinrange(num_epochs):model.train()forinputs,targetsintrain_loader:inputs=inputs.to(device)targets=targets.to(device)optimizer.zero_grad()outputs=model(inputs)loss=...# 计算损失函数loss=reduce_loss(loss)#计算并行平均lossloss.backward()optimizer.step()cleanup_ddp()#清除ddp

(5) 打印信息/建立文件(不需要并行操作的步骤)

由于多个 rank 时并行运行的,一些操作如果不指定 rank,那么就会在所有 rank 上都运行,出现重复

例如打印信息:

以下代码中 print 操作没有指定 rank,所以在多个并行的 rank 中都会执行一次,从而重复打印好几次

forepochinrange(num_epochs):model.train()forinputs,targetsintrain_loader:inputs=inputs.to(device)targets=targets.to(device)optimizer.zero_grad()outputs=model(inputs)loss=...# 计算损失函数loss=reduce_loss(loss)#计算并行平均lossloss.backward()optimizer.step()print(loss.item())#这样每个rank都会打印一遍平均losscleanup_ddp()#清除ddp

修改方法:指定 rank==0 即可:

ifrank==0:print(loss.item())#这样只会打印一遍结果
forepochinrange(num_epochs):model.train()forinputs,targetsintrain_loader:inputs=inputs.to(device)targets=targets.to(device)optimizer.zero_grad()outputs=model(inputs)loss=...# 计算损失函数loss=reduce_loss(loss)#计算并行平均lossloss.backward()optimizer.step()ifrank==0:print(loss.item())#这样只会打印一遍结果cleanup_ddp()#清除ddp

同样,创建文件、打印 metric 等同理

4.执行语句

export CUDA_VISIBLE_DEVICES=0,1,2,3#指定devicetorchrun--nproc_per_node=4train_dinov3seger_ddp.py

这样会并行四个进程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 6:24:28

生成式AI应用数据回流机制:从原始日志到高质量微调数据的7步工业化流水线(附GDPR/《生成式AI服务管理暂行办法》双合规checklist)

第一章:生成式AI应用数据回流机制 2026奇点智能技术大会(https://ml-summit.org) 生成式AI系统在生产环境中持续演进,其核心驱动力之一是高质量、结构化、带上下文标签的用户反馈与行为数据回流。数据回流并非简单日志采集,而是涵盖用户显式…

作者头像 李华
网站建设 2026/4/17 6:24:26

Multisim电路设计AI伙伴:Qwen3.5-2B解读仿真波形与提出改进建议

Multisim电路设计AI伙伴:Qwen3.5-2B解读仿真波形与提出改进建议 1. 电路设计的痛点与AI解决方案 电路设计工程师们每天都要面对一个共同的挑战:在Multisim中完成仿真后,如何快速准确地分析复杂的波形图?传统方法需要工程师逐帧检…

作者头像 李华
网站建设 2026/4/17 6:20:11

CoPaw保姆级教程:3步部署个人AI助手,聊天软件内直接对话使用

CoPaw保姆级教程:3步部署个人AI助手,聊天软件内直接对话使用 1. CoPaw简介与核心功能 1.1 什么是CoPaw CoPaw是一款基于Qwen3-4B-Instruct-2507模型的个人AI助手,由AgentScope团队开发。它最大的特点是能在你常用的聊天软件中直接对话使用…

作者头像 李华
网站建设 2026/4/17 6:20:03

真实数据成AI发展瓶颈,合成数据或成未来竞争核心

【导语:随着基础模型规模扩大,真实数据在成本、隐私等方面的限制成为AI发展瓶颈,合成数据正从补充转变为核心机制。南洋理工大学等研究人员提出统一框架,重新定义合成数据方法边界并给出发展路径。】重新定义合成数据方法边界很多…

作者头像 李华