本文档记录 DINOv3-vitl16-pretrain-lvd1689m 在华为昇腾 Ascend 910B NPU 上的适配与验证结果。
DINOv3 是 Meta AI 推出的自监督视觉 Transformer 模型,本验证基于 transformers 原生 DINOv3ViTModel 推理链路,直接在 PyTorch + torch_npu 环境下完成模型加载、NPU 推理、精度对比与性能基准测试。模型无需额外修改即可在昇腾 NPU 上完成前向推理。
相关获取地址:
参考文档:
| 组件 | 版本 |
|---|---|
transformers | 4.57.6 |
torch | 2.9.0+cpu |
torch-npu | 2.9.0 |
Python | 3.11.14 |
CANN | 8.5.1 |
1 逻辑卡(Ascend 910B4,32 GB HBM)/opt/atomgit/dinov3-vitl16-pretrain-lvd1689m已验证通过的推理示例:
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]14×14=196 个 patch tokens201pooler_output 为池化后的全局图像表示,形状 [batch_size, 1024]使用相同随机种子生成 dummy 输入,分别在 CPU 与 NPU 执行前向推理,对比输出张量。
| 指标 | 数值 |
|---|---|
cosine_similarity | 0.99998906 |
mean_abs_error | 1.43e-03 |
max_abs_error | 1.91e-02 |
mean_rel_error | 8.14e-02 |
验证结论:
cosine_similarity > 0.9999:PASSmean_abs_error < 2e-3:PASSmax_abs_error < 2e-2:PASSNPU 输出与 CPU 基线高度一致。由于 ViT-L 包含 24 层 Transformer,跨设备的数值差异相比 ViT-S(12 层)有适度累积,但 cosine_similarity 仍保持在 0.999989 以上,embedding 语义一致性无影响,完全满足下游视觉任务(检索、分类、分割等)的精度要求。
测试条件:batch_size=1,image_size=224×224,连续 warmup 5 轮后采样 20 轮。
| 指标 | 数值 |
|---|---|
mean_latency_ms | 34.219 ms |
median_latency_ms | 34.193 ms |
min_latency_ms | 33.868 ms |
max_latency_ms | 35.007 ms |
p99_latency_ms | 34.943 ms |
std_latency_ms | 0.282 ms |
throughput_imgs_per_sec | 29.22 img/s |
注:以上为单卡单 batch 性能;实际部署时可通过 batching、多 stream、CPU 绑核等手段进一步提升吞吐。
| 属性 | 数值 |
|---|---|
| 模型类 | DINOv3ViTModel |
| 参数量 | 303.13 M |
| 权重文件大小 | ~1.2 GB |
hidden_size | 1024 |
num_hidden_layers | 24 |
num_attention_heads | 16 |
patch_size | 16 |
image_size | 224 |
num_register_tokens | 4 |
torch_dtype | float32 |
Transformers 版本要求:DINOv3 需要 transformers >= 4.56.0,请确认当前环境满足该条件。
NPU 数值精度:视觉 Transformer 在 NPU 上的 LayerNorm、Softmax、MatMul 等算子采用昇腾优化实现,与 CPU 基线存在微小数值差异。ViT-L(24 层)的误差累积略高于 ViT-S(12 层),mean_abs_error 约 1.4e-3,仍在业界正常范围内,不影响 embedding 的语义一致性。
显存占用:单 batch 推理时 HBM 占用约 2 GB 左右(含模型权重 ~1.2 GB 与激活值),大 batch 场景请根据实际显存调整。
推理优化建议:
TASK_QUEUE_ENABLE=1 开启算子异步下发PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 优化内存分配权重下载方式:本验证使用 atomgit CLI 从 GitCode 镜像下载完整权重:
python3 -m atomgit download hf_mirrors/facebook/dinov3-vitl16-pretrain-lvd1689m -d ./dinov3-vitl16-pretrain-lvd1689m