Ascend-SACT/Swin-Transformer
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

1. 模型概述

模型介绍

Swin Transformer 是由 Microsoft Research 在 2021 年提出的一种用于视觉任务的 Transformer 模型。

  • 核心思想:窗口注意力(Window Attention)+ 窗口平移(Shifted Window),在降低计算量的同时实现跨区域信息交互
  • 具有层次化结构(类似 CNN),支持多尺度特征
  • 计算复杂度从全局 O(N²) 降到近似线性 O(N),适合高分辨率图像
  • 可作为通用 backbone,广泛用于分类、目标检测、语义分割等任务
  • 通常通过 ImageNet 预训练后再迁移到下游任务

2. 迁移环境

2.1 硬件环境

  • 设备信息:Atlas 800T A2,910B3

2.2 软件环境

项目版本 / 规格
操作系统 / 架构openEuler 24.03 (LTS) / aarch64
驱动 / 固件25.2.0 / 7.0.3.220
CANN8.2.RC2
Python3.11.6
torch / torch_npu2.5.1 / 2.5.1

3. 资源与依赖

3.1 模型权重

  • Swin Transformer 基础模型:https://github.com/microsoft/Swin-Transformer
  • 基于 Swin Transformer 的 Mask-RCNN 模型:https://github.com/open-mmlab/mmdetection/blob/main/configs/swin/README.md
  • 文档中训练时使用的基础权重:https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth

3.2 数据集

  • COCO 2017 训练集:http://images.cocodataset.org/zips/train2017.zip
  • COCO 2017 验证集:http://images.cocodataset.org/zips/val2017.zip
  • COCO 2017 标注:http://images.cocodataset.org/annotations/annotations_trainval2017.zip

3.3 代码仓

  • Swin Transformer:https://github.com/microsoft/Swin-Transformer
  • MMDetection 目标检测框架:https://github.com/open-mmlab/mmdetection
  • MMDeploy 模型部署框架:https://github.com/open-mmlab/mmdeploy

3.4 容器镜像资源

  • MindIE 2.1.RC2 镜像:https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f

3.5 工具资源

  • atc:ONNX 转 OM 工具

4. 环境准备

4.1 资源准备

从 AscendHub 下载 MindIE 镜像,根据硬件和系统架构选择对应版本。

MindIE镜像下载

4.2 环境创建

  1. 创建 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
  2. 进入 Docker 容器:

    docker exec -it mindie-2.1.RC2 bash

4.3 依赖安装

  1. 安装 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
  2. 由于 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

    MMDetection版本限制修改

5. 训练迁移步骤

5.1 数据准备

下载 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

5.2 配置修改

编写训练配置文件,参考 /workspace/mmdetection/configs 目录下的配置,以下配置为基于 Swin Transformer 基模训练 Mask-RCNN 模型。

主要涉及的配置如下:

  • _base_:设置继承的基础配置
  • data_root:训练数据集路径
  • checkpoint:训练的基础模型
  • batch_size:每次同时训练的图片数量
  • ann_file:标注文件
  • data_prefix:数据集目录前缀,拼接在data_root后面

注意:COCO2017 数据集很大,训练时间较长,实际训练时可根据具体情况调整数据集,标注数据需与 COCO 标准格式保持一致即可。

mkdir /workspace/train
vim /workspace/train/mask_rcnn_swin-train.py

mask_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

5.3 单卡训练

  1. 执行以下命令使用 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 &
  2. 单卡训练情况查看:

    npu-smi info

    单卡训练查看NPU状态

    单卡训练查看日志

5.4 多卡训练

  1. 以下命令使用 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 &
  2. 多卡训练情况查看:

    多卡训练查看NPU状态

5.5 训练结果分析

  1. 根据日志确认 Checkpoints 保存目录,查看 Checkpoints 文件:

    日志确认Checkpoints目录

    查看Checkpoints文件

  2. 根据 loss 值绘制图像,loss 值正常收敛:

    训练Loss曲线

6. 推理迁移步骤

6.1 PyTorch 转换 ONNX

  1. 下载模型权重及配置文件:

    mkdir /workspace/infer
    mim download mmdet --config mask-rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco --dest /workspace/infer

    下载推理模型文件

  2. 基于原始文件创建部署配置文件,添加 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]
    )
  3. 使用 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

    ONNX模型转换结果

6.2 ONNX 转换 OM

  1. 使用 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
  2. 查看转换结果:

    OM模型转换结果

6.3 OM 模型推理

  1. 安装 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
  2. 创建推理脚本并执行: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

6.4 推理结果分析

查看推理结果:

OM模型推理结果

7. 问题排查

问题 1:模型训练时内存分配失败

  • 现象:训练过程报错,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 大小,为保证训练速度,可以同时增加训练卡数

问题 2:转换 OM 模型报错

  • 现象: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 参数,使其保持一致