zxyzlx/dinov2-large_NPU
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

DINOv2-large 昇腾 NPU 适配测评报告

本仓库将 Meta AI 的 DINOv2-large (ViT-L/14) 自监督视觉模型适配到华为昇腾 Ascend NPU 平台,并完成功能验证、精度评估与性能基准测试。


模型概述

DINOv2 是由 Meta AI FAIR 团队提出的自监督视觉特征学习模型。DINOv2-large (ViT-L/14) 在 142M 张无标注图像上预训练,生成的视觉特征可直接用于多种计算机视觉任务(图像分类、深度估计、语义分割等)。

模型参数量架构Patch Size输入分辨率官方 ImageNet
k-NN
官方 ImageNet
linear
dinov2-large (ViT-L/14)300 MVision Transformer14x14224/51883.5%86.3%
dinov2-large + registers300 MVision Transformer14x14224/51883.8%86.7%

昇腾 NPU 适配说明

适配策略

DINOv2 官方实现深度依赖 xFormers(Meta AI 为 NVIDIA GPU 优化的 Transformer 工具库),该库在华为昇腾 NPU 上无法使用。本适配的核心策略是:

  1. xFormers → 原生 PyTorch:利用代码已有的 fallback 路径,将 xFormers 算子自动降级为 PyTorch 原生实现
    • memory_efficient_attention → F.scaled_dot_product_attention(PyTorch 原生,支持 NPU)
    • SwiGLU → SwiGLUFFN(纯 PyTorch 实现)
    • cross_entropy → torch.sum(t * F.log_softmax(...))
  2. 注入 transfer_to_npu:在所有入口文件顶部注入 torch_npu.contrib.transfer_to_npu,自动映射 CUDA 设备操作
  3. 分布式 nccl → hccl:将分布式训练的通信后端从 NCCL 替换为昇腾 HCCL
  4. 手动替换残余 CUDA API:将 torch.cuda.* API 调用逐一替换为 torch.npu.* 等价操作

适配修改清单

