文件最后提交记录最后更新时间
!1957 [东北大学][高校贡献][PyTorch离线推理][swin_99]--初次提交 * update ACL_PyTorch/contrib/cv/segmentation/swin_99/README.md. * 删除文件 ACL_PyTorch/contrib/cv/segmentation/swin_99/.keep * 初次提交 * 新建 swin_99 3 年前
!6851 [Clean Code] 修改芯片型号描述 Merge pull request !6851 from 施康/master 1 年前
!1957 [东北大学][高校贡献][PyTorch离线推理][swin_99]--初次提交 * update ACL_PyTorch/contrib/cv/segmentation/swin_99/README.md. * 删除文件 ACL_PyTorch/contrib/cv/segmentation/swin_99/.keep * 初次提交 * 新建 swin_99 3 年前
!1957 [东北大学][高校贡献][PyTorch离线推理][swin_99]--初次提交 * update ACL_PyTorch/contrib/cv/segmentation/swin_99/README.md. * 删除文件 ACL_PyTorch/contrib/cv/segmentation/swin_99/.keep * 初次提交 * 新建 swin_99 3 年前
!1957 [东北大学][高校贡献][PyTorch离线推理][swin_99]--初次提交 * update ACL_PyTorch/contrib/cv/segmentation/swin_99/README.md. * 删除文件 ACL_PyTorch/contrib/cv/segmentation/swin_99/.keep * 初次提交 * 新建 swin_99 3 年前
!1957 [东北大学][高校贡献][PyTorch离线推理][swin_99]--初次提交 * update ACL_PyTorch/contrib/cv/segmentation/swin_99/README.md. * 删除文件 ACL_PyTorch/contrib/cv/segmentation/swin_99/.keep * 初次提交 * 新建 swin_99 3 年前
!1957 [东北大学][高校贡献][PyTorch离线推理][swin_99]--初次提交 * update ACL_PyTorch/contrib/cv/segmentation/swin_99/README.md. * 删除文件 ACL_PyTorch/contrib/cv/segmentation/swin_99/.keep * 初次提交 * 新建 swin_99 3 年前
README.md

swin_99 模型推理指导


概述

Transformer 在 NLP 领域表现优异,如何将 Transformer 从 NLP 领域应用到 CV 领域?其挑战来自两个领域在尺度与分辨率上的差异。NLP 任务中每个词向量的维度是固定的,而 CV 任务中往往图像尺度变化较大;且与文本段落中的单词量相比,图像中的像素分辨率要高得多。为了解决这些问题,作者提出了一种分层 Transformer,通过 Shifted windows(移位窗口) 将自注意力的计算限制在不重叠的局部窗口范围内,同时允许跨窗口连接,从而带来更高的效率。这种分层架构具有在各种尺度上建模的灵活性,且只有相对于图像大小的线性计算复杂度。Swin Transformer 的这些特性使其与广泛的 CV 任务兼容,包括图像分类和密集预测任务,例如目标检测和语义分割。在这些任务上的优异表现表明,Swin Transformer 可以作为 CV 领域的通用主干网络。


推理环境


快速上手

获取源码

  1. 克隆开源仓源码

    git clone -b v0.28.0 https://github.com/open-mmlab/mmsegmentation.git
    cd mmsegmentation
    git reset --hard b51670b61339e5b10c5ab6c277de6b6a387fdff0
    
  2. 执行以下命令创建 Python 虚拟环境并安装所需的依赖

    conda create -n swin99 python=3.8
    conda activate swin99
    pip3 install torch==1.10.0 torchvision
    pip3 install openmim
    mim install mmcv-full==1.6.0
    pip3 install tqdm
    pip3 install decorator
    pip3 install sympy
    pip3 install -v -e .
    
  3. 下载本仓,将本仓内的 Python 脚本放置于当前目录下

  4. 创建一个目录,用于存放整个推理过程中所需文件与生成文件

    mkdir swin99
    

