1任务介绍 通过实现一个线性变换模型 的单机2卡分布式训练任务,来初步体验pytorch中DistributeDataparallel的使用。本文主要参考pytorchtutorial中的介绍。 2整体流程 代码编写流程如下:初始化pytorch分布式训练通信模块;创建模型(这里包括本地模型和分布式模型)创建损失函数和优化器计算(forward和backward)和梯度更新多任务启动 3初始化通信模块 pytorch中分布式通信模块为torch。distributed 本例中初始化代码为:通过环境变量MASTERADDR和MASTERPORT设置rank0的IP和PORT信息,rank0的作用相当于是协调节点,需要其他所有节点知道其访问地址;本例中后端选择的是nccl,通过设置NCCLDEBUG环境变量为INFO,输出NCCL的调试信息;initprocessgroup:执行网络通信模块的初始化工作backend:设置后端网络通信的实现库,可选的为gloo、nccl和mpi;rank:为当前rank的index,用于标记当前是第几个rank,取值为0到worksize1之间的值;worldsize:有多少个进程参与到分布式训练中;setenv信息os。environ〔MASTERADDR〕127。0。0。1os。environ〔MASTERPORT〕29500os。environ〔NCCLDEBUG〕INFOcreatedefaultprocessgroupdist。initprocessgroup(backendnccl,rankrank,worldsizeworldsize) 4创建模型 通过下面的代码分别创建本地模型和分布式模型:nn。Linear(10,10)。to(rank):创建线性变换模型,inputsize和outputsize都是10,并且将模型copy到gpu上(通过rank来标识gpu的id)DDP(model,deviceids〔rank〕):创建分布式模型;该模型会将localmodel复制到所有副本上,并对数据进行切分,然后使得每个localmodel都按照minibatch进行训练。createlocalmodelmodelnn。Linear(10,10)。to(rank)constructDDPmodelddpmodelDDP(model,deviceids〔rank〕) 5创建Loss和optimizerdefinelossfunctionandoptimizerlossfnnn。MSELoss()optimizeroptim。SGD(ddpmodel。parameters(),lr0。001) 6计算和梯度更新 通过ddpmodel执行forward和backward计算,这样才能够达到分布式计算的效果;forwardpassoutputsddpmodel(torch。randn(20,10)。to(rank))labelstorch。randn(20,10)。to(rank)backwardpasslossfn(outputs,labels)。backward()updateparametersoptimizer。step() 7任务启动 启动一个有两个process组成的分布式任务:runworker:子进程执行的function,会以fn(i,args)的形式被调用,i为process的id(0,1,2。。。),args为spawn的args参数args:执行进程的参数nprocs:进程的个数join:是否等待子进程执行完成defmain():workersize2mp。spawn(runworker,args(workersize,),nprocsworkersize,joinTrue) 8完整代码importosimporttorchimporttorch。distributedasdistimporttorch。multiprocessingasmpimporttorch。nnasnnimporttorch。optimasoptimfromtorch。nn。parallelimportDistributedDataParallelasDDPdefrunworker(rank,worldsize):os。environ〔MASTERADDR〕127。0。0。1os。environ〔MASTERPORT〕29500os。environ〔NCCLDEBUG〕INFOcreatedefaultprocessgroupdist。initprocessgroup(backendnccl,rankrank,worldsizeworldsize)createlocalmodelmodelnn。Linear(10,10)。to(rank)constructDDPmodelddpmodelDDP(model,deviceids〔rank〕)definelossfunctionandoptimizerlossfnnn。MSELoss()optimizeroptim。SGD(ddpmodel。parameters(),lr0。001)forwardpassoutputsddpmodel(torch。randn(20,10)。to(rank))labelstorch。randn(20,10)。to(rank)backwardpasslossfn(outputs,labels)。backward()updateparametersoptimizer。step()defmain():workersize2mp。spawn(runworker,args(workersize,),nprocsworkersize,joinTrue)ifnamemain:main() 代码执行如下:rootg48r13:workspaceDDPpythonlinearddp。pyg48r13:350:350〔0〕NCCLINFOBootstrap:Using〔0〕bond0:11。139。84。880g48r13:350:350〔0〕NCCLINFONETPlugin:Nopluginfound(libncclnet。so),usinginternalimplementationg48r13:350:350〔0〕miscibvwrap。cc:63NCCLWARNFailedtoopenlibibverbs。so〔。1〕g48r13:350:350〔0〕NCCLINFONETSocket:Using〔0〕bond0:11。139。84。880g48r13:350:350〔0〕NCCLINFOUsingnetworkSocketNCCLversion2。7。8cuda10。2g48r13:351:351〔1〕NCCLINFOBootstrap:Using〔0〕bond0:11。139。84。880g48r13:351:351〔1〕NCCLINFONETPlugin:Nopluginfound(libncclnet。so),usinginternalimplementationg48r13:351:351〔1〕miscibvwrap。cc:63NCCLWARNFailedtoopenlibibverbs。so〔。1〕g48r13:351:351〔1〕NCCLINFONETSocket:Using〔0〕bond0:11。139。84。880g48r13:351:351〔1〕NCCLINFOUsingnetworkSocketg48r13:350:366〔0〕NCCLINFOChannel0002:01g48r13:351:367〔1〕NCCLINFOthreadThresholds8864168648864g48r13:350:366〔0〕NCCLINFOChannel0102:01g48r13:351:367〔1〕NCCLINFOTrees〔0〕1111001111〔1〕1111001111g48r13:351:367〔1〕NCCLINFOSettingaffinityforGPU1toffffffff,ffffffffg48r13:350:366〔0〕NCCLINFOthreadThresholds8864168648864g48r13:350:366〔0〕NCCLINFOTrees〔0〕1110110111〔1〕1110110111g48r13:350:366〔0〕NCCLINFOSettingaffinityforGPU0toffffffff,ffffffffg48r13:351:367〔1〕NCCLINFOChannel00:1〔5000〕0〔4000〕viaP2PIPCg48r13:350:366〔0〕NCCLINFOChannel00:0〔4000〕1〔5000〕viaP2PIPCg48r13:351:367〔1〕NCCLINFOChannel01:1〔5000〕0〔4000〕viaP2PIPCg48r13:350:366〔0〕NCCLINFOChannel01:0〔4000〕1〔5000〕viaP2PIPCg48r13:351:367〔1〕NCCLINFO2collchannels,2p2pchannels,2p2pchannelsperpeerg48r13:351:367〔1〕NCCLINFOcomm0x7fb0b4001060rank1nranks2cudaDev1busId5000InitCOMPLETEg48r13:350:366〔0〕NCCLINFO2collchannels,2p2pchannels,2p2pchannelsperpeerg48r13:350:366〔0〕NCCLINFOcomm0x7fc7a8001060rank0nranks2cudaDev0busId4000InitCOMPLETEg48r13:350:350〔0〕NCCLINFOLaunchmodeParallel