luckymitty/vit_base_patch16_224.dino-ascend-NPU
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

vit_base_patch16_224.dino(昇腾NPU适配版)

本仓库包含 vit_base_patch16_224.dino 的昇腾NPU适配版本,这是一个采用DINO自监督方法训练的视觉Transformer(ViT)模型。

Model Framework Device License

模型概述

vit_base_patch16_224.dino 是一个视觉Transformer(ViT) 图像特征提取模型,通过DINO自监督学习方法在ImageNet-1k数据集上训练而成。

本报告记录了该模型在华为昇腾NPU(Ascend910) 上的适配、验证及性能评估过程。


模型信息

属性详情
模型名称vit_base_patch16_224.dino
模型类型视觉Transformer(ViT)图像特征提取
源仓库hf_mirrors/timm/vit_base_patch16_224.dino
上游来源timm/vit_base_patch16_224.dino
框架PyTorch + timm
参数数量85.8 M
GMACs16.9
激活值(M)16.5
图像尺寸224 x 224
补丁大小16 x 16
特征维度768
池化方式CLS Token
预训练方法DINO(自监督)
预训练数据集ImageNet-1k
许可证Apache 2.0

相关论文

  • Emerging Properties in Self-Supervised Vision Transformers — Caron et al., 2021
  • An Image is Worth 16x16 Words — Dosovitskiy et al., 2021

适配环境

硬件环境

项目配置
NPU型号Ascend910
NPU数量1卡
NPU内存64 GB HBM
CPU架构aarch64

软件环境

项目版本
操作系统openEuler / Ubuntu (aarch64)
Python3.11.14
PyTorch2.9.0+cpu
torch_npu2.9.0.post1
timm1.0.27
numpy1.26.4
Pillow12.2.0

适配过程

1. 代码分析

对模型仓库进行全面分析:

# Search for CUDA-specific APIs
rg -n "torch\.cuda" . || echo "No CUDA-specific API found"

# Search for CUDA kernel files
find . -name "*.cu" -o -name "*.cuh" | head -20 || echo "No CUDA kernel files"

分析结论:

  • 该模型是标准的 HuggingFace timm 模型仓库,无自定义 Python 代码
  • 无 .cu / .cuh CUDA 内核文件
  • 无 torch.cuda.* 或其他 CUDA 特定 API 调用
  • 适配类型:零手动修改适配

2. 自动迁移注入

在推理脚本顶部注入 transfer_to_npu:

import torch_npu
from torch_npu.contrib import transfer_to_npu

transfer_to_npu会自动完成以下映射:

原始 CUDA API自动映射目标
torch.cuda.is_available()返回 True(当 NPU 可用时)
torch.Tensor.cuda()torch.Tensor.npu()
torch.device('cuda')torch.device('npu')
torch.cuda.* 系列 APItorch.npu.* 系列 API

3. 依赖安装

# Load CANN environment
source /usr/local/Ascend/ascend-toolkit/set_env.sh

# Install dependencies
pip install timm numpy Pillow

验证结果

精度验证

我们使用随机初始化的权重(结构验证)和多个随机种子,对CPU和Ascend NPU上的模型输出进行了比较。

对比指标

指标数值
最大绝对误差1.16e-03
平均绝对误差2.40e-04
最大相对误差1.48e-01
平均相对误差1.39e-03
余弦相似度1.00000000

多种子稳定性

种子最大绝对误差余弦相似度
421.16e-031.00000000
1231.20e-030.99999992
4568.56e-040.99999992
7899.14e-040.99999992
20249.36e-040.99999992

结论:CPU和NPU的输出在数值上是一致的。绝对误差在预期的浮点精度容差范围内(< 2e-3)。该模型已通过Ascend NPU部署验证。

功能验证

验证项预期结果实际结果状态
模型加载成功加载成功通过
设备迁移模型迁移至npu:0npu:0通过
前向推理 (model())输出形状(1, 768)(1, 768)通过
特征提取 (forward_features)输出形状(1, 197, 768)(1, 197, 768)通过
数据类型torch.float32torch.float32通过
程序退出码00通过

性能测试

测试配置:

  • 设备:Ascend910(单卡)
  • 输入尺寸:224 x 224
  • 批大小:1
  • 预热轮次:3
  • 测试轮次:10
  • 精度:FP32
指标数值
平均延迟~6.0 ms
吞吐量~170 samples/sec
首 token 延迟N/A (CNN/ViT model)

注意:这是一个CNN/ViT视觉模型,没有自回归生成过程,因此不存在首token延迟指标。

精度说明

  • Ascend910 不支持 FP64(双精度);torch_npu 会自动降级为 FP32,此模型的推理不受影响
  • 该模型输出的图像特征向量适用于下游检索和聚类任务;精度偏差在合理范围内

使用指南

快速开始

# 1. Load CANN environment
source /usr/local/Ascend/ascend-toolkit/set_env.sh

# 2. Set NPU visible device
export ASCEND_RT_VISIBLE_DEVICES=0

# 3. Run inference
python3 npu_inference.py

图像特征提取

import torch
import torch_npu
from torch_npu.contrib import transfer_to_npu
from PIL import Image
import timm

# Load model
model = timm.create_model(
    'hf_mirrors/timm/vit_base_patch16_224.dino',
    pretrained=True,
    num_classes=0,
)
model = model.eval().to('npu:0')

# Get preprocessing
data_config = timm.data.resolve_model_data_config(model)
transforms = timm.data.create_transform(**data_config, is_training=False)

# Load image and infer
img = Image.open('your_image.jpg')
input_tensor = transforms(img).unsqueeze(0).to('npu:0')

with torch.no_grad():
    features = model(input_tensor)  # (1, 768)

print(f"Feature shape: {features.shape}")

获取未池化特征

with torch.no_grad():
    # (1, 197, 768) — includes CLS token
    unpooled = model.forward_features(input_tensor)

    # Take only CLS token features
    cls_token = unpooled[:, 0]  # (1, 768)

文件

文件描述
config.json模型配置文件
npu_inference.pyAscend NPU 推理脚本
verify_accuracy.pyCPU 与 NPU 精度对比脚本
accuracy_report.json详细精度指标 JSON 文件
requirements.txtPython 依赖项
README.md本文档

许可证

Apache-2.0

致谢

  • 原始模型来自 timm
  • DINO 方法由 facebookresearch/dino 提供
  • Ascend NPU 适配由 Ascend-SACT 完成

由华为 Ascend NPU 提供支持