m0_74196153/vit-base-patch16-224-in21k
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

vit-base-patch16-224-in21k on Ascend NPU

1. 简介

本文档记录 google/vit-base-patch16-224-in21k 在华为昇腾 NPU(Ascend910B4)上的推理适配与验证结果。

vit-base-patch16-224-in21k 是 Google 提出的 Vision Transformer 基线模型,基于 ImageNet-21k 预训练。本验证的核心目标是确认该模型在昇腾 NPU 上可完成标准 PyTorch 推理,且精度与 CPU 基线的误差控制在 1% 以内。

相关获取地址:

  • 权重下载地址(ModelScope):https://modelscope.cn/models/google/vit-base-patch16-224-in21k
  • 权重下载地址(HuggingFace):https://huggingface.co/google/vit-base-patch16-224-in21k

参考文档:

  • https://huggingface.co/docs/transformers/model_doc/vit
  • https://gitcode.com/Ascend-SACT/Qwen3.6-27B

2. 验证环境

组件版本
CANN8.5.1
torch2.9.0
torch-npu2.9.0.post1+gitee7ba04
transformers4.57.6
modelscope1.35.3
Pillow10.4.0
numpy1.26.4
  • NPU:1 逻辑卡(Ascend910B4)
  • 模型路径:/opt/atomgit/vit-base-patch16-224-npu/model_weights/google/vit-base-patch16-224-in21k
  • OS:openEuler / aarch64

3. 推理脚本

3.1 环境准备

source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

3.2 NPU 推理(自动迁移)

import torch_npu
from torch_npu.contrib import transfer_to_npu  # 自动替换 cuda→npu

import torch
import numpy as np
from PIL import Image
from transformers import ViTForImageClassification, ViTImageProcessor

model_path = 'google/vit-base-patch16-224-in21k'
processor = ViTImageProcessor.from_pretrained(model_path)
model = ViTForImageClassification.from_pretrained(model_path)
model.eval()
model = model.to('npu:0')

image = Image.fromarray(np.random.randint(0, 255, (224, 224, 3), dtype=np.uint8))
inputs = processor(images=image, return_tensors="pt")
inputs = {k: v.to('npu:0') for k, v in inputs.items()}

with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits

print(logits)

3.3 一键复现

cd /opt/atomgit/vit-base-patch16-224-npu/scripts

# CPU baseline
python3 infer_cpu.py

# NPU inference
python3 infer_npu.py

# 精度对比
python3 compare_accuracy.py

# 综合性能测评
python3 benchmark.py

4. Smoke 验证

基础检查:

cd /opt/atomgit/vit-base-patch16-224-npu/scripts
python3 infer_npu.py

验证结果:

  • 脚本正常退出,exit code 0
  • logits shape 为 [1, 2](因预训练权重不含分类头,维度由模型默认配置决定)
  • 无 NPU 算子报错或 fallback 警告
  • 算子编译缓存已生成,二次运行延迟稳定在 ~12 ms

5. 性能参考

测试条件:连续推理,预热后取多次测量的统计值。

指标CPUNPU (batch=1)NPU (batch=4)NPU (batch=8)
mean_latency_ms1761.4012.4212.0311.91
median_latency_ms1760.8912.2111.7211.81
min_latency_ms1751.5911.8311.5311.66
max_latency_ms1775.2215.3816.8112.62
p99_latency_ms1774.6314.92——
std_ms—0.601.110.27

加速比(相对 CPU):

  • batch=1:~142x
  • batch=4:~568x(单样本等效)

说明:batch 增大时,NPU 单 batch 延迟基本保持不变,说明 AICore 利用率仍有冗余,吞吐随 batch 线性提升。

6. 精度评测

使用相同随机种子构造输入,分别运行 CPU 和 NPU 推理,对比 logits。

指标数值
max_abs_diff7.54e-04
mean_abs_diff4.52e-04
max_rel_diff1.26%
mean_rel_diff0.76%
top1_match_rate100%

结论:Mean Relative Diff < 1%,Top-1 匹配率 100%,精度验证通过。

7. 注意事项

  1. transfer_to_npu 注入顺序
    必须在所有其他 import 之前注入:

    import torch_npu
    from torch_npu.contrib import transfer_to_npu

    否则 .cuda() 等 API 不会被自动替换为 .npu()。

  2. 预训练权重不含分类头
    vit-base-patch16-224-in21k 为 ImageNet-21k 预训练权重,不含下游任务的 classifier.weight/bias。直接推理时分类头是随机初始化的,输出的类别概率无实际语义。如需实际图像分类,请使用下游微调后的 checkpoint(例如 google/vit-base-patch16-224)。

  3. 算子编译缓存
    NPU 首次运行时会触发算子编译(AICore kernel compile),首次延迟可能略高(约 15 ms)。编译缓存会自动落盘,二次运行延迟稳定在 ~12 ms。

  4. 内存占用
    batch=1 时 NPU HBM 占用约 ~400 MB,远低于 Ascend910B4 的 32 GB 显存,单卡可同时部署多个实例。