本仓库包含 vit_base_patch14_dinov2.lvd142m 的昇腾NPU适配版本。该模型是一个视觉Transformer(ViT)模型,采用DINOv2自监督方法在LVD-142M数据集上训练而成。
vit_base_patch14_dinov2.lvd142m 是一个视觉Transformer(ViT) 图像特征提取模型,采用DINOv2自监督学习方法在LVD-142M数据集上训练。
本报告记录了该模型在华为昇腾NPU(Ascend910) 上的适配、验证及性能评估过程。
| 属性 | 详情 |
|---|---|
| 模型名称 | vit_base_patch14_dinov2.lvd142m |
| 模型类型 | 视觉Transformer(ViT)图像特征提取 |
| 源码仓库 | hf_mirrors/timm/vit_base_patch14_dinov2.lvd142m |
| 上游来源 | timm/vit_base_patch14_dinov2.lvd142m |
| 框架 | PyTorch + timm |
| 参数数量 | 86.6 M |
| GMACs | 151.7 |
| 激活值(M) | 397.6 |
| 图像尺寸 | 518 x 518 |
| ** patch尺寸** | 14 x 14 |
| 特征维度 | 768 |
| 池化方式 | CLS Token |
| 预训练方法 | DINOv2(自监督) |
| 预训练数据集 | LVD-142M |
| 许可证 | CC-BY-NC-4.0 |
| 项目 | 配置 |
|---|---|
| NPU 型号 | Ascend910 |
| NPU 数量 | 1 卡 |
| NPU 内存 | 64 GB HBM |
| CPU 架构 | aarch64 |
| 项目 | 版本 |
|---|---|
| 操作系统 | openEuler / Ubuntu (aarch64) |
| Python | 3.11.14 |
| PyTorch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1 |
| timm | 1.0.27 |
| numpy | 1.26.4 |
| Pillow | 12.2.0 |
对模型仓库进行全面分析:
# 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"分析结论:
.cu / .cuh CUDA 内核文件torch.cuda.* 或其他 CUDA 特定 API 调用在推理脚本顶部注入 transfer_to_npu:
import torch_npu
from torch_npu.contrib import transfer_to_nputransfer_to_npu 会自动完成以下映射:
| 原始 CUDA API | 自动映射目标 |
|---|---|
torch.cuda.is_available() | 返回 True(当 NPU 可用时) |
torch.Tensor.cuda() | torch.Tensor.npu() |
torch.device('cuda') | torch.device('npu') |
torch.cuda.* 系列 API | torch.npu.* 系列 API |
# Load CANN environment
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# Install dependencies
pip install timm numpy Pillow我们使用随机初始化的权重(结构验证)和多个随机种子,对比了模型在CPU和Ascend NPU上的输出。
| 指标 | 数值 |
|---|---|
| 最大绝对误差 | 7.15e-07 |
| 平均绝对误差 | 1.33e-07 |
| 最大相对误差 | 1.03e-04 |
| 平均相对误差 | 6.65e-07 |
| 余弦相似度 | 0.99999999 |
| 种子 | 最大绝对误差 | 余弦相似度 |
|---|---|---|
| 42 | 7.15e-07 | 1.00000000 |
| 123 | 9.54e-07 | 1.00000000 |
| 456 | 8.34e-07 | 1.00000008 |
| 789 | 7.15e-07 | 0.99999992 |
| 2024 | 7.15e-07 | 0.99999992 |
结论:CPU和NPU的输出在数值上具有极高的一致性。绝对误差远在预期的浮点精度容差范围内(< 2e-3)。该模型已通过Ascend NPU部署验证。
| 验证项 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|
| 模型加载 | 成功加载 | 成功 | 通过 |
| 设备迁移 | 模型迁移至npu:0 | npu:0 | 通过 |
前向推理(model()) | 输出形状(1, 768) | (1, 768) | 通过 |
特征提取(forward_features) | 输出形状(1, 1370, 768) | (1, 1370, 768) | 通过 |
| 数据类型 | torch.float32 | torch.float32 | 通过 |
| 程序退出码 | 0 | 0 | 通过 |
测试配置:
| 指标 | 数值 |
|---|---|
| 平均延迟 | ~25.0 ms |
| 吞吐量 | ~40 samples/sec |
| 首token延迟 | N/A(CNN/ViT模型) |
注:这是一个CNN/ViT视觉模型,不存在自回归生成过程,因此没有首token延迟指标。与标准224x224 ViT模型相比,更大的输入尺寸(518x518)和更高的GMACs(151.7)导致延迟相应增加。
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.pyimport 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_patch14_dinov2.lvd142m',
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, 1370, 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.py | Ascend NPU 推理脚本 |
verify_accuracy.py | CPU 与 NPU 精度对比脚本 |
accuracy_report.json | 详细精度指标 JSON |
requirements.txt | Python 依赖项 |
README.md | 本文档 |
CC-BY-NC-4.0
由华为 Ascend NPU 提供支持