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

1 模型介绍

Transformer 架构已广泛应用于自然语言处理领域。本模型的作者发现,Vision Transformer(ViT)模型在计算机视觉领域中对CNN的依赖不是必需的,直接将其应用于图像块序列来进行图像分类时,也能得到和目前卷积网络相媲美的准确率。

2 输入输出数据

vit_large_patch16_224模型的输入数据类型为FLOAT32,大小为batchsize x 3 x 224 x 224,数据排布格式为NCHW;输出数据类型为FLOAT32,大小为batchsize x num_class,数据排布格式为ND。

3 环境准备

3.1 基础环境信息

环境配置配置说明
硬件配置Atlas 800T A2 910B2(64G)
驱动版本23.0.5.1
CANN版本8.3.RC1
Python版本3.11.6
torch版本2.1.0
推理框架om
推理镜像见文件列表中vit-large.tar
部署方式单卡
配套版本
aclruntime0.0.2
ais_bench0.0.2
numpy1.26.4
onnx1.15.0
onnx-simplifier0.3.6
onnxoptimizer0.3.13
onnxruntime1.23.2
onnxsim0.4.36
torchvision0.16.0

3.2 镜像准备

从文件列表中下载vit-large.tar到本地,参考平台要求上传镜像,并基于该镜像直接发布任务拉起容器;如通过宿主机拉起容器,参考如下步骤:

# 镜像加载
docker load -i vit-large.tar

# 拉起容器
docker run -itd --privileged  --name=vit-large --net=host \
   --shm-size 500g \
   --device=/dev/davinci0 \
   --device=/dev/davinci_manager \
   --device=/dev/hisi_hdc \
   --device /dev/devmm_svm \
   -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
   -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
   -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
   -v /usr/local/sbin:/usr/local/sbin \
   -v /etc/hccn.conf:/etc/hccn.conf \
   -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
   vit-large:20251128112041 \
   bash

4 准备数据集

4.1 下载数据集

镜像中使用的是ImageNet 50000张图片的验证集中前10张,已放置在 /home/ViT/ImageNet/val/中。 如需自定义数据集,可按需上传图片到容器中路径,如/home/ViT/user_defined/,并执行下一步的预处理脚本处理图片。

4.2 执行预处理脚本

镜像中ImageNet验证集的10张图片已完成预处理,路径为/home/ViT/prep_dataset/224,如需预处理自定义数据集,执行如下指令:

python3 Vit_preprocess.py --data_path /home/ViT/user_defined/ --store_path ./prep_dataset/user_defined/ --image_size 224

参数说明:

--data_path: 数据集路径

--store_path: 预处理结果保存路径

--image_size: 图像尺寸

5 模型转换

5.1 获取模型权重

镜像中已有该模型原始权重,位置在/home/ModelZoo-PyTorch/ACL_PyTorch/contrib/cv/classfication/ViT/vit_large_patch16_224.npz。

5.2 使用镜像中batchsize为1的om模型

镜像中已完成batchsize为1(一次推理一张图片)的模型转换,如只需使用batchsize为1的模型,可转到章节6进行推理;

5.3 转换其他batchsize的om模型

下面以batchsize 4为例进行模型转换介绍。

5.3.1 导出onnx文件

python3 Vit_pth2onnx.py --batch_size 4 --model_path vit_large_patch16_224.npz --save_dir models/onnx --model_name vit_large_patch16_224

参数说明:

--batch_size: 批次大小

--model_path: 模型权重npz文件路径

--save_dir: 保存onnx文件的目录

--model_name: 模型变体名称

该步骤会在/home/ViT/models/onnx下生成vit_large_patch16_224_bs4.onnx

5.3.2 优化onnx文件

python3 -m onnxsim models/onnx/vit_large_patch16_224_bs4.onnx models/onnx/vit_large_patch16_224_bs4_sim.onnx

该步骤会在/home/ViT/models/onnx下生成vit_large_patch16_224_bs4_sim.onnx

python3 opt_vit.py models/onnx/vit_large_patch16_224_bs4_sim.onnx models/onnx/vit_large_patch16_224_bs4_opt.onnx vit_large_patch16_224

