这也就意味着你有多少个gpu,训练的速度也会提升多少倍
例如给你一个下面的代码:
- def run_loop(self):
- while (not self.lr_anneal_steps or self.step + self.resume_step < self.lr_anneal_steps):
- # 准备数据
- batch, cond = next(self.data)
- # 执行前后向传播
- self.run_step(batch, cond)
- # 更新日志 + save checkpoint
- if self.step % self.log_interval == 0:
- logger.dumpkvs()
- if self.step % self.save_interval == 0:
- self.opt.consolidate_state_dict()
- self.save()
- # Run for a finite amount of time in integration tests.
- if os.environ.get("DIFFUSION_TRAINING_TEST", "") and self.step > 0:
- return
- self.step += 1
- if self.step % 1000 == 0:
- logger.log("The current step is :", self.step)
- logger.log("The current time is :", datetime.datetime.now())
每个GPU上的进程都会独立地执行run_loop
函数,那么N个gpu就会执行N个run_loop(),所以一次就会打印出N个"The current step is 1000",如果你使用1个gpu,它同样会打印1个"The current step is 1000",你此时如果不懂原理可能会认为是不是DDP没有起到加速作用,怎么多个gpu和1个gpu在相同时间内执行的都是相同的step呢?
虽然logger输出是一样的step,但是这并不意味着你的多个gpu执行的速度和1个gpu执行的速度是一样的,虽然4个gpu输出的是100个step,但是他比1个gpu执行的batch数多4倍,也就意味着训练速度提升了4倍
我们在训练分布式时候,会使用到 torch.distributed.launch,
可以通过命令,来打印该模块提供的可选参数 python -m torch.distributed.launch --help
- usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK]
- [--nproc_per_node NPROC_PER_NODE] [--master_addr MASTER_ADDR] [--master_port MASTER_PORT]
- [--use_env] [-m] [--no_python] [--logdir LOGDIR]
- training_script ...
torch.ditributed.launch参数解析(终端运行命令的参数):
torch.ditributed.launch相关环境变量解析(代码中os.environ中的参数):
PyTorch 提供了一个 torch.distributed.launch
帮助我们启动进程。
这个工具其实就是帮你计算 WORLD_SIZE = nproc_per_node * nnodes
,然后执行一个循环,启动本机进程,利用这种方式,我们就只需要指定 --nproc_per_node
与 --nnodes 即可,就不需要指定WORLD_SIZE了。
单机多卡需要使用下面命令进行运行Python程序:
其中 python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 --node_rank=1 这一串中的参数不要少任何一个参数
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 --node_rank=1 train.py --args XXX
num_workers: 加载数据的进程数量,默认只有1个,增加该数量能够提升数据的读入速度。(注意:该参数>1,在低版本的pytorch可能会触发python的内存溢出) pin_memory: 锁内存,加快数据在内存上的传递速度。 若数据加载成为训练速度的瓶颈,可以考虑将这两个参数加上。
data_loader_train = torch.utils.data.DataLoader(dataset=data_set, batch_size=32,num_workers=16,pin_memory=True)
【pytorch记录】pytorch的分布式 torch.distributed.launch 命令在做什么呢-CSDN博客