本文档记录 DINO ViT-S/8(dino_vits8)在华为昇腾 NPU(Ascend 910B4)上的推理适配与验证结果。
DINO(Self-Distillation with No Labels)是 Meta 提出的自监督视觉 Transformer 训练方法,ViT-S/8 为其中轻量级且精度较高的变体,patch size 为 8x8,输出 384 维视觉特征,适用于下游图像分类、检索、分割等任务。
相关获取地址:
| 组件 | 版本 |
|---|---|
CANN | 8.5.1 |
torch | 2.9.0+cpu |
torch-npu | 2.9.0.post1+gitee7ba04 |
torchvision | 0.22.0 |
Pillow | 10.4.0 |
numpy | 1.26.4 |
1 逻辑卡(Ascend 910B4)# 加载 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)"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 ...]# 随机输入精度对比(固定 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以 CPU(aarch64)为基准,对 NPU 推理结果进行精度对比。
| 指标 | 数值 |
|---|---|
| Max absolute difference | 5.41e-02 |
| Mean absolute difference | 1.08e-02 |
| L2 relative error | 3.69e-03 (0.37%) |
| 指标 | 数值 |
|---|---|
| Max absolute difference | 8.63e-02 |
| Mean absolute difference | 8.94e-03 |
| L2 relative error | 2.76e-03 (0.28%) |
结论:NPU 推理精度与 CPU 基线对比,L2 相对误差 < 0.5%,满足 < 1% 要求。
测试条件:单张 3x224x224 图像,warmup=5,连续推理 20 次取平均。
| 设备 | 平均推理时间 | 备注 |
|---|---|---|
| CPU (aarch64) | ~2850 ms | 单线程 |
| NPU (910B4) | ~11.0 ms | 含 synchronize |
| 加速比 | ~259x |
DINO 的 vision_transformer.py 为纯 PyTorch 实现,无 CUDA 硬编码。仅需在入口脚本顶部注入:
import torch_npu
from torch_npu.contrib import transfer_to_nputransfer_to_npu 会自动完成 cuda -> npu 的设备映射,无需逐行修改模型代码。
| 配置 | 值 |
|---|---|
| 架构 | ViT-Small |
| Patch size | 8 |
| Embedding dim | 384 |
| Depth | 12 |
| Heads | 6 |
| MLP ratio | 4 |
| 参数量 | ~21M |
| 输出维度 | 384 |
推理路径使用的标准 PyTorch 算子均已被 torch_npu 原生支持:
nn.Conv2d(PatchEmbed)nn.Linearnn.LayerNormnn.GELUnn.Dropoutnn.functional.interpolate(位置编码插值)torch.matmul / @(注意力计算)torch.softmaxdino_deitsmall8_pretrain.pth 完整大小约为 83MB,若下载中断会导致加载失败,请确认文件大小正确。transfer_to_npu 会禁用 JIT script,DINO 推理不依赖 JIT,可安全忽略。Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))。interpolate_pos_encoding 方法支持非 224x224 输入,但 patch 数量需为完全平方数。nccl 改为 hccl,并使用 DistributedDataParallel。| 文件 | 说明 |
|---|---|
inference.py | 单图推理脚本(NPU/CPU/CUDA 通用) |
eval_accuracy.py | 精度验证脚本(NPU vs CPU) |
vision_transformer.py | DINO ViT 模型定义(原始文件,未修改) |
utils.py | DINO 工具函数(原始文件,未修改) |
weights/ | 预训练权重存放目录 |
eval/ | 评测日志与测试图像 |