Transformer 架构已广泛应用于自然语言处理领域。本模型的作者发现,Vision Transformer(ViT)模型在计算机视觉领域中对CNN的依赖不是必需的,直接将其应用于图像块序列来进行图像分类时,也能得到和目前卷积网络相媲美的准确率。
vit_large_patch16_224模型的输入数据类型为FLOAT32,大小为batchsize x 3 x 224 x 224,数据排布格式为NCHW;输出数据类型为FLOAT32,大小为batchsize x num_class,数据排布格式为ND。
| 环境配置 | 配置说明 |
|---|---|
| 硬件配置 | 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 |
| 部署方式 | 单卡 |
| 配套 | 版本 |
|---|---|
| aclruntime | 0.0.2 |
| ais_bench | 0.0.2 |
| numpy | 1.26.4 |
| onnx | 1.15.0 |
| onnx-simplifier | 0.3.6 |
| onnxoptimizer | 0.3.13 |
| onnxruntime | 1.23.2 |
| onnxsim | 0.4.36 |
| torchvision | 0.16.0 |
从文件列表中下载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镜像中使用的是ImageNet 50000张图片的验证集中前10张,已放置在 /home/ViT/ImageNet/val/中。
如需自定义数据集,可按需上传图片到容器中路径,如/home/ViT/user_defined/,并执行下一步的预处理脚本处理图片。
镜像中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: 图像尺寸
镜像中已有该模型原始权重,位置在/home/ModelZoo-PyTorch/ACL_PyTorch/contrib/cv/classfication/ViT/vit_large_patch16_224.npz。
镜像中已完成batchsize为1(一次推理一张图片)的模型转换,如只需使用batchsize为1的模型,可转到章节6进行推理;
下面以batchsize 4为例进行模型转换介绍。
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
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
配置环境变量: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
镜像中已有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设备编号
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 aclbatchsize为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