Swin Transformer 是由 Microsoft Research 在 2021 年提出的一种用于视觉任务的 Transformer 模型。
| 项目 | 版本 / 规格 |
|---|---|
| 操作系统 / 架构 | openEuler 24.03 (LTS) / aarch64 |
| 驱动 / 固件 | 25.2.0 / 7.0.3.220 |
| CANN | 8.2.RC2 |
| Python | 3.11.6 |
| torch / torch_npu | 2.5.1 / 2.5.1 |
从 AscendHub 下载 MindIE 镜像,根据硬件和系统架构选择对应版本。
创建 Docker 容器,根据需要修改镜像和容器名称:
IMAGE=swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC2-800I-A2-py311-openeuler24.03-lts
NAME=mindie-2.1.RC2
docker run -itd --net=host \
--privileged \
--ipc=host \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-w /workspace \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin \
-v /etc/hccn.conf:/etc/hccn.conf:ro \
--name $NAME \
$IMAGE /bin/bash进入 Docker 容器:
docker exec -it mindie-2.1.RC2 bash安装 Python 依赖:
pip install 'torch==2.5.1'
pip install 'torch-npu==2.5.1'
pip install 'torchvision==0.20.1'
pip install -U openmim
# 限制 numpy 版本,否则会出现版本不兼容
cd /workspace
echo "numpy<2" > constraints.txt
mim install mmengine -c constraints.txt
# 编译时依赖 gcc 等工具,如果系统缺少需要先安装
yum install -y gcc gcc-c++ make cmake ninja-build
# 安装mmdet,会自动安装mmcv-2.1.0,需要卸载
cd /workspace
mim install mmdet -c constraints.txt
pip uninstall -y mmcv==2.1.0
# 编译安装 mmcv,如果系统中没有 git,需要手动安装
yum install git
git clone https://github.com/open-mmlab/mmcv.git
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
# 安装其它依赖
cd /workspace
pip uninstall -y opencv-python opencv-python-headless
pip install -U opencv-python-headless -c constraints.txt
pip install aenum
pip install onnxruntime由于 MMDetection 较长时间未更新,需要手动修改版本限制,将 mmcv_version < digit_version(mmcv_maximum_version)) 修改为 mmcv_version <= digit_version(mmcv_maximum_version)):
# 修改版本限制
vim /usr/local/lib/python3.11/site-packages/mmdet/__init__.py
# 后续训练推理时会用到相关代码,同样修改版本限制
cd /workspace
git clone https://github.com/open-mmlab/mmdeploy.git
git clone https://github.com/open-mmlab/mmdetection.git
vim /workspace/mmdetection/mmdet/__init__.py下载 COCO 2017 数据集和 Swin Transformer 基础权重:
cd /workspace
mkdir -p dataset/coco
cd dataset/coco
# 下载训练集、验证集和标注文件
wget http://images.cocodataset.org/zips/train2017.zip
wget http://images.cocodataset.org/zips/val2017.zip
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
# 解压
unzip train2017.zip
unzip val2017.zip
unzip annotations_trainval2017.zip
# 下载基础模型
cd /workspace
mkdir models && cd models
wget https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth编写训练配置文件,参考 /workspace/mmdetection/configs 目录下的配置,以下配置为基于 Swin Transformer 基模训练 Mask-RCNN 模型。
主要涉及的配置如下:
data_root后面注意:COCO2017 数据集很大,训练时间较长,实际训练时可根据具体情况调整数据集,标注数据需与 COCO 标准格式保持一致即可。
mkdir /workspace/train
vim /workspace/train/mask_rcnn_swin-train.pymask_rcnn_swin-train.py 文件内容如下:
_base_ = 'mmdet::swin/mask-rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py'
data_root = '/workspace/dataset/coco/'
model = dict(
backbone=dict(
init_cfg=dict(
type='Pretrained',
checkpoint='/workspace/models/swin_tiny_patch4_window7_224.pth'
)
)
)
load_from = None
train_dataloader = dict(
batch_size=4,
dataset=dict(
data_root=data_root,
ann_file='annotations/instances_train2017.json',
data_prefix=dict(img='train2017/')
)
)
val_dataloader = dict(
dataset=dict(
data_root=data_root,
ann_file='annotations/instances_val2017.json',
data_prefix=dict(img='val2017/')
)
)
test_dataloader = val_dataloader
val_evaluator = dict(
ann_file=data_root + 'annotations/instances_val2017.json'
)
test_evaluator = val_evaluator执行以下命令使用 NPU 开始后台训练,其中 ASCEND_RT_VISIBLE_DEVICES 用于指定训练时使用的卡号:
nohup bash -c '
ASCEND_RT_VISIBLE_DEVICES=4 \
python /workspace/mmdetection/tools/train.py /workspace/train/mask_rcnn_swin-train.py' \
> /workspace/train/train.log 2>&1 &单卡训练情况查看:
npu-smi info以下命令使用 0、1、2、3 共 4 张卡进行训练,末尾的参数 4 表示训练用的卡的数量:
nohup bash -c '
ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \
bash /workspace/mmdetection/tools/dist_train.sh \
/workspace/train/mask_rcnn_swin-train.py 4' \
> /workspace/train/train.log 2>&1 &多卡训练情况查看:
根据日志确认 Checkpoints 保存目录,查看 Checkpoints 文件:
根据 loss 值绘制图像,loss 值正常收敛:

