下载
中文
注册

启动分布式训练

我们已经完成了分布式的迁移工作,不过此时您仍然可以使用上面的单卡参数进行单卡训练。

如果要进行分布式训练,还需要一些额外的启动参数调整,需要注意的是,这些调整并非NPU特有的:当您使用多卡训练时,您可以对全局batch size进行等比例的放大,比如您在单卡上执行32 batch size大小的训练,在执行集群大小为8的分布式训练时,batch size大小可以调整为32*8以加速训练。

我们以上面启动单卡的参数为例,单卡batch大小为2,所以8卡训练时将batch大小调整为2*8=16,batch的调整会直接影响每个epoch的训练总步数,您应当清楚这些关联关系,并且在batch大小发生变化时作出调整。假定一个epoch样本总数为64,我们每次循环下沉处理一个epoch,那么,当batch大小为2时,steps_per_loop设置为64/2=32,表示单卡上训练32步即完成了一个epoch训练。但是当我们使用8卡训练,batch大小调整为16后,steps_per_loop应当设置为64/16=4,此时,单卡上训练4步即完成了一个epoch训练,单纯从步数上可以看出有8倍的性能提升。

清楚这些关系后,我们将单卡的参数进行转换,变为分布式的启动参数,由于要启动多个训练程,可以将启动命令行写入脚本,下面的8卡训练脚本仅供参考,比如我们在train.sh的脚本中写入如下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
export RANK_TABLE_FILE=/path/to/rank_table.json
export RANK_SIZE=8
export RANK_ID=$1
export ASCEND_DEVICE_ID=$2
export NPU_LOOP_SIZE=4
python3 resnet_ctl_imagenet_main.py \
--data_dir=/path/to/imagenet_TF/ \
--train_steps=16 \
--distribution_strategy=one_device \
--use_tf_while_loop=true \
--steps_per_loop=4 \
--batch_size=16 \
--epochs_between_evals=1 \
--skip_eval
  • /path/to/rank_table.json替换为符合您部署形态的NPU分布式配置文件。
  • /path/to/imagenet_TF/替换为您实际的数据集路径。
  • 此样例,我们以通过配置文件(即ranktable文件)的方式配置昇腾AI处理器的资源信息,详细的配置文件说明可参见准备ranktable资源配置文件。当然,开发者也可以通过环境变量的方式指定昇腾AI处理器的资源信息,可参见训练执行(环境变量方式设置资源信息)

在启动前,我们同样需要按照official/vision/image_classification/resnet/README.md中的说明,将models路径设置到PYTHONPATH中,例如当前的目录是/path/to/models,环境变量示例如下:

export PYTHONPATH=$PYTHONPATH:/path/to/models

之后,您可以执行如下命令启动8卡NPU训练:

1
2
3
4
5
6
7
8
nohup bash train.sh 0 0 &
nohup bash train.sh 1 1 &
nohup bash train.sh 2 2 &
nohup bash train.sh 3 3 &
nohup bash train.sh 4 4 &
nohup bash train.sh 5 5 &
nohup bash train.sh 6 6 &
nohup bash train.sh 7 7 &