torch.distributed.barrier()工作原理
barrier(),进程同步
参考:
通常有一些操作是没有必要以并行的方式进行处理的,如数据读取与处理操作,只需要一个进程进行处理并缓存,然后与其它进程共享缓存处理数据,但是由于不同进程是同步执行的,单一进程处理数据必然会导致进程之间出现不同步的现象( 这是由于数据读取操作处理时间较长 ) 对于较短时间的单一进程程序运行不会影响线程不同步的情况,为此 ,torch中采用了barrier()函数对其它非主进程进行阻塞,来达到同步的目的。
EWGS / ImageNet / ImageNet_train_quant.py / 中的barrier()运用就是因为update_grad_scales(args)函数运行时间较久
对于程序中分布式没有对参数更新哪里加一个barrier()的原因是因为所有GPU(进程)默认大家速度都是一致的,且pytorch中的分布式spawn或者lanuch更新参数应该也是加了一个保险,使得 大家在每一个step(不是epoch)中都会等待彼此