飞桨框架昇腾 NPU 版训练示例¶
YOLOv3 训练示例¶
第一步:下载并安装 PaddleDetection 套件
# 下载套件代码
cd path_to_clone_PaddleDetection
git clone -b develop https://github.com/PaddlePaddle/PaddleDetection.git
# 编译安装
cd PaddleDetection
python setup.py install
# 安装其他依赖
pip install -r requirements.txt
也可以访问 PaddleDetection 的 GitHub Repo 下载 develop 分支的源码。
第二步:准备 VOC 训练数据集
cd PaddleDetection/static/dataset/roadsign_voc
python download_roadsign_voc.py
# 下载完成之后,当前目录结构如下
PaddleDetection/static/dataset/roadsign_voc/
├── annotations
├── download_roadsign_voc.py
├── images
├── label_list.txt
├── train.txt
└── valid.txt
第三步:运行单卡训练
export FLAGS_selected_npus=0
# 单卡训练
python -u tools/train.py -c configs/yolov3_darknet_roadsign.yml -o use_npu=True
# 单卡评估
python -u tools/eval.py -c configs/yolov3_darknet_roadsign.yml -o use_npu=True
# 精度结果
INFO:ppdet.utils.voc_eval:mAP(0.50, integral) = 76.78%
第四步:运行多卡训练
注意:多卡训练请参考本页下一章节进行 "NPU 多卡训练配置" 的准备。
# NPU 多卡训练配置
export FLAGS_selected_npus=0,1,2,3
export RANK_TABLE_FILE=/root/hccl_4p_0123_127.0.0.1.json
# 设置 HCCL 相关环境变量
export HCCL_CONNECT_TIMEOUT=7200
export HCCL_WHITELIST_DISABLE=1
export HCCL_SECURITY_MODE=1
# 多卡训练
python -m paddle.distributed.fleet.launch --run_mode=collective \
tools/train.py -c configs/yolov3_darknet_roadsign.yml -o use_npu=True
# 多卡训练结果评估
python -u tools/eval.py -c configs/yolov3_darknet_roadsign.yml -o use_npu=True
# 精度结果
INFO:ppdet.utils.voc_eval:mAP(0.50, integral) = 83.00%
NPU 多卡训练配置¶
预先要求:请先根据华为昇腾 910 NPU 的文档 配置 device 的网卡 IP 进行相关 NPU 运行环境的部署和配置,配置完成后检查机器下存在 /etc/hccn.conf
文件。
如果是物理机环境,请根据华为官网的 hccl_tools 说明文档 进行操作。如果是根据 Paddle 官方镜像启动的容器环境,请根据以下步骤进行操作:
第一步:根据容器启动时映射的设备 ID,创建容器内的 /etc/hccn.conf
文件
例如物理机上的 8 卡的原始 /etc/hccn.conf
文件内容如下:
address_0=192.168.10.21
netmask_0=255.255.255.0
address_1=192.168.20.21
netmask_1=255.255.255.0
address_2=192.168.30.21
netmask_2=255.255.255.0
address_3=192.168.40.21
netmask_3=255.255.255.0
address_4=192.168.10.22
netmask_4=255.255.255.0
address_5=192.168.20.22
netmask_5=255.255.255.0
address_6=192.168.30.22
netmask_6=255.255.255.0
address_7=192.168.40.22
netmask_7=255.255.255.0
容器启动命令中映射的设备 ID 为 4 到 7 的 4 张 NPU 卡,则创建创建容器内的 /etc/hccn.conf
文件内容如下:
注意:这里的 address_4 和 netmask_4 需要相应的修改为 address_0 和 netmask_0,以此类推
address_0=192.168.10.22
netmask_0=255.255.255.0
address_1=192.168.20.22
netmask_1=255.255.255.0
address_2=192.168.30.22
netmask_2=255.255.255.0
address_3=192.168.40.22
netmask_3=255.255.255.0
第二步:根据华为官网的 hccl_tools 说明文档,生成单机四卡的配置文件
# 下载 hccl_tools.py 文件到本地
wget https://raw.githubusercontent.com/mindspore-ai/mindspore/v1.4.0/model_zoo/utils/hccl_tools/hccl_tools.py
# 生成单机两卡的配置文件,单机可以设置 IP 为 127.0.0.1
python hccl_tools.py --device_num "[0,4)" --server_ip 127.0.0.1
运行成功之后在当前目录下获得名为 hccl_4p_0123_127.0.0.1.json
的文件,内容如下:
{
"version": "1.0",
"server_count": "1",
"server_list": [
{
"server_id": "127.0.0.1",
"device": [
{
"device_id": "0",
"device_ip": "192.168.10.22",
"rank_id": "0"
},
{
"device_id": "1",
"device_ip": "192.168.20.22",
"rank_id": "1"
},
{
"device_id": "2",
"device_ip": "192.168.30.22",
"rank_id": "2"
},
{
"device_id": "3",
"device_ip": "192.168.40.22",
"rank_id": "3"
}
],
"host_nic_ip": "reserve"
}
],
"status": "completed"
}
第三步:运行 Paddle 多卡训练之前,需要先配置名为 RANK_TABLE_FILE
的环境变量,指向上一步生成的 json 文件的绝对路径
# 1) 设置 ranktable 文件的环境变量
export RANK_TABLE_FILE=$(readlink -f hccl_4p_0123_127.0.0.1.json)
# 或者直接修改为 json 文件的绝对路径
export RANK_TABLE_FILE=/root/hccl_4p_0123_127.0.0.1.json
# 2) 设置 HCCL 相关环境变量
export HCCL_CONNECT_TIMEOUT=7200
export HCCL_WHITELIST_DISABLE=1
export HCCL_SECURITY_MODE=1
# 3) 启动分布式任务,注意这里的 run_mode 当前仅支持 collective 模式
python -m paddle.distributed.fleet.launch --run_mode=collective train.py ...