启动方法
# 直接启动
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任务时,会通过TrainingArguments的world_size判断是否需要shared数据,继而传入
local_rank参数最到torch.utils.data.distributed.DistributedSampler,对每个进程进行不重复的数据分发。