1. 问题:torch.distributed.elastic.multiprocessing.errors.ChildFailedError

  • 问题描述

当在mmdetection3d上添加了新的网络结构之后,使用多GPU运行程序时,会报以下错误

ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1) local_rank: 0 (pid: 333) of binary: /opt/conda/bin/python
Traceback (most recent call last):
  File "/opt/conda/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/opt/conda/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/opt/conda/lib/python3.7/site-packages/torch/distributed/launch.py", line 193, in <module>
    main()
  File "/opt/conda/lib/python3.7/site-packages/torch/distributed/launch.py", line 189, in main
    launch(args)
  File "/opt/conda/lib/python3.7/site-packages/torch/distributed/launch.py", line 174, in launch
    run(args)
  File "/opt/conda/lib/python3.7/site-packages/torch/distributed/run.py", line 755, in run
    )(*cmd_args)
  File "/opt/conda/lib/python3.7/site-packages/torch/distributed/launcher/api.py", line 131, in __call__
    return launch_agent(self._config, self._entrypoint, list(args))
  File "/opt/conda/lib/python3.7/site-packages/torch/distributed/launcher/api.py", line 247, in launch_agent
    failures=result.failures,
torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

但是当我使用单GPU运行时,却没有发现报错。于是可以肯定不是修改网络结构带来的问题,应该是某处配置没有设置好,debug了很长时间,发现没有设置find_unused_parameters=True

当设置find_unused_parameters=True时,DistributedDataParallel会跟踪每个节点的计算图,标记那些没用梯度的参数,并将其梯度视为0,然后再进行梯度平均。

  • 解决办法一

直接修改源码,如下。

# find_unused_parameters = cfg.get('find_unused_parameters', False)  # 原代码
find_unused_parameters = True  # 修改后代码

这种办法需要对源代码进行修改,不是很方便,更好的做法是直接添加配置项目,也就是下面的方法二。

  • 解决办法二

mmdetection3d有很好的config文件,我们可以直接添加配置即可,我使用的训练网络为centerpoint,所以可以在配置文件centerpoint_02pillar_second_secfpn_4x8_cyclic_20e_nus.py最后一行添加下面一句即可。

find_unused_parameters = True  # Whether to find unused parameters
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