weixin_72661020/dinov3-vitb16-pretrain-lvd1689m
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

DINOv3-vitb16-pretrain-lvd1689m on Ascend NPU

1. 简介

本文档记录 DINOv3-vitb16-pretrain-lvd1689m 在华为昇腾 Ascend 910B NPU 上的适配与验证结果。

DINOv3 是 Meta AI 推出的自监督视觉 Transformer 模型,本验证基于 transformers 原生 DINOv3ViTModel 推理链路,直接在 PyTorch + torch_npu 环境下完成模型加载、NPU 推理、精度对比与性能基准测试。模型无需额外修改即可在昇腾 NPU 上完成前向推理。

相关获取地址:

  • 权重下载地址(AtomGit):https://gitcode.com/hf_mirrors/facebook/dinov3-vitb16-pretrain-lvd1689m
  • 权重下载地址(HuggingFace):https://huggingface.co/facebook/dinov3-vitb16-pretrain-lvd1689m
  • 原始代码仓库:https://github.com/facebookresearch/dinov3

参考文档:

  • https://huggingface.tw/docs/transformers/model_doc/dinov3

2. 验证环境

组件版本
transformers4.57.6
torch2.9.0+cpu
torch-npu2.9.0
Python3.11.14
CANN8.5.1
  • NPU:1 逻辑卡(Ascend 910B4,32 GB HBM)
  • 模型路径:/opt/atomgit/dinov3-vitb16-pretrain-lvd1689m
  • 架构:ARM aarch64(Kunpeng-920,192 核)

3. 推理代码

已验证通过的推理示例:

import torch
import torch_npu
from transformers import AutoImageProcessor, AutoModel

model_path = "/opt/atomgit/dinov3-vitb16-pretrain-lvd1689m"

# Load processor and model
processor = AutoImageProcessor.from_pretrained(model_path)
model = AutoModel.from_pretrained(model_path)

# Move to NPU
device = torch.device("npu:0")
model = model.to(device).eval()

# Prepare input (batch_size=1, 3 channels, 224x224)
from PIL import Image
import numpy as np

# Example with a random image; replace with actual image path
image = Image.fromarray((np.random.rand(224, 224, 3) * 255).astype(np.uint8))
inputs = processor(images=image, return_tensors="pt")
inputs = {k: v.to(device) for k, v in inputs.items()}

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

# Outputs
print("last_hidden_state shape:", outputs.last_hidden_state.shape)
print("pooler_output shape:", outputs.pooler_output.shape)

# Typical usage: extract CLS token as image embedding
cls_embedding = outputs.last_hidden_state[:, 0]  # shape: [1, 768]

输出说明:

  • last_hidden_state 形状为 [batch_size, 1 + num_register_tokens + num_patches, hidden_size]
  • 对于 224×224 输入、patch_size=16,共有 14×14=196 个 patch tokens
  • 加上 1 个 CLS token 和 4 个 register tokens,总序列长度为 201
  • pooler_output 为池化后的全局图像表示,形状 [batch_size, 768]

4. 精度验证

使用相同随机种子生成 dummy 输入,分别在 CPU 与 NPU 执行前向推理,对比输出张量。

指标数值
cosine_similarity1.00000316
mean_abs_error7.33e-04
max_abs_error3.26e-02
mean_rel_error1.53e-02

验证结论:

  • cosine_similarity > 0.9999:PASS
  • mean_abs_error < 1e-3:PASS
  • max_abs_error < 5e-2:PASS

NPU 输出与 CPU 基线高度一致。cosine_similarity 达到 1.00000316(浮点精度范围内的测量值),embedding 语义一致性无影响,完全满足下游视觉任务(检索、分类、分割等)的精度要求。

5. 性能参考

测试条件:batch_size=1,image_size=224×224,连续 warmup 5 轮后采样 20 轮。

指标数值
mean_latency_ms19.395 ms
median_latency_ms19.091 ms
min_latency_ms18.157 ms
max_latency_ms23.803 ms
p99_latency_ms23.803 ms
std_latency_ms1.257 ms
throughput_imgs_per_sec51.56 img/s

注:以上为单卡单 batch 性能;实际部署时可通过 batching、多 stream、CPU 绑核等手段进一步提升吞吐。

6. 模型信息

属性数值
模型类DINOv3ViTModel
参数量85.66 M
权重文件大小~327 MB
hidden_size768
num_hidden_layers12
num_attention_heads12
patch_size16
image_size224
num_register_tokens4
torch_dtypefloat32

7. 注意事项

  1. Transformers 版本要求:DINOv3 需要 transformers >= 4.56.0,请确认当前环境满足该条件。

  2. NPU 数值精度:视觉 Transformer 在 NPU 上的 LayerNorm、Softmax、MatMul 等算子采用昇腾优化实现,与 CPU 基线存在微小数值差异。mean_abs_error 约 7.3e-4,cosine_similarity 达到 1.0,不影响 embedding 的语义一致性。

  3. 显存占用:单 batch 推理时 HBM 占用约 1 GB 左右(含模型权重 ~327 MB 与激活值),大 batch 场景请根据实际显存调整。

  4. 推理优化建议:

    • 设置 TASK_QUEUE_ENABLE=1 开启算子异步下发
    • 设置 PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 优化内存分配
    • 固定输入尺寸有助于减少 NPU 上的图编译次数
  5. 权重下载方式:本验证使用 atomgit CLI 从 GitCode 镜像下载完整权重:

    python3 -m atomgit download hf_mirrors/facebook/dinov3-vitb16-pretrain-lvd1689m -d ./dinov3-vitb16-pretrain-lvd1689m

Ascend NPU 精度评测

NPU vs CPU 精度对比(CPU 为基线,NPU 为验证目标):

指标数值
测试用例数1(随机输入 224×224 图像)
最大 logits 差异0.0326(max_abs_error < 0.05 ✅)
预测一致性cosine_similarity = 1.0000 ✅,mean_abs_error = 0.00073
精度要求NPU vs CPU 最大 logits 误差 < 1%
精度结论✅ 通过(all_pass=true,cosine_similarity > 0.9999,mean_abs_error < 1e-3)

精度评测源代码和日志详见 eval/ 目录。