分布式训练需要用tool文件夹里dist_train.sh辅助运行
sh tools/dist_train.sh ${CONFIG_FILE} ${GPUS} [可选参数]
可选参数可以为:
-
–no-validate (不推荐): 训练时代码库默认会在每 k 轮迭代后在验证集上进行评估,如果不需评估使用命令 --no-validate
-
–work-dir ${工作路径}: 在配置文件里重写工作路径文件夹
-
–resume-from ${检查点文件}: 继续使用先前的检查点 (checkpoint) 文件(可以继续训练过程)
-
–load-from ${检查点文件}: 从一个检查点 (checkpoint) 文件里加载权重(对另一个任务进行精调)
-
–deterministic: 选择此模式会减慢训练速度,但结果易于复现
resume-from 和 load-from 的区别:
-
resume-from 加载出模型权重和优化器状态包括迭代轮数等
-
load-from 仅加载模型权重,从第0轮开始训练
示例:
# 模型的权重和日志将会存储在这个路径下: WORK_DIR=work_dirs/pspnet_r50-d8_512x512_80k_ade20k/
# 如果work_dir没有被设定,它将会被自动生成
sh tools/dist_train.sh configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py 8 --work_dir work_dirs/pspnet_r50-d8_512x512_80k_ade20k/ --deterministic
如果在单个机器上启动多个任务,例如在8卡 GPU 的一个机器上有2个4卡 GPU 的训练任务,您需要特别对每个任务指定不同的端口(默认为29500)来避免通讯冲突。否则,将会有报错信息 RuntimeError: Address already in use。
如果使用命令 dist_train.sh 来启动一个训练任务,可以在命令行的用环境变量 PORT 设置端口:
CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 sh tools/dist_train.sh ${CONFIG_FILE} 4
CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 sh tools/dist_train.sh ${CONFIG_FILE} 4
注意:
如果运行的时候遇到下面的错误,
Bad substitution Error
把sh改成bash就可以了
参考:
https://mmsegmentation.readthedocs.io/en/latest/