我们已经完成了分布式的迁移工作,不过此时您仍然可以使用上面的单卡参数进行单卡训练。
如果要进行分布式训练,还需要一些额外的启动参数调整,需要注意的是,这些调整并非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的脚本中写入如下内容:
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
在启动前,我们同样需要按照official/vision/image_classification/resnet/README.md中的说明,将models路径设置到PYTHONPATH中,例如当前的目录是/path/to/models,环境变量示例如下:
export PYTHONPATH=$PYTHONPATH:/path/to/models
之后,您可以执行如下命令启动8卡NPU训练:
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 &