m0_74196153/dino-vits8
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

DINO ViT-S/8 on Ascend NPU

1. 简介

本文档记录 DINO ViT-S/8(dino_vits8)在华为昇腾 NPU(Ascend 910B4)上的推理适配与验证结果。

DINO(Self-Distillation with No Labels)是 Meta 提出的自监督视觉 Transformer 训练方法,ViT-S/8 为其中轻量级且精度较高的变体,patch size 为 8x8,输出 384 维视觉特征,适用于下游图像分类、检索、分割等任务。

相关获取地址:

  • 权重下载地址(原始源):https://dl.fbaipublicfiles.com/dino/dino_deitsmall8_pretrain/dino_deitsmall8_pretrain.pth
  • 原始仓库:https://github.com/facebookresearch/dino
  • 原始论文:https://arxiv.org/abs/2104.14294

2. 验证环境

组件版本
CANN8.5.1
torch2.9.0+cpu
torch-npu2.9.0.post1+gitee7ba04
torchvision0.22.0
Pillow10.4.0
numpy1.26.4
  • NPU:1 逻辑卡(Ascend 910B4)
  • OS:Linux aarch64

3. 快速开始

3.1 环境准备

# 加载 CANN 环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh

# 指定可见 NPU
export ASCEND_RT_VISIBLE_DEVICES=0

# 验证 torch_npu
python3 -c "import torch; import torch_npu; a = torch.randn(3,4).npu(); print(a + a)"

3.2 单图推理

python inference.py \
  --pretrained_weights weights/dino_deitsmall8_pretrain.pth \
  --image eval/test_image.jpg \
  --device npu

预期输出:

Input shape:  torch.Size([1, 3, 224, 224])
Output shape: torch.Size([1, 384])
Device:       npu:0
First 10 features: [ 0.30299684  4.800295    0.59591675 -0.5208009   0.20390774 ...]

3.3 精度自验证

# 随机输入精度对比(固定 seed=42)
python eval_accuracy.py \
  --pretrained_weights weights/dino_deitsmall8_pretrain.pth \
  --seed 42 \
  --warmup 5 \
  --runs 20

# 真实图像精度对比
python eval_accuracy.py \
  --pretrained_weights weights/dino_deitsmall8_pretrain.pth \
  --image eval/test_image.jpg \
  --warmup 5 \
  --runs 20

4. 精度评测

以 CPU(aarch64)为基准,对 NPU 推理结果进行精度对比。

4.1 随机输入(seed=42, batch=1, 224x224)

指标数值
Max absolute difference5.41e-02
Mean absolute difference1.08e-02
L2 relative error3.69e-03 (0.37%)

4.2 真实图像输入

指标数值
Max absolute difference8.63e-02
Mean absolute difference8.94e-03
L2 relative error2.76e-03 (0.28%)

结论:NPU 推理精度与 CPU 基线对比,L2 相对误差 < 0.5%,满足 < 1% 要求。

5. 性能参考

测试条件:单张 3x224x224 图像,warmup=5,连续推理 20 次取平均。

设备平均推理时间备注
CPU (aarch64)~2850 ms单线程
NPU (910B4)~11.0 ms含 synchronize
加速比~259x

6. 适配说明

6.1 自动迁移

DINO 的 vision_transformer.py 为纯 PyTorch 实现,无 CUDA 硬编码。仅需在入口脚本顶部注入:

import torch_npu
from torch_npu.contrib import transfer_to_npu

transfer_to_npu 会自动完成 cuda -> npu 的设备映射,无需逐行修改模型代码。

6.2 模型架构

配置值
架构ViT-Small
Patch size8
Embedding dim384
Depth12
Heads6
MLP ratio4
参数量~21M
输出维度384

6.3 已验证算子

推理路径使用的标准 PyTorch 算子均已被 torch_npu 原生支持:

  • nn.Conv2d(PatchEmbed)
  • nn.Linear
  • nn.LayerNorm
  • nn.GELU
  • nn.Dropout
  • nn.functional.interpolate(位置编码插值)
  • torch.matmul / @(注意力计算)
  • torch.softmax

7. 注意事项

  1. 权重完整性:dino_deitsmall8_pretrain.pth 完整大小约为 83MB,若下载中断会导致加载失败,请确认文件大小正确。
  2. torch.jit.script 警告:transfer_to_npu 会禁用 JIT script,DINO 推理不依赖 JIT,可安全忽略。
  3. 图像预处理:推理时需与训练时保持一致的 Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))。
  4. 位置编码插值:interpolate_pos_encoding 方法支持非 224x224 输入,但 patch 数量需为完全平方数。
  5. 多卡推理:如需多卡并行,请将 nccl 改为 hccl,并使用 DistributedDataParallel。

8. 交付件说明

文件说明
inference.py单图推理脚本(NPU/CPU/CUDA 通用)
eval_accuracy.py精度验证脚本(NPU vs CPU)
vision_transformer.pyDINO ViT 模型定义(原始文件,未修改)
utils.pyDINO 工具函数(原始文件,未修改)
weights/预训练权重存放目录
eval/评测日志与测试图像