下载模型权重及配置文件:
mkdir /workspace/infer
mim download mmdet --config mask-rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco --dest /workspace/infer基于原始文件创建部署配置文件,添加 shape 信息:
cp /workspace/mmdeploy/configs/mmdet/instance-seg/instance-seg_onnxruntime_static.py /workspace/mmdeploy/configs/mmdet/instance-seg/instance-seg_onnxruntime_static_640x640.py
vim /workspace/mmdeploy/configs/mmdet/instance-seg/instance-seg_onnxruntime_static_640x640.py修改后的文件如下:
_base_ = [
'../_base_/base_instance-seg_static.py',
'../../_base_/backends/onnxruntime.py'
]
onnx_config = dict(
input_shape=[640, 640]
)使用 mmdeploy 将 pth 权重文件转换为 ONNX 模型文件:
PYTHONPATH=/workspace/mmdeploy:$PYTHONPATH
python /workspace/mmdeploy/tools/deploy.py \
/workspace/mmdeploy/configs/mmdet/instance-seg/instance-seg_onnxruntime_static_640x640.py \
/workspace/infer/mask-rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py \
/workspace/infer/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco_20210906_131725-bacf6f7b.pth \
/workspace/mmdetection/demo/demo.jpg \
--work-dir /workspace/convert_onnx \
--show使用 atc 工具将 ONNX 模型转换为 OM 文件,注意 --input_shape 参数与前面转换 ONNX 时的参数配置保持一致,且 soc_version 需要修改为对应的 NPU 卡型号:
atc --model=/workspace/convert_onnx/end2end.onnx \
--framework=5 \
--output=/workspace/convert_om \
--input_format=NCHW \
--input_shape="input:1,3,640,640" \
--soc_version=Ascend910B3 \
--precision_mode=allow_mix_precision查看转换结果:
安装 ais_bench:
yum install -y zlib-devel
cd /workspace
pip install -v 'git+https://gitee.com/ascend/tools.git#egg=aclruntime&subdirectory=ais-bench_workload/tool/ais_bench/backend' -c constraints.txt
pip install -v 'git+https://gitee.com/ascend/tools.git#egg=ais_bench&subdirectory=ais-bench_workload/tool/ais_bench' -c constraints.txt创建推理脚本并执行:infer_by_om_model.py,--threshold 参数用于过滤置信度小于该阈值的检测结果:
python /workspace/infer/infer_by_om_model.py \
-m /workspace/convert_om_linux_aarch64.om \
-i /workspace/mmdetection/demo/demo.jpg \
-o /workspace/om_infer_output \
--threshold 0.5查看推理结果:

现象:训练过程报错,Conv2D 算子执行失败,提示内存分配失败:
RuntimeError: The Inner error is reported as above. The process exits for this inner error, and the current working operator name is Conv2D.
...
EL0004: [PID: 31466] 2026-03-24-01:39:58.050.964 Failed to allocate memory.可能原因:batch_size 设置过大,NPU 内存不足
处理方法:调小训练配置文件中的 batch_size 大小,为保证训练速度,可以同时增加训练卡数
现象:atc 转换失败,提示 Reshape 节点 shape 检查失败:
E10042: [PID: 35338] 2026-03-24-01:57:30.600.339 GenerateOfflineModel execute failed.
...
[Node:/backbone/stages.0/blocks.0/attn/Reshape] Check shape failed可能原因:转换 ONNX 与 OM 时指定的 shape 不一致
处理方法:修改 ONNX 配置和 atc 命令中的 --input_shape 参数,使其保持一致