MapTRv2模型基于ModelArts Lite Server适配PyTorch NPU训练指导
方案概览
MapTR是一种高效的端到端Transformer模型,用于在线构建矢量化高清地图(HD Map)。高清地图在自动驾驶系统中是规划的基础和关键组件,提供了丰富而精确的环境信息。MapTR提出了一种统一的置换等价建模方法,将地图元素表示为等价置换组的点集,这样不仅可以准确描述地图元素的形状,还能稳定学习过程。此外,MapTR设计了一个分层查询嵌入方案,以灵活地编码结构化地图信息,并执行分层二分匹配来学习地图元素。
资源规格要求
推荐使用“西南-贵阳一”Region上的Lite Server资源。
名称 |
版本 |
---|---|
NPU卡数 |
Ascend Snt9B:8卡 Ascend Snt9B23:8卡 或 16卡 |
Driver |
Ascend Snt9B:24.1.0.6 Ascend Snt9B23:24.1.RC3.5 |
PyTorch |
PyTorch-2.1.0 |
获取软件和镜像
分类 |
名称 |
获取路径 |
---|---|---|
插件代码包 |
AscendCloud-ACD-xxx.zip 文件名中的xxx表示具体的版本号和时间戳,以实际发布的包名为准。 |
获取路径:Support-E,在此路径中查找下载ModelArts 6.5.906.1版本。
说明:
如果上述软件获取路径打开后未显示相应的软件信息,说明您没有下载权限,请联系您所在企业的华为方技术支持下载获取。 |
Snt9B基础镜像包 |
swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.1.rc1-py_3.10-hce_2.0.2503-aarch64-snt9b-20250513111215-29295f8 |
SWR上拉取。 |
Snt9B23基础镜像包 |
swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_8.1.rc1-py_3.10-hce_2.0.2503-aarch64-snt9b23-20250509115535-21587eb |
SWR上拉取。 |
约束限制
- 本文档适配昇腾云ModelArts 6.5.906版本,请参考表2 获取软件和镜像获取配套版本的软件包和镜像,请严格遵照版本配套关系使用本文档。
- 确保容器可以访问公网。
步骤一:检查环境
- 请参考Lite Server资源开通,购买Lite Server资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。
购买Lite Server资源时如果无可选资源规格,需要联系华为云技术支持申请开通。
当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据。
- SSH登录机器后,检查NPU卡状态。运行如下命令,返回NPU设备信息。
npu-smi info # 在每个实例节点上运行此命令可以看到NPU卡状态
如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装固件和驱动,或释放被挂载的NPU。
- 检查是否安装docker。
docker -v #检查docker是否安装
如尚未安装,运行以下命令安装docker。
yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
- 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。
sysctl -p | grep net.ipv4.ip_forward
如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf sysctl -p | grep net.ipv4.ip_forward
步骤二:下载镜像并启动容器
- 获取基础镜像。建议使用官方提供的镜像部署推理服务。镜像地址{image_url}参见表2 获取软件和镜像。
docker pull {image_url}
- 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。
export work_dir="自定义挂载的工作目录" export container_work_dir="自定义挂载到容器内的工作目录" export container_name="自定义容器名称" export image_name="镜像名称" docker run -itd \ -u root \ --device=/dev/davinci0 \ --device=/dev/davinci1 \ --device=/dev/davinci2 \ --device=/dev/davinci3 \ --device=/dev/davinci4 \ --device=/dev/davinci5 \ --device=/dev/davinci6 \ --device=/dev/davinci7 \ --device=/dev/davinci8 \ --device=/dev/davinci9 \ --device=/dev/davinci10 \ --device=/dev/davinci11 \ --device=/dev/davinci12 \ --device=/dev/davinci13 \ --device=/dev/davinci14 \ --device=/dev/davinci15 \ --device=/dev/davinci_manager \ --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \ -v /etc/hccn.conf:/etc/hccn.conf \ --shm-size 1024g \ --net=host \ -v ${work_dir}:${container_work_dir} \ --name ${container_name} \ $image_name \ /bin/bash
参数说明:
- -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。为方便两个地址可以相同。例如“/home/maptrv2:/home/maptrv2”
${work_dir}为宿主机中工作目录,目录下可存放项目所需代码、数据等文件。请确保容器内用户对此路径有足够的访问权限。
${container_work_dir}为要挂载到的容器中的目录。
- --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如“maptrv2_test”。
- --device=/dev/davinci0 :挂载对应卡到容器,请按照机器实际需要使用到的NPU数量来配置,上面给出的是使用16卡NPU训练的例子。
- image_name:表示镜像名称或者镜像ID。
- 请确保容器内用户对${work_dir}有足够的访问权限。
- ${container_work_dir}不能为/home/ma-user目录,此目录为ma-user用户家目录。
- driver及npu-smi需同时挂载至容器。
- 不要将多个容器绑到同一个NPU上,会导致后续的容器无法正常使用NPU功能。
- -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。为方便两个地址可以相同。例如“/home/maptrv2:/home/maptrv2”
- 进入容器。
docker exec -u root -it ${container_name} bash
步骤三:容器内训练环境准备
- 创建新的虚拟环境。
conda create -n Maptrv2 --clone PyTorch-2.1.0 conda activate Maptrv2
- 创建项目目录。
mkdir -p /home/Maptrv2 cd /home/Maptrv2 export P_HOME=`pwd`
- 将获取到的插件代码包AscendCloud-ACD-*.zip文件上传到容器的${P_HOME}目录下,并解压。插件代码包获取请参见表2。
cd $P_HOME unzip -q AscendCloud-ACD-*.zip # 解压自动驾驶相关版本包
- 安装 DrivingSDK。
cd $P_HOME git clone https://gitee.com/ascend/DrivingSDK.git -b master cd DrivingSDK/ git checkout 633ef95628c23c76d5e3c2f81aaf4b2954895a4a pip3 install -r requirements.txt vim CMakePresets.json # 修改 "ENABLE_ONNX": 为False umask 0027 # 保证文件权限正确 bash ci/build.sh --python=3.10 cd dist/ pip install mx_driving-1.0.0+git633ef95-cp310-cp310-linux_aarch64.whl pip3 show mx-driving # mx-driving 1.0.0+git633ef95
- 安装mmcv-full 1.x。
# 卸载镜像内原有的mmcv pip uninstall mmcv cd $P_HOME git clone -b 1.x https://github.com/open-mmlab/mmcv.git cd mmcv git checkout 1d8f9285674f2b1f9f2d7758d3f945ebb74fcf82 git apply ../AscendCloudDriving-*/models/MapTRv2/mmcv_full.patch MMCV_WITH_OPS=1 MAX_JOBS=8 FORCE_NPU=1 python setup.py build_ext MMCV_WITH_OPS=1 FORCE_NPU=1 python setup.py install pip list|grep mmcv # mmcv-full 1.7.2
- 更新模型代码。
cd $P_HOME git clone -b maptrv2 https://github.com/hustvl/MapTR.git cd MapTR git checkout e03f097abef19e1ba3fed5f471a8d80fbfa0a064 git apply ../AscendCloudDriving-*/models/MapTRv2/maptrv2.patch cp -r ../AscendCloudDriving-*/models/MapTRv2/npu_scripts ./
- 安装mmdetection3d v1.0.0rc4源码。
cd $P_HOME/MapTR rm -rf mmdetection3d git clone -b v1.0.0rc4 https://github.com/open-mmlab/mmdetection3d.git cd mmdetection3d git checkout c9541b0db89498fdea5cafd05b7b17f7b625b858 git apply ../../AscendCloudDriving-*/models/MapTRv2/mmdetection.patch pip install -e .
- 安装其它依赖。
pip install mmdet==2.28.2 pip install mmsegmentation==0.30.0 pip install av2 pip install numpy==1.23.2 conda install -c conda-forge geos pip install Shapely==1.8.5
步骤四:准备训练数据集和模型权重
若没有准备数据集,需下载nuscenes数据集,然后再软连接到data目录。
- 创建data目录并将下载的数据集做预处理。
cd $P_HOME/MapTR mkdir data && cd data # 将下载好的数据集移动到此目录 ln -s /path/nuscenes ./ ln -s /path/can_bus ./ # 对数据集进行预处理 cd $P_HOME/MapTR python tools/maptrv2/custom_nusc_map_converter.py --root-path ./data/nuscenes --out-dir ./data/nuscenes_pkl --extra-tag nuscenes --version v1.0 --canbus ./data
- 下载预训练模型权重。
cd $P_HOME/MapTR mkdir ckpts cd ckpts wget https://download.pytorch.org/models/resnet50-19c8e357.pth
最终目录结构如下。MapTR ├── data/ │ ├── can_bus/ │ ├── nuscenes/ │ │ ├── lidarseg/ │ │ ├── maps/ │ │ ├── panoptic/ │ │ ├── samples/ │ │ ├── v1.0-test/ | | ├── v1.0-trainval/ | | ├── nuscenes_map_anns_val.json | | ├── nuscenes_map_infos_temporal_test.pkl | | ├── nuscenes_map_infos_temporal_train.pkl | | ├── nuscenes_map_infos_temporal_val.pkl
步骤五:开始训练与评估
- 进行8卡训练(精度)
cd $P_HOME/MapTR bash npu_scripts/train_full.sh 8
- 进行8卡训练(性能)
cd $P_HOME/MapTR bash npu_scripts/train_perf.sh 8
- 进行16卡训练(性能)
cd $P_HOME/MapTR bash npu_scripts/train_perf.sh 16
- 查看输出日志
# 精度结果目录 $P_HOME/MapTR/test/out/0/full # 评估结果目录 $P_HOME/MapTR/test/out/0/perf