---
title: 启动分布式训练
description: "我们已经完成了分布式的迁移工作，不过此时您仍然可以使用上面的单卡参数进行单卡训练。"
url: https://www.hiascend.com/document/detail/zh/TensorFlowCommercial/latest/migration/tfmigr2/tfmigr2_000099.html
sourcePath: /source/zh/TensorFlowCommercial/900/migration/tfmigr2/tfmigr2_000099.html
indexId: a81055f6dcee9fecee8a9003ae200b57d4301da30c48d7de4d943ab9ab1f536773
---
# 启动分布式训练

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

如果要进行分布式训练，还需要调整一些额外的启动参数，需要注意的是，这些调整并非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
```

- /path/to/rank_table.json替换为符合您部署形态的NPU分布式配置文件。
- /path/to/imagenet_TF/替换为您实际的数据集路径。
- 此样例，我们以通过配置文件（即rank table文件）的方式配置AI处理器的资源信息，详细的配置文件说明可参见《HCCL集合通信库(https://www.hiascend.com/document/detail/zh/canncommercial/900/API/hcclug/hcclug_000001.html)》中的“相关参考 > 集群信息配置”章节。当然，开发者也可以通过环境变量的方式指定AI处理器的资源信息，可参见  训练执行（通过环境变量配置资源信息）
。


在启动前，我们同样需要按照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 &
```
