MapTR for PyTorch
目录
简介
模型介绍
MapTR是一种高效的端到端Transformer模型,用于在线构建矢量化高清地图(HD Map)。高清地图在自动驾驶系统中是规划的基础和关键组件,提供了丰富而精确的环境信息。MapTR提出了一种统一的置换等价建模方法,将地图元素表示为等价置换组的点集,这样不仅可以准确描述地图元素的形状,还能稳定学习过程。此外,MapTR设计了一个分层查询嵌入方案,以灵活地编码结构化地图信息,并执行分层二分匹配来学习地图元素。
支持任务列表
本仓已经支持以下模型任务类型
| 模型 | 任务列表 | 是否支持 |
|---|---|---|
| MapTR | 训练 | ✔ |
代码实现
-
参考实现:
url=https://github.com/hustvl/MapTR commit_id=fa420a2e756c9e19b876bdf2f6d33a097d84be73
MapTR
准备训练环境
安装环境
表 1 三方库版本支持表
| 三方库 | 支持版本 |
|---|---|
| PyTorch | 2.1 |
安装昇腾环境
请参考昇腾社区中《Pytorch框架训练环境准备》文档搭建昇腾环境,本仓已支持表2中软件版本。
表 2 昇腾软件版本支持表
| 软件类型 | 首次支持版本 |
|---|---|
| FrameworkPTAdapter | 7.0.0 |
| CANN | 8.1.RC1 |
- 安装mmdet3d
-
在模型根目录下,克隆mmdetection3d仓,并进入mmdetection3d目录
git clone -b v1.0.0rc4 https://github.com/open-mmlab/mmdetection3d.git cd mmdetection3d -
在mmdetection3d目录下,修改代码
(1)删除requirements/runtime.txt中第3行 numba==0.53.0
(2)修改mmdet3d/init.py中第22行 mmcv_maximum_version = '1.7.0'为mmcv_maximum_version = '1.7.2'
-
安装包
pip install -v -e .
- 安装mmcv
-
在模型根目录下,克隆mmcv仓,并进入mmcv目录安装
git clone -b 1.x https://github.com/open-mmlab/mmcv cd mmcv 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 develop
- 安装Driving SDK加速库,具体方法参考原仓。
- 在模型根目录下执行以下命令,安装模型对应PyTorch版本需要的依赖。
pip install -r requirements.txt
- 在当前python环境下执行
pip show pip,得到三方包安装路径Location,记作location_path,在模型根目录下执行以下命令来替换patch。
bash replace_patch.sh --packages_path=location_path
- 根据操作系统,安装tcmalloc动态库。
- OpenEuler系统
在当前python环境和路径下执行以下命令,安装并使用tcmalloc动态库。
mkdir gperftools
cd gperftools
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.16/gperftools-2.16.tar.gz
tar -zvxf gperftools-2.16.tar.gz
cd gperftools-2.16
./configure --prefix=/usr/local/lib --with-tcmalloc-pagesize=64
make
make install
echo '/usr/local/lib/lib/' >> /etc/ld.so.conf
ldconfig
export LD_LIBRARY_PATH=/usr/local/lib/lib/:$LD_LIBRARY_PATH
export PATH=/usr/local/lib/bin:$PATH
export LD_PRELOAD=/usr/local/lib/lib/libtcmalloc.so.4
- Ubuntu系统
在当前python环境和路径下执行以下命令,安装并使用tcmalloc动态库。在安装tcmalloc前,需确保环境中含有autoconf和libtool依赖包。
安装libunwind依赖:
git clone https://github.com/libunwind/libunwind.git
cd libunwind
autoreconf -i
./configure --prefix=/usr/local
make -j128
make install
安装tcmalloc动态库:
wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.16/gperftools-2.16.tar.gz
tar -xf gperftools-2.16.tar.gz && cd gperftools-2.16
./configure --prefix=/usr/local/lib --with-tcmalloc-pagesize=64
make -j128
make install
export LD_PRELOAD="$LD_PRELOAD:/usr/local/lib/lib/libtcmalloc.so"
- 编译优化
编译优化是指通过毕昇编译器的LTO和PGO编译优化技术,源码构建编译Python、PyTorch、torch_npu(Ascend Extension for PyTorch)三个组件,有效提升程序性能。
本节介绍Python、Torch和torch_npu LTO编译优化方式,采用编译优化后的性能见“训练结果”小节。
- 安装毕昇编译器
将CANN包安装目录记为cann_root_dir,执行下列命令安装毕昇编译器,官网下载毕昇编译器4.1.0版本:https://www.hikunpeng.com/zh/developer/devkit/download/bishengcompiler。
tar -xvf BiShengCompiler-4.1.0-aarch64-linux.tar.gz
export PATH=$(pwd)/BiShengCompiler-4.1.0-aarch64-linux/bin:$PATH
export LD_LIBRARY_PATH=$(pwd)/BiShengCompiler-4.1.0-aarch64-linux/lib:$LD_LIBRARY_PATH
source ${cann_root_dir}/set_env.sh
- 安装依赖,将安装mpdecimal依赖包的目录记为mpdecimal_install_path。
wget https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-2.5.1.tar.gz
tar -xvf mpdecimal-2.5.1.tar.gz
cd mpdecimal-2.5.1
bash ./configure --prefix=${mpdecimal_install_path}
make -j
make install
- 获取Python源码并编译优化
执行以下指令获取Python版本及安装目录,将Python安装路径记为python_path。
python -V
which python
假设which python指令的结果为/usr/local/bin/python,则对应的python_path为/usr/local。
在Python源码下载地址下载对应版本的Python源码并解压。
以Python 3.8.17为例:
tar -xvf Python-3.8.17.tgz
cd Python-3.8.17
export CC=clang
export CXX=clang++
./configure --prefix=${python_path} --with-lto --enable-optimizations
make -j
make install
- Pytorch和torch_npu编译优化
推荐Pytorch和torch_npu采用专有镜像编译。
1) 创建编译优化基础镜像。以arm的镜像为例:
-
arm镜像地址: https://pytorch-package.obs.cn-north-4.myhuaweicloud.com/images/pytorcharm_compile.tar.gz
将镜像的image_id记为image_id,将创建容器时的宿主机路径和容器路径分别记为path1和path2:
docker load -i pytorcharm_compile.tar.gz docker images // 查看镜像的image_id docker run -it --network=host -v path1:path2 image_id bash // 创建容器
2) 在编译优化基础镜像中配置环境,以python3.8为例,如果使用其他版本的python3.8需修改python3软链接:
cd /usr/local/bin/
ln -s /opt/_internal/cpython-3.7.17/bin/pip3.7 pip3.7
ln -s /opt/_internal/cpython-3.8.17/bin/pip3.8 pip3.8
ln -s /opt/_internal/cpython-3.9.17/bin/pip3.9 pip3.9
ln -s python3.8 python3
3) 按照“安装毕昇编译器”一节在编译优化基础镜像中使能毕昇编译器。
4) 下载Torch源码。以Torch2.1.0、Python3.8为例:
git clone -b v2.1.0 https://github.com/pytorch/pytorch.git pytorch-2.1.0
cd pytorch-2.1.0
git submodule sync
git submodule update --init --recursive
pip3.8 install -r requirements.txt
打开CMakeLists.txt文件,注释第921行:
append_cxx_flag_if_supported("-Werror=cast-function-type" CMAKE_FXX_FLAGS)
屏蔽告警错误。
5) 配置编译参数,设置环境变量,并进行LTO优化编译。
export CMAKE_C_FLAGS="-flto=thin -fuse-ld=lld"
export CMAKE_CXX_FLAGS="-flto=thin -fuse-ld=lld"
export CC=clang
export CXX=clang++
export USE_XNNPACK=0
export OMP_PROC_BIND=false
git clean -dfx
python3 setup.py bdist_wheel
6) 安装Torch,并下载torch_npu源码,进行LTO优化编译。以torch2.1.0配套的torch_npu为例:
pip3.8 install /dist/*.whl --force-reinstall --no-deps
cd ../
git clone -b v2.1.0-7.0.0 https://gitcode.com/Ascend/pytorch.git torch_npu
cd torch_npu
git clean -dfx
bash ci/build.sh --python=3.8 --enable_lto
7) 在模型所使用的Python环境下,安装LTO优化编译的Torch和torch_npu包。将LTO编译优化生成的torch包和torch_npu包路径分别记为torch_path和torch_npu_path:
pip install torch_path/*.whl torch_npu_path/*.whl --force-reinstall --no-deps
- 模型代码更新
git clone https://github.com/hustvl/MapTR.git
cp MapTR.patch MapTR
cd MapTR
git checkout 1b435fd9f0db9a14bb2a9baafb565200cc7028a2
git apply --reject --whitespace=fix MapTR.patch
cd ../
准备数据集
- 根据原仓Prepare Dataset章节准备数据集,数据集目录及结构如下:
MapTR
├── ckpts/
│ ├── resnet50-19c8e357.pth
├── data/
│ ├── can_bus/
│ ├── nuscenes/
│ │ ├── lidarseg/
│ │ ├── maps/
│ │ ├── panoptic/
│ │ ├── samples/
│ │ ├── v1.0-test/
| | ├── v1.0-trainval/
| | ├── nuscenes_infos_temporal_test_mono3d.coco.json
| | ├── nuscenes_infos_temporal_train_mono3d.coco.json
| | ├── nuscenes_infos_temporal_val_mono3d.coco.json
| | ├── nuscenes_map_anns_val.json
| | ├── nuscenes_infos_temporal_test.pkl
| | ├── nuscenes_infos_temporal_train.pkl
| | ├── nuscenes_infos_temporal_val.pkl
├── patch/
├── test/
├── MapTR/
说明: nuscenes数据集下的文件,通过运行以下指令生成:
pip install nuscenes-devkit
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0 --canbus ./data
准备预训练权重
- 在模型根目录下,执行以下指令下载预训练权重:
mkdir ckpts
cd ckpts
wget https://download.pytorch.org/models/resnet50-19c8e357.pth
快速开始
训练任务
本任务主要提供单机的8卡训练脚本。
开始训练
-
在模型根目录下,运行训练脚本。
该模型支持单机8卡、多机多卡训练。
- 单机8卡精度训练
bash test/train_8p.sh- 单机8卡性能训练
bash test/train_8p_performance.sh多机训练时增加以下环境配置。此外,拉起训练的脚本nnodes_train_8p_performance.sh或nnodes_train_8p.sh中WORLD_SIZE需要配置为实际多机的总卡数,目前默认值为16(双机)。
export HCCL_BUFFSIZE=200 # 当通过HCCL_WHITELIST_DISABLE开启了通信白名单校验功能时,需要通过此环境变量配置指向HCCL通信白名单配置文件的路径,只有在通信白名单中的IP地址才允许进行集合通信。 export HCCL_WHITELIST_DISABLE=1 export HCCL_WHITELIST_FILE=./whitelist # whitelist中的HCCL通信白名单配置文件格式为: # ip为各卡ip,格式为点分十进制,可以在各机上通过该语令查询8卡ip:for i in {0..7}; do hccn_tool -i $i -ip -g ; done { "host_ip": ["ip1", "ip2", ... , "ip16"] }- 多机多卡精度训练
以双机举例,假设每台机器8卡,则总共有16卡。
记主节点为master_addr,通信端口为port。
主节点拉起训练的脚本为:
bash test/nnodes_train_8p.sh 2 0 port master_addr副节点拉起训练的脚本为:
bash test/nnodes_train_8p.sh 2 1 port master_addr- 多机多卡性能训练
主节点拉起训练的脚本为:
bash test/nnodes_train_8p_performance.sh 2 0 port master_addr副节点拉起训练的脚本为:
bash test/nnodes_train_8p_performance.sh 2 1 port master_addr
训练结果
单机八卡
| 芯片 | 卡数 | global batch size | Precision | epoch | mAP | 性能-FPS |
|---|---|---|---|---|---|---|
| 竞品A | 8p | 32 | fp32 | 24 | 48.7 | - |
| Atlas 800T A2 | 8p | 32 | fp32 | 24 | 48.5 | - |
| 竞品A | 8p | 32 | fp32 | 1 | - | 33.20 |
| Atlas 800T A2 | 8p | 32 | fp32 | 1 | - | 34.85 |
多机多卡线性度
| 芯片 | 卡数 | global batch size | Precision | epoch | mAP | 性能-FPS | 线性度 |
|---|---|---|---|---|---|---|---|
| Atlas 800T A2*2 | 16p | 64 | fp32 | 1 | - | 66.3 | 95.12% |
变更说明
2025.08.13:优化模型性能计算脚本。
2025.05.22:更新Ubuntu系统安装tcmalloc高性能内存库的方式。
2025.04.17:优化模型性能打屏格式,修改Torch2.1.0适配的依赖包版本。
2025.03.31:优化模型性能计算脚本,增加Python&Torch&torch_npu编译优化性能。
2025.03.10:增加Python编译优化性能。
2025.03.04:进一步优化模型性能,更新性能数据。增加多机多卡训练脚本。
2025.02.21:优化模型性能,更新性能数据。
2025.02.10: 增加1epoch性能训练配置文件,更新Readme说明。
2024.11.08:首次发布
FAQ
- tcmalloc的动态库文件位置可能因环境配置会有所不同,找不到文件时可以进行搜索,一般安装在
/usr/lib64或者/usr/local目录下:
find /usr -name libtcmalloc.so*
找到对应路径下的动态库文件,libtcmalloc.so或者libtcmalloc.so.版本号都可以使用。