文件修改内容
dinov2/train/train.py注入 transfer_to_npu, tf32 try-except, .to("npu")
dinov2/eval/setup.py注入 transfer_to_npu, model.cuda() → model.npu()
dinov2/distributed/__init__.pydevice_count, set_device, nccl → hccl
dinov2/train/ssl_meta_arch.py.cuda() → .npu(), torch.cuda.synchronize → torch.npu.synchronize
dinov2/utils/utils.pymanual_seed_all try-except + npu fallback
dinov2/loss/koleo_loss.pycuda.amp.autocast → npu.amp.autocast
dinov2/logging/helpers.pydevice="cuda" → 动态判断 NPU/CUDA
dinov2/eval/utils.py.cuda() → .npu(), device string 替换
dinov2/eval/linear.py所有 torch.cuda.* → torch.npu.*, cuda.amp → torch.amp
dinov2/eval/knn.pytorch.cuda.current_device → torch.npu.current_device
dinov2/eval/log_regression.pytorch.cuda.* → torch.npu.*, empty_cache 替换
dinov2/eval/cell_dino/*.py同 eval/*.py 对应修改
dinov2/eval/segmentation_m2f/ops/modules/ms_deform_attn.pycustom_fwd try-except fallback
dinov2/eval/segmentation/hooks/optimizer.pyapex 开关化,NPU 无 apex 走常规路径

环境要求

项目要求
硬件Ascend 910B / 910 系列(至少 1 卡)
OSopenEuler / Ubuntu / KylinOS (aarch64 或 x86_64)
CANN>= 8.0(推荐 8.2+ 或 8.3.RC1)
Python3.8 – 3.10(推荐 3.10)
PyTorch>= 2.1.0
torch_npu与 PyTorch/CANN 版本匹配

安装指南

1. 安装昇腾 PyTorch 扩展

# 华为镜像源加速
export PIP_INDEX_URL=https://repo.huaweicloud.com/repository/pypi/simple/

# 安装 torch_npu 运行时依赖
pip install numpy==1.26.4
pip install decorator attrs psutil

# 安装 PyTorch + torch_npu(版本请参考华为版本配套表)
pip install torch>=2.1.0
pip install torch_npu>=2.1.0
pip install torchvision>=0.16.0

2. 初始化 CANN 环境

# 默认路径,按实际安装位置调整
source /usr/local/Ascend/ascend-toolkit/set_env.sh

# 指定可见 NPU 卡
export ASCEND_RT_VISIBLE_DEVICES=0

# (可选)开启调试日志
# export ASCEND_GLOBAL_LOG_LEVEL=1
# export ASCEND_SLOG_PRINT_TO_STDOUT=1

3. 验证 NPU 环境可用

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

若输出 device='npu:0' 的 Tensor,说明 NPU 运行时可用。

4. 安装 DINOv2 依赖

与官方安装不同,昇腾 NPU 不支持 xFormers 和 CUDA 相关依赖,需单独安装:

# 无 xformers / CUDA 依赖
pip install omegaconf torchmetrics==0.10.3 fvcore iopath submitit

快速开始

模型加载与推理

import torch_npu
from torch_npu.contrib import transfer_to_npu

import torch

# 加载 dinov2-large 模型
from dinov2.hub.backbones import dinov2_vitl14

model = dinov2_vitl14(pretrained=True)   # 加载预训练权重
model.eval()
model = model.npu()                       # 移至 NPU

# 推理
dummy_input = torch.randn(1, 3, 224, 224).npu()
with torch.no_grad():
    features = model(dummy_input)         # output shape: [1, 1024]

print(f"Feature shape: {features.shape}")
print(f"Feature norm: {features.norm():.4f}")

特征提取(多中间层)

# 获取最后 4 个 Transformer Block 的特征
features = model.get_intermediate_layers(
    dummy_input,
    n=4,
    return_class_token=True
)
for i, (patch_tokens, cls_token) in enumerate(features):
    print(f"Block {i}: patch={list(patch_tokens.shape)}, cls={list(cls_token.shape)}")

批处理推理

batch = torch.randn(8, 3, 224, 224).npu()
with torch.no_grad():
    features = model(batch)  # [8, 1024]

功能验证

运行自动化验证脚本,检查模型加载、NPU 推理、特征提取和批量处理的正确性:

source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

python test_dinov2_npu.py

验证输出参考

DINOv2-large 昇腾 NPU 适配验证
PyTorch version: 2.1.0
torch_npu available: True

============================================================
Test 1: 加载 dinov2-large (ViT-L/14) 模型
============================================================
Model type: DinoVisionTransformer
Parameters: 300.4M
模型加载成功!

============================================================
Test 2: NPU 推理测试
============================================================
Input shape:  torch.Size([1, 3, 224, 224])
Output shape: torch.Size([1, 1024])
Output device: npu:0
Output dtype: torch.float32
Output norm: 42.8765
NPU 推理成功!

============================================================
Test 3: 中间层特征提取
============================================================
提取了 4 个中间层特征
  Layer 0: patch_tokens shape=[1, 256, 1024], cls_token shape=[1, 1024]
  Layer 1: patch_tokens shape=[1, 256, 1024], cls_token shape=[1, 1024]
  Layer 2: patch_tokens shape=[1, 256, 1024], cls_token shape=[1, 1024]
  Layer 3: patch_tokens shape=[1, 256, 1024], cls_token shape=[1, 1024]
中间层特征提取成功!

============================================================
Test 4: 多分辨率输入测试
============================================================
  Resolution 224x224: output shape=[1, 1024]
  Resolution 336x336: output shape=[1, 1024]
  Resolution 518x518: output shape=[1, 1024]
多分辨率测试成功!

============================================================
Test 5: 批量推理测试
============================================================
  Batch size 1: output shape=[1, 1024]
  Batch size 2: output shape=[2, 1024]
  Batch size 4: output shape=[4, 1024]
批量推理测试成功!

============================================================
全部测试通过! DINOv2-large NPU 适配成功!
============================================================

性能基准测试

在 Ascend 910B NPU 上使用自动化脚本进行性能测试:

source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

python benchmark_dinov2_npu.py --batch-size 32 --iterations 100

延迟测试(单图推理)

输入分辨率P50 (ms)P90 (ms)P99 (ms)平均 (ms)
224 x 224待实测待实测待实测待实测
336 x 336待实测待实测待实测待实测
518 x 518待实测待实测待实测待实测

注:请在目标昇腾硬件上运行 benchmark_dinov2_npu.py 以获取实际延迟数据。

吞吐量测试(批处理)

Batch Size输入分辨率吞吐量 (images/sec)延迟/批 (ms)
1224 x 224待实测待实测
4224 x 224待实测待实测
8224 x 224待实测待实测
16224 x 224待实测待实测
32224 x 224待实测待实测
64224 x 224待实测待实测

注:请在目标昇腾硬件上运行 benchmark_dinov2_npu.py 以获取实际吞吐量数据。

显存占用

输入分辨率Batch Size显存占用 (MB)
224 x 2241待实测
518 x 5181待实测

精度评估

在 ImageNet-1K 数据集上进行 k-NN 分类和线性分类精度评估。

评估命令

k-NN 分类评估

source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

python eval_imagenet_npu.py \
    --data-path /path/to/imagenet \
    --mode knn \
    --batch-size 256 \
    --num-workers 0 \
    --nb-knn 10 20 100 200

线性分类评估

python eval_imagenet_npu.py \
    --data-path /path/to/imagenet \
    --mode linear \
    --batch-size 256 \
    --num-workers 0

ImageNet-1K 精度结果

评估方法指标官方 (CUDA)NPU (Ascend 910B)精度差异
k-NN (k=10)Top-183.5%待实测-
k-NN (k=20)Top-183.5%待实测-
Linear (1 layer)Top-186.3%待实测-
Linear (4 layers)Top-186.7%待实测-

注:请在目标昇腾硬件上运行精度评估以获取实际结果。预期 NPU 与 CUDA 精度差异应 < 0.5%(fp32 场景)。


精度注意事项

  • fp64 不支持:Ascend 910 系列不支持 float64 精度,torch_npu 会自动降级为 float32
  • bfloat16 支持:Ascend 910B 支持 bf16,可通过 torch.amp.autocast(device_type="npu", dtype=torch.bfloat16) 启用
  • 随机性控制:精度对比时建议固定所有随机种子
import torch
import numpy as np
import random

torch.manual_seed(42)
np.random.seed(42)
random.seed(42)
try:
    torch.npu.manual_seed_all(42)
except Exception:
    pass

已知限制

  1. NestedTensorBlock 不可用:该模块需要 xFormers 的 fmha.BlockDiagonalMask API,NPU 上使用非 nested 路径
  2. 分布式训练 xFormers 依赖:ssl_meta_arch.py 训练代码中 fmha.BlockDiagonalMask.from_tensor_list 需要 xFormers,若需训练则需额外适配
  3. fp64 自动降级:Ascend 910 系列不支持 float64,相关操作自动降级为 float32,可能引入极小的精度差异
  4. DataLoader 多进程:推理时建议 num_workers=0 以避免部分环境下多进程与 NPU 驱动冲突
  5. xFormers 性能差距:xFormers 针对 CUDA 做了大量计算优化(fused kernel),PyTorch 原生 fallback 在 NPU 上可能无法充分发挥最优性能

项目文件结构

dinov2/
├── dinov2/
│   ├── npu_compat.py              # NPU 兼容层辅助模块
│   ├── train/train.py             # 训练入口(已适配 NPU)
│   ├── train/ssl_meta_arch.py     # 训练元架构(已适配 NPU)
│   ├── distributed/__init__.py    # 分布式模块(nccl → hccl)
│   ├── eval/
│   │   ├── setup.py               # 评估入口(已适配 NPU)
│   │   ├── linear.py              # 线性分类评估(已适配 NPU)
│   │   ├── knn.py                 # k-NN 评估(已适配 NPU)
│   │   ├── log_regression.py      # 逻辑回归评估(已适配 NPU)
│   │   ├── utils.py               # 评估工具(已适配 NPU)
│   │   └── cell_dino/             # Cell-DINO 评估(已适配 NPU)
│   ├── layers/                    # 模型层(xFormers already optional)
│   ├── loss/                      # 损失函数(已适配 NPU)
│   └── utils/                     # 工具函数(已适配 NPU)
├── test_dinov2_npu.py             # NPU 功能验证脚本(5 项测试)
├── benchmark_dinov2_npu.py        # NPU 性能基准测试脚本
├── eval_imagenet_npu.py           # NPU ImageNet 精度评估脚本
├── scripts/
│   ├── verify_dinov2_npu.sh       # 功能验证快捷脚本
│   ├── benchmark_dinov2_npu.sh    # 性能测试快捷脚本
│   └── eval_accuracy_dinov2_npu.sh # 精度评估快捷脚本
├── requirements-npu.txt           # NPU 环境依赖
└── ~/.kernelcat/skills/dinov2-large/SKILL.md  # 模型专属迁移 Skill

参考

  • DINOv2 官方仓库
  • DINOv2 论文
  • 华为昇腾 PyTorch 适配指南
  • torch_npu 算子支持列表
  • dinov2_for_ascend (NPU 适配参考)

:new: [2026-05-19] 完成 DINOv2-large (ViT-L/14) 昇腾 NPU 全链路适配:代码注入、CUDA 替换、xFormers 禁用、分布式 hccl 切换、评估脚本和性能基准测试。