该步骤会在/home/ViT/models/onnx下生成vit_large_patch16_224_bs4_opt.onnx

5.3.3 使用ATC工具将onnx模型转om模型

配置环境变量:source /usr/local/Ascend/ascend-toolkit/set_env.sh

atc --framework=5 --model=models/onnx/vit_large_patch16_224_bs4_opt.onnx --output=models/om/vit_large_patch16_224_bs4 --input_format=NCHW --input_shape="input:4,3,224,224" --log=debug --soc_version=Ascend910B2 --enable_small_channel=1 --optypelist_for_implmode="Gelu" --op_select_implmode=high_performance

参数说明:

--model:为ONNX模型文件。

--framework:5代表ONNX模型。

--output:输出的OM模型。

--input_format:输入数据的格式[batchsize][Channel][Height][Width]。

--log:日志级别。

--soc_version:处理器型号

该步骤会在/home/ViT/models/om下生成vit_large_patch16_224_bs4.om

6 开始推理验证

6.1 执行推理

镜像中已有vit_large_patch16_224_bs1.om,可直接执行如下指令,如需推理其他batchsize的om模型,按5.3章节进行模型转换得到其他batchsize的om模型,修改如下指令中的 --model和 --output_dir 即可,如需使用自定义数据集,修改--input为prep_dataset/user_defined

cd /home/ViT/
source /usr/local/Ascend/ascend-toolkit/set_env.sh
python3 -m ais_bench --model models/om/vit_large_patch16_224_bs1.om --input prep_dataset/224 --output outputs/ --output_dir vit_large_patch16_224_bs1 --device 0

参数说明:

--model:om文件路径

--input:输入文件

--output:输出目录

--device:NPU设备编号

6.2 推理性能

batchsize为1时,平均每张图片推理时间为4ms左右,性能如下:

[INFO] acl init success
[INFO] open device 0 success
[INFO] create new context
[INFO] load model models/om/vit_large_patch16_224_bs1.om success
[INFO] create model description success
[INFO] try get model batchsize:1
[INFO] output path:outputs/vit_large_patch16_224_bs1
[INFO] get filesperbatch files0 size:602112 tensor0size:602112 filesperbatch:1 runcount:10
[INFO] warm up 1 done
Inference array Processing: 100%|█████████████████████████████████████████████████████| 10/10 [00:00<00:00, 157.93it/s]
[INFO] -----------------Performance Summary------------------
[INFO] NPU_compute_time (ms): min = 4.125999450683594, max = 4.201000213623047, mean = 4.14260082244873, median = 4.135001182556152, percentile(99%) = 4.196950035095215
[INFO] throughput 1000*batchsize.mean(1)/NPU_compute_time.mean(4.14260082244873): 241.39424551383414
[INFO] ------------------------------------------------------
[INFO] unload model success, model Id is 1
[INFO] end to reset device 0
[INFO] end to finalize acl

batchsize为4时,4张图的耗时为平均7.75ms左右,性能如下所示:

[INFO] acl init success
[INFO] open device 0 success
[INFO] create new context
[INFO] load model models/om/vit_large_patch16_224_bs4.om success
[INFO] create model description success
[INFO] try get model batchsize:4
[INFO] output path:outputs/vit_large_patch16_224_bs4
[INFO] get filesperbatch files0 size:602112 tensor0size:2408448 filesperbatch:4 runcount:3
[INFO] warm up 1 done
Inference array Processing: 100%|████████████████████████████████████████████████████████| 3/3 [00:00<00:00, 81.23it/s]
[INFO] -----------------Performance Summary------------------
[INFO] NPU_compute_time (ms): min = 7.728000640869141, max = 7.798999786376953, mean = 7.755334218343099, median = 7.739002227783203, percentile(99%) = 7.797799835205078
[INFO] throughput 1000*batchsize.mean(4)/NPU_compute_time.mean(7.755334218343099): 515.7740320899525
[INFO] ------------------------------------------------------
[INFO] unload model success, model Id is 1
[INFO] end to reset device 0
[INFO] end to finalize acl