准备数据集

  1. 获取原始数据集
    本推理项目使用 ADE20K 的 2000 张验证集图片来验证模型精度,请进入 ADE20K官网 自行下载数据集(需要先注册)。下载后请自行解压或参考以下命令:

    mkdir -p data/ade
    unzip /path/to/ADEChallengeData2016.zip -d data/ade/
    

    最终,验证集原始图片与标注图片的存放结构如下:

    ├── data/ade/ADEChallengeData2016/
        ├── annotations/
            ├── validation/
                ├── ADE_val_00000001.png
                ├── ...
                ├── ADE_val_00002000.png
        ├── images/
            ├── validation/
                ├── ADE_val_00000001.jpg
                ├── ...
                ├── ADE_val_00002000.jpg
    
  2. 数据预处理
    执行前处理脚本将原始数据集中的 jpg 图片转换为 OM 模型输入需要的 bin 文件。

    python swin99_preprocess.py \
        --config configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py \
        --save-dir swin99/val_bin/
    

    参数说明:

    • --config: 模型配置文件路径
    • --save-dir: 存放生成的bin文件的目录路径

    原始图片在预处理的时候会进行滑窗操作,一张图片对应一个或多个滑窗,每个滑窗单独保存成一个 bin 文件。预处理脚本运行结束后,2000 张原始图会生成 3686 个 bin 文件,存放于 swin99/val_bin 目录中。

模型转换

  1. PyTroch 模型转 ONNX 模型

    step1: 下载pth权重文件
    本推理项目使用开源仓提供的预训练好的 权重文件,下载完成后将权重 pth 文件存放于 swin99 目录下。

    wget https://download.openmmlab.com/mmsegmentation/v0.5/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192340-593b0e13.pth -P swin99
    

    step2: 生成 ONNX 模型

    python swin99_pth2onnx.py \
        --config configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py \
        --checkpoint swin99/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K_20210526_192340-593b0e13.pth \
        --onnx swin99/base_slide_bs${bs}.onnx \
        --batchsize ${bs}
    

    参数说明:

    • --config: 模型配置文件路径
    • --checkpoint: 预训练权重所在路径
    • --onnx: 生成ONNX模型的保存路径
    • --batchsize: 模型输入的batchsize,默认为 1
    • --opset-version: ONNX算子集版本,默认为 11

    命令中的${bs}表示模型输入的 batchsize,比如将${bs}设为 1,运行结束后,在 swin99 目录下会生成 base_slide_bs1.onnx

  2. ONNX 模型转 OM 模型

    step1: 查看NPU芯片名称 ${chip_name}

    npu-smi info
    

    例如该设备芯片名为 310P3,回显如下:

    +-------------------+-----------------+------------------------------------------------------+
    | NPU     Name      | Health          | Power(W)     Temp(C)           Hugepages-Usage(page) |
    | Chip    Device    | Bus-Id          | AICore(%)    Memory-Usage(MB)                        |
    +===================+=================+======================================================+
    | 0       310P3     | OK              | 15.8         42                0    / 0              |
    | 0       0         | 0000:82:00.0    | 0            1074 / 21534                            |
    +===================+=================+======================================================+
    | 1       310P3     | OK              | 15.4         43                0    / 0              |
    | 0       1         | 0000:89:00.0    | 0            1070 / 21534                            |
    +===================+=================+======================================================+
    

    step2: ONNX 模型转 OM 模型

    # 配置环境变量
    source /usr/local/Ascend/ascend-toolkit/set_env.sh
    source /etc/profile
    
    # 执行 ATC 进行模型转换
    atc --framework=5 \
        --model=swin99/base_slide_bs${bs}.onnx \
        --input_shape="input:${bs},3,512,512" \
        --output=swin99/base_slide_bs${bs} \
        --input_format=NCHW \
        --log=error \
        --soc_version=Ascend${chip_name}
    

    参数说明:

    • --model: 为ONNX模型文件。
    • --framework: 5代表ONNX模型。
    • --input_shape: 输入数据的shape。
    • --input_format: 输入数据的排布格式。
    • --output: 输出的OM模型。
    • --log:日志级别。
    • --soc_version: 处理器型号。

    命令中的${bs}表示模型输入的 batchsize,比如将${bs}设为 1,则运行结束后会在 swin99 目录下生成 base_slide_bs1.om

