transformers直接启动与使用torch.distributed.run启动的区别

571 阅读1分钟

启动方法

# 直接启动 
python train.py
# 通过torch.distributed启动
python -m torch.distributed.run --nproc_per_node=3 --nnode=1 train.py

区别

DP

直接启动使用的是DP方法

DP方法是Parameter Server,即一张卡做reducer,该卡显存高于其他卡,且需要与所有卡做通信

DDP

torch.distributed.run采用的是DDP方法

DDP采用All Reducer,所有卡之间通信负载均衡,且显存占用一致

原理参考

transformers需要改代码吗

因为参考torch的文档,DDP方法需要对数据分发方式进行改变,即

sampler = DistributedSampler(dataset)
DataLoader(dataset, batch_size=batch_size, sampler=sampler)

由此引发疑问,transformers会自动实现吗

transformers在代码中区别两种启动方法的方式是进程启动后,Trainer.train方法判断TrainingArguments中的local_rank值,-1表示非DDP,0~...分别表示当前进程排序,0是主进程。

使用transformers包,数据只需要正常加载即可,DDP任务时,会通过TrainingArgumentsworld_size判断是否需要shared数据,继而传入 local_rank参数最到torch.utils.data.distributed.DistributedSampler,对每个进程进行不重复的数据分发。