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

DINOv3-vitl16-pretrain-lvd1689m on Ascend NPU

1. 简介

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

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

相关获取地址:

  • 权重下载地址(AtomGit):https://gitcode.com/hf_mirrors/facebook/dinov3-vitl16-pretrain-lvd1689m
  • 权重下载地址(HuggingFace):https://huggingface.co/facebook/dinov3-vitl16-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-vitl16-pretrain-lvd1689m
  • 架构:ARM aarch64(Kunpeng-920,192 核)

3. 推理代码

已验证通过的推理示例:

import torch
import torch_npu
from transformers import AutoImageProcessor, AutoModel

model_path = "/opt/atomgit/dinov3-vitl16-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, 1024]

输出说明:

  • 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, 1024]

4. 精度验证

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

指标数值
cosine_similarity0.99998906
mean_abs_error1.43e-03
max_abs_error1.91e-02
mean_rel_error8.14e-02

验证结论:

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

NPU 输出与 CPU 基线高度一致。由于 ViT-L 包含 24 层 Transformer,跨设备的数值差异相比 ViT-S(12 层)有适度累积,但 cosine_similarity 仍保持在 0.999989 以上,embedding 语义一致性无影响,完全满足下游视觉任务(检索、分类、分割等)的精度要求。

5. 性能参考

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

指标数值
mean_latency_ms34.219 ms
median_latency_ms34.193 ms
min_latency_ms33.868 ms
max_latency_ms35.007 ms
p99_latency_ms34.943 ms
std_latency_ms0.282 ms
throughput_imgs_per_sec29.22 img/s

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

6. 模型信息

属性数值
模型类DINOv3ViTModel
参数量303.13 M
权重文件大小~1.2 GB
hidden_size1024
num_hidden_layers24
num_attention_heads16
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 基线存在微小数值差异。ViT-L(24 层)的误差累积略高于 ViT-S(12 层),mean_abs_error 约 1.4e-3,仍在业界正常范围内,不影响 embedding 的语义一致性。

  3. 显存占用:单 batch 推理时 HBM 占用约 2 GB 左右(含模型权重 ~1.2 GB 与激活值),大 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-vitl16-pretrain-lvd1689m -d ./dinov3-vitl16-pretrain-lvd1689m