推理验证

  1. 安装ais_bench推理工具

    请访问ais_bench推理工具代码仓,根据readme文档进行工具安装。

  2. 离线推理

    使用ais_bench推理工具将预处理后的数据传入模型并执行推理:

    # 设置环境变量
    source /usr/local/Ascend/ascend-toolkit/set_env.sh
    source /etc/profile
    
    # 对预处理后的数据进行推理
    mkdir swin99/val_bs1_out/
    python3 -m ais_bench --model ../swin99/base_slide_bs1.om --input ../swin99/val_bin/ --output ../swin99/val_bs1_out/ --batchsize 1
    

    参数说明:

    • --model: OM模型路径。
    • --input: 存放预处理bin文件的目录路径
    • --output: 存放推理结果的目录路径
    • --batchsize: 每次输入模型的样本数

    运行成功后,在 swin99/val_bs1_out/ 下,会生成一个以执行开始时间%Y_%m_%d-%H_%M_%S来命名的子目录,每个预处理 bin 文件会对应生成一个推理结果 bin 文件存放在此目录下。

  3. 精度验证

    执行后处理脚本,根据推理结果计算OM模型的准确率:

    python swin99_postprocess.py \
        --config configs/swin/upernet_swin_base_patch4_window7_512x512_160k_ade20k_pretrain_224x224_1K.py \
        --infer-results swin99/val_bs1_out/2022_09_21-19_15_15/
    

    参数说明:

    • --config: 模型配置文件路径
    • --infer-results: 存放推理结果的目录路径

    运行成功后,程序会打印出模型在每个类别(共150类)上的精度指标以及整体的精度指标:

    per class results:
    +---------------------+-------+-------+
    |        Class        |  IoU  |  Acc  |
    +---------------------+-------+-------+
    |         wall        | 76.24 | 88.47 |
    |       building      | 81.55 | 92.5  |
    |         sky         | 94.2  | 97.29 |
    |         floor       | 80.71 | 90.74 |
    |         ...         |  ...  |  ...  |
    +---------------------+-------+-------+
    
    Summary:
    +-------+-------+-------+
    |  aAcc |  mIoU |  mAcc |
    +-------+-------+-------+
    | 82.45 | 48.29 | 59.39 |
    +-------+-------+-------+
    
  4. 性能验证

    对于性能的测试,需要注意以下三点:

    • 测试前,请通过 npu-smi info 命令查看 NPU 设备状态,请务必在 NPU 设备空闲的状态下进行性能测试。
    • 为避免因测试持续时间太长而受到干扰,建议通过纯推理的方式进行性能测试。
    • 使用吞吐率作为性能指标,单位为 fps.

    吞吐率(throughput):模型在单位时间(1秒)内处理的数据样本数。

    执行纯推理:

    python3 -m ais_bench --model ../swin99/base_slide_bs1.om --loop 100 --batchsize 1
    

    执行完纯推理命令,程序会打印出与性能相关的指标:

     [INFO] -----------------Performance Summary------------------
     [INFO] H2D_latency (ms): min = 13.617277145385742, max = 13.617277145385742, mean = 13.617277145385742, median = 13.617277145385742, percentile(99%) = 13.617277145385742
     [INFO] NPU_compute_time (ms): min = 69.06500244140625, max = 79.81600189208984, mean = 70.33091979980469, median = 69.39300155639648, percentile(99%) = 74.62939346313479
     [INFO] D2H_latency (ms): min = 142.60053634643555, max = 142.60053634643555, mean = 142.60053634643555, median = 142.60053634643555, percentile(99%) = 142.60053634643555
     [INFO] throughput 1000*batchsize(1)/NPU_compute_time.mean(70.33091979980469): 14.218497395547741
     [INFO] ------------------------------------------------------
    

    计算吞吐率:

    • 执行纯推理时若指定了 batchsize,则找到以关键字 [INFO] throughput 开头的一行,行尾的数字即为 OM 模型的吞吐率,本例中的吞吐率为 14.218497395547741
    • 若没有指定 batchsize,则可以通过 NPU_compute_time 中的 mean 来计算:

    throughput=batchsizemean∗1000=14.22(fps)throughput =\frac{batchsize}{mean} * 1000 = 14.22(fps)


性能&精度

  1. 性能对比

    在 300I PRO 设备上,当 batchsize 为 1 时模型性能最优,达 14.22 fps.

    batchsize T4性能 300I PRO性能 300I PRO/T4
    1 4.49 fps 14.22 fps 3.17倍
    4 3.94 fps 13.17 fps 3.34倍
    8 3.57 fps 13.67 fps 3.82倍
    best 4.49 fps 14.22 fps 3.17倍

    注:当 batchsize 为 16 或更高时,因内存不足导致推理失败,无法获取性能数据。

  2. 精度对比

    自测了 batchsize 为 1 和 4 的精度,两个 batchsize 得到的精度没有差别,且比开源仓精度的高出 0.3%.

    Model batchsize mIoU(NPU) mIoU(开源仓)
    swin_99 1 48.29% 47.99%
    4