Sparse4D模型基于ModelArts Lite Server适配PyTorch NPU训练指导
方案概览
Sparse4D是迈向长时序稀疏化3D目标检测的系列算法,属于时序多视角融合感知技术的范畴。Sparse4D通过稀疏采样和融合时空特征来迭代细化锚框,从而实现高效的3D检测,这种方法不需要依赖密集的视图变换和全局关注,因此对于边缘设备的部署更加友好。
该方法的核心包括稀疏四维采样和层次特征融合。稀疏四维采样指的是为每个3D锚点分配多个四维关键点,并将这些关键点投影到多视图、多尺度和多时间戳的图像特征上,以采样相应的特征。层次特征融合则是对不同视角、不同尺度、不同时间戳以及不同关键点的采样特征进行融合,生成高质量的实例特征。
Sparse4D在nuScenes数据集的排行榜上表现优异,超越了现有的稀疏算法和大多数基于鸟瞰图(BEV)的算法,展示了其卓越的感知性能。
本方案介绍了在ModelArts Lite Server上使用昇腾计算资源 Ascend Snt9B23或Ascend Snt9B开展Sparse4D模型训练的过程。
资源规格要求
推荐使用“西南-贵阳一”Region上的Lite Server资源和 Ascend Snt9B23或Ascend Snt9B单机。
名称 |
版本 |
---|---|
Driver |
24.1.0.6(Snt9B) 24.1.RC3.5(Snt9B23) |
PyTorch |
pytorch_2.1.0 |
获取软件和镜像
分类 |
名称 |
获取路径 |
---|---|---|
插件代码包 |
AscendCloud-ACD-6.5.906-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_id="镜像名称或ID" export datasets_dir="存放已有数据集的位置" 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 \ --shm-size 1024g \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \ -v /etc/hccn.conf:/etc/hccn.conf \ -v ${work_dir}:${container_work_dir} \ -v ${datasets_dir}:${datasets_dir} \ --net=host \ --name ${container_name}\ ${image_id} \ /bin/bash
参数说明:
- --device=/dev/davinci0 :挂载对应卡到容器,当需要挂载多卡,请依次添加多项该配置,示例为16卡,最小卡数为8卡。
- -v ${work_dir}:${container_work_dir}:代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录,目录下可存放项目所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。
- -v ${datasets_dir}:${datasets_dir}:容器中挂载宿主机中存放数据集的目录,若宿主机中存在数据集,可以添加该参数,在容器中通过软连接将数据集连接到项目对应的数据集中。若打算重新下载数据集或宿主机中没有数据集,可以不添加该参数。为方便两个地址可以相同。
- --name ${container_name}:容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如sparse4d。
- ${image_id}:镜像的ID,可以使用docker images命令查看。
- 进入容器。需要将${container_name}替换为实际的容器名称。
docker exec -it ${container_name} bash
步骤三:部署模型代码、安装依赖环境
- 安装插件代码包。
将获取到的插件代码包AscendCloud-ACD-*.zip文件上传到容器的{container_work_dir}/tools目录下,并解压。插件代码包获取请参考表2 获取软件和镜像。
cd ${container_work_dir} mkdir tools && cd tools unzip AscendCloud-ACD-*.zip #解压
Sparse4D模型训练所需代码存放在解压后得到的文件夹中的models\Sparse4D目录下,Sparse4D代码包结构如下:Sparse4D ├── test/ ├── ├── train_full_8p.sh ├── ├── train_performance_8p.sh ├── mmcv.patch ├── mmdet.patch ├── requirements.txt ├── Sparse4D.patch ├── README.md
后面将根据需要,拷贝对应的文件到指定文件夹。
- 安装模型代码。
在容器工作目录{container_work_dir}下,拉取模型代码。
cd ${container_work_dir} git clone https://github.com/HorizonRobotics/Sparse4D.git cd Sparse4D git checkout c41df4bbf7bc82490f11ff55173abfcb3fb91425
将插件代码包中的Sparse4D.patch复制到${container_work_dir}/Sparse4D模型源码目录中。
进入Sparse4D目录应用Sparse4D.patch文件。
cd ${container_work_dir}/Sparse4D git apply Sparse4D.patch # 从代码包获取
- 安装DrivingSDK。
在${container_work_dir}目录下,拉取DrivingSDK代码。
cd ${container_work_dir} git clone https://gitee.com/ascend/DrivingSDK.git -b master cd DrivingSDK git checkout 81abb57a0c102c9bb7b1d45e506853df22e55dd1
安装相关的依赖库。pip install -r requirements.txt
构建whl包并安装。vi CMakePresets.json # 修改 "ENABLE_ONNX"选项: 为False umask 0027 bash ci/build.sh --python=3.10 # 生成的 whl 包在 mx_driving/dist 目录下 # 命名规则:mx_driving-1.0.0+git{commit_id}-cp{python_version}-linux_{arch}.whl pip install ./dist/mx_driving-1.0.0+git81abb57-cp310-cp310-linux_aarch64.whl
- 安装matplotlib 3.5.3。
cd ${container_work_dir} git clone -b v3.5.3 --depth 1 https://github.com/matplotlib/matplotlib.git cd matplotlib mkdir build && cd build wget https://downloads.sourceforge.net/project/freetype/freetype2/2.6.1/freetype-2.6.1.tar.gz tar xzf freetype-2.6.1.tar.gz cd .. pip install .
- 安装模型的基础依赖。
- 安装mmcv 1.x。
在${container_work_dir}目录下,拉取mmcv代码。
cd ${container_work_dir} git clone -b 1.x https://github.com/open-mmlab/mmcv.git
将插件代码包中的mmcv.patch复制到 ${container_work_dir}/mmcv模型源码目录中。
进入mmcv应用mmcv.patch文件。cd mmcv git apply --reject mmcv.patch # 从代码包获取
安装mmcv-full。MMCV_WITH_OPS=1 FORCE_NPU=1 python setup.py develop
- 安装mmdet3D。
在${container_work_dir} 目录下,拉取mmdetection代码。
cd ${container_work_dir} git clone -b v2.28.2 https://github.com/open-mmlab/mmdetection.git
将本代码包中的mmdet.patch复制到${container_work_dir}/mmdetection模型源码目录中。
进入mmdetection目录,应用mmdet.patch文件,并安装mmdet3D。cd mmdetection git apply mmdet.patch # 从代码包获取 pip install -e .
步骤四:准备训练所需数据
- 准备nuscenes数据集。
若已有nuscenes数据集,并且已挂载到${datasets_dir}目录下,可以将nuscenes数据集软连接到data目录下,例如:
cd ${container_work_dir}/Sparse4D/data ln -s ${datasets_dir}/xxx/xxx/nuscenes .
若没有准备数据集,需下载nuscenes数据集,然后再软连接到data目录。
下载nuscenes v1.0数据集地址:https://www.nuscenes.org/nuscenes#download
- 数据集预处理。
在data目录下创建nuscenes_anno_pkls目录,并运行数据集预处理脚本,生成pkl文件。
cd ${container_work_dir}/Sparse4D mkdir -p data/nuscenes_anno_pkls # 完整数据集进行预处理 python tools/nuscenes_converter.py --version v1.0-trainval,v1.0-test --info_prefix data/nuscenes_anno_pkls/nuscenes
通过K-means生成锚框。export PYTHONPATH=$PYTHONPATH:${container_work_dir}/Sparse4D export OPENBLAS_NUM_THREADS=1 export GOTO_NUM_THREADS=1 export OMP_NUM_THREADS=1 python tools/anchor_generator.py --ann_file data/nuscenes_anno_pkls/nuscenes_infos_train.pkl
- 获取预训练权重。
cd ${container_work_dir}/Sparse4D mkdir ckpt wget https://download.pytorch.org/models/resnet50-19c8e357.pth -O ckpt/resnet50-19c8e357.pth
步骤五:训练及评估
- 训练前准备。
为了正常评估,需要修改motmetrics库中的代码。
vi /home/ma-user/anaconda3/envs/PyTorch-2.1.0/lib/python3.10/site-packages/motmetrics/metrics.py # 第8行附近,将 from collections import OrderedDict, Iterable 修改为: from conllections import OrderedDict from conllections.abc import Iterable # 第58行附近,将 getargspec 改为 getfullargspec deps = inspect.getfullargspec(fnc).args[1:] # assumes dataframe as first argument
将插件代码包中的test目录及其中的训练脚本train_full.sh和train_performance.sh拷贝到{container_work_dir}/Sparse4D文件夹下。
- 开始训练与评估。
使用原始方式进行训练与评估。
cd ${container_work_dir}/Sparse4D # 单机 8 卡训练 bash local_train.sh sparse4dv3_temporal_r50_1x8_bs6_256x704 8 # 单机 8 卡评估 bash local_test.sh sparse4dv3_temporal_r50_1x8_bs6_256x704 8 ./work_dirs/sparse4dv3_temporal_r50_1x8_bs6_256x704/latest.pth
使用插件代码包中包含优化项以及信息统计的脚本进行训练与验证(推荐,性能较好)。cd ${container_work_dir}/Sparse4D # 单机 8 卡精度训练 bash test/train_full.sh 8 # 单机 8 卡性能训练 bash test/train_performance.sh 8
若使用16卡进行训练,除了在启动训练命令处将8改成16外,还需修改配置文件的batch_size。使用16卡训练示例:# 训练脚本 bash local_train.sh sparse4dv3_temporal_r50_1x8_bs6_256x704 16 # 或者 bash test/train_full.sh 16 # 配置文件 vi ${container_work_dir}/Sparse4D/projects/configs/sparse4dv3_temporal_r50_1x8_bs6_256x704.py # 修改第 63、64 行 total_batch_size、num_gpus 改为 total_batch_size = 96 num_gpus = 16
训练完成后,结果保存在${container_work_dir}/Sparse4D/work_dirs/sparse4dv3_temporal_r50_1x8_bs6_256x704文件夹下。
步骤六:毕昇编译优化
此外,在插件代码包中的Bisheng文件夹下,提供了毕昇编译过的pytorch和torch_npu的whl包,通过安装毕昇编译过的包之后再进行训练,在不同训练方式和设备上训练会有不同幅度的性能提升,其中原始训练方式的提升比较明显,下面介绍搭建毕昇编译环境的训练方法。
- 新建conda环境。
- 下载并安装毕昇编译器。
- 毕昇编译器获取请参考此文档的下载编译器部分,单击链接下载完成后,将下载的包上传到服务器。
- 解压毕昇编译器包
tar -xvf BiShengCompiler-4.1.0-aarch64-linux.tar.gz
- 配置环境变量。参考下列命令设置真实的毕昇编译器包的路径。
export PATH=/path/to/BiShengCompiler-4.1.0-aarch64-linux/bin:$PATH export LD_LIBRARY_PATH=/path/to/BiShengCompiler-4.1.0-aarch64-linux/lib:$LD_LIBRARY_PATH
- 检查是否安装成功。
# 执行命令,若安装成功将打印毕昇编译器版本信息 clang -v
- 安装编译优化过的PyTorch和torch_npu。
- 训练前准备。
高性能内存库优化:
export LD_PRELOAD="$LD_PRELOAD:/usr/lib64/libtcmalloc.so.4"
- 参考步骤五:训练及评估开始训练与验证。