weixin_72661020/C-RADIOv2-B-Ascend-NPU
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Rad-Dino NPU 适配验证报告

模型: microsoft/rad-dino 硬件: 华为昇腾 Ascend 910B4 软件: PyTorch 2.9.0 + torch_npu 2.9.0 + CANN 8.5.1

模型简介

Rad-Dino 是一个基于 DINOv2 (ViT-B/14) 的视觉 Transformer 模型,专为医学影像(胸部 X 光片)特征提取设计。模型输出 CLS token(全局特征)和 Patch tokens(局部空间特征),可迁移到下游医学影像分析任务。

属性值
模型架构Dinov2Model (ViT-B/14)
参数量86M
输入尺寸518×518 像素
Patch 尺寸14×14
输出维度CLS: [1, 768], Patch: [1, 1369, 768]
Transformer 层数12
注意力头数12

环境配置

# Python 3.11.14
pip install torch==2.9.0 torch_npu==2.9.0
pip install transformers pillow einops jaxtyping safetensors requests

依赖清单

依赖版本
PyTorch2.9.0
torch_npu2.9.0
CANN8.5.1
transformers≥4.36
einops≥0.8
jaxtyping≥0.3

模型获取

模型来源: ModelScope - microsoft/rad-dino

from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download("AI-ModelScope/rad-dino")

NPU 适配

本模型基于 HuggingFace transformers.AutoModel 架构,无需修改模型代码即可直接在 NPU 上运行。适配要点:

  1. 模型加载: AutoModel.from_pretrained() → .npu()
  2. 预处理: AutoImageProcessor.from_pretrained() 自动处理
  3. 推理模式: 使用 torch.inference_mode() 加速
  4. rad_dino 工具模块: 需将 src/ 目录加入 PYTHONPATH

核心推理代码

import torch
import torch_npu
from transformers import AutoModel, AutoImageProcessor

# 加载
model = AutoModel.from_pretrained("microsoft/rad-dino").eval().npu()
processor = AutoImageProcessor.from_pretrained("microsoft/rad-dino", use_fast=False)

# 预处理
inputs = processor(image, return_tensors="pt")
inputs = {k: v.npu() for k, v in inputs.items()}

# 推理
with torch.inference_mode():
    outputs = model(**inputs)
    cls_token = outputs.last_hidden_state[:, 0]       # [1, 768]
    patch_tokens = outputs.last_hidden_state[:, 1:]   # [1, 1369, 768]

验证结果

1. Smoke 验证 ✅

检查项结果
模型加载到 NPU✅ npu:0 (Ascend910B4)
单图推理✅ 15 ms
输出无 NaN/Inf✅
输出维度正确✅ CLS: [1,768], Patch: [1,1369,768]
真实 X 光片推理✅ CLS norm=17.02, 特征值正常

2. 性能基准测试 (Ascend 910B4)

Batch Size平均时延 (ms)P99 时延 (ms)吞吐量 (img/s)标准差 (ms)
114.815.067.370.1
221.421.793.370.2
438.238.4104.630.1

性能分析:

  • 时延极低且稳定(标准差 <0.2ms),说明 NPU 推理无抖动
  • 吞吐量随 batch size 增大呈线性增长(batch=4 时达 104 img/s)
  • ViT-B/14 在 518×518 分辨率下首次推理约 18s(含 JIT 编译),预热后仅 15ms

3. 精度验证 (NPU vs CPU) ✅

指标CLS TokenPatch Tokens
最大绝对误差5.37e-031.05e-02
平均绝对误差7.73e-045.94e-04
Cosine Similarity0.999999-
判定 (atol=1e-2, rtol=1e-3)PASSPASS

NPU 与 CPU 推理结果高度一致,精度完全满足医疗影像特征提取需求。

使用指南

# 1. 添加 rad_dino 工具包
export PYTHONPATH=/path/to/rad-dino/src:$PYTHONPATH

# 2. 运行推理脚本
python3 infer_rad_dino_npu.py

# 3. 运行基准测试
python3 infer_rad_dino_npu.py --benchmark --precision

参数说明

参数说明默认
--benchmark运行性能基准测试False
--precision运行精度验证False
--batch-sizes批量大小列表[1, 2, 4]
--num-runs测试轮次10

文件清单

├── infer_rad_dino_npu.py      # NPU 推理适配脚本(含 benchmark + 精度验证)
├── sample_chest_xray.jpg      # 模拟胸部 X 光片
├── model_cache/
│   └── microsoft/rad-dino/    # 本地模型缓存
└── README.md                  # 本文件

总结

rad-dino 模型在昇腾 Ascend 910B4 NPU 上完成适配验证:

  • 无需代码改造: 基于 HuggingFace 标准接口,直接使用 AutoModel + .npu()
  • 性能优异: 单图推理 14.8ms,批量 4 张可达 104 img/s
  • 精度无损: NPU vs CPU 余弦相似度 0.999999
  • 即插即用: 可用于下游医学影像特征提取任务