使用DistributedDataParallel(DDP)训练时构建数据集是否需要设置barrier?
DDP数据集加载逻辑与barrier作用说明
1. DDP的数据加载默认逻辑
- DDP本身没有强制规定数据集的加载方式,默认设计是每个进程独立加载自身对应的数据集分片,不需要主进程加载后同步给其余进程。
- 不同进程可以根据自己的rank对原始数据集做切分,各自加载对应部分即可,DDP只负责梯度同步的逻辑,不干预数据集的构建流程。
2. DDP是否要求构建数据集时使用barrier
- 没有强制要求。官方文档没有相关说明,是因为barrier不属于DDP框架的必备环节,这是业务代码为了适配缓存逻辑自行添加的优化/兼容逻辑。
3. 上述代码添加barrier的原因
这段代码的barrier是为了避免多进程同时处理数据集、写入同一份缓存文件带来的冲突与资源浪费,具体执行逻辑如下:
- 训练阶段启动时,非主进程(
args.local_rank not in [-1,0])会先触发第一个barrier()进入阻塞状态,等待其他进程也到达该同步点。 - 此时主进程(rank 0)不会触发第一个barrier,会继续往下执行:如果没有对应缓存文件,就会完成原始数据的预处理、生成特征、写入缓存文件的全流程。
- 主进程完成缓存生成/加载逻辑后,会触发第二个
barrier(),此时所有进程都已到达barrier同步点,阻塞解除。 - 后续非主进程继续执行时,缓存文件已经被主进程生成完毕,直接读取即可,不需要重复做数据预处理,也避免了多进程同时写同一个缓存文件引发的写入冲突、文件损坏问题。
注:代码中加了
not evaluate的判断,是因为评估阶段不需要写训练集缓存,不存在多进程写冲突问题,所以不需要加barrier同步。
内容的提问来源于stack exchange,提问作者David Zhang
相关产品推荐
相关产品推荐

