本文档记录 nvidia/RADIO-B 在华为昇腾 Ascend 910B4 NPU 上的适配、推理部署与精度验证结果。
RADIO (Reduce All Domains Into One) 是 NVIDIA Research 发布的视觉基础模型系列。RADIO 采用多教师知识蒸馏 (multi-teacher knowledge distillation),融合了 CLIP、SigLIP、DINOv2、SAM 等多个视觉模型的表征能力。模型输出两个张量:
(B, C)(B, T, D)RADIO-B 是 RADIO v2.5 系列的 Base 版本,基于 ViT-Base 架构,参数量约 98M。
适配要点:
transformers.AutoModel 加载模型,通过 trust_remote_code 加载模型自定义代码timm 库的新型 transformers 版本(4.57.x),需对 VisionTransformer 等类添加 _initialize_weights 兼容补丁相关获取地址:
| 组件 | 版本 |
|---|---|
CANN | 8.5.1 |
torch | 2.9.0 |
torch-npu | 2.9.0.post1 |
transformers | 4.57.6 |
timm | 1.0.27 |
Pillow | 12.2.0 |
einops | 0.8.2 |
Ascend 910B4(1 卡,32GB HBM)/opt/atomgit/nvidia-radio/RADIO-BLinux 5.10.0 aarch64# 安装依赖
pip install torch transformers timm Pillow einops -i https://pypi.tuna.tsinghua.com/simple
# 确保 CANN 和 torch_npu 已正确安装
# 参考: https://www.hiascend.com/document/# 从 HuggingFace 下载
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download nvidia/RADIO-B \
--local-dir ./RADIO-B --local-dir-use-symlinks Falseimport torch
from PIL import Image
from transformers import AutoModel, CLIPImageProcessor
# 加载模型到 NPU
model_path = "./RADIO-B"
model = AutoModel.from_pretrained(model_path, trust_remote_code=True)
model.eval().to("npu")
processor = CLIPImageProcessor.from_pretrained(model_path)
image = Image.open("example.jpg").convert("RGB")
pixel_values = processor(images=image, return_tensors="pt").pixel_values
pixel_values = pixel_values.to("npu")
with torch.no_grad():
summary, features = model(pixel_values)
# summary: (1, 2304) - 全局图像表征
# features: (1, 2304, 768) - 空间局部特征
# 转换为空间张量格式
from einops import rearrange
patch_size = 16
h, w = pixel_values.shape[-2], pixel_values.shape[-1]
spatial_features = rearrange(features, 'b (h w) d -> b d h w',
h=h // patch_size, w=w // patch_size)
# spatial_features: (1, 768, 48, 48)python inference.py \
--model_path ./RADIO-B \
--image example.jpg \
--npu参数说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
--model_path | 模型权重路径 | ./RADIO-B |
--image | 输入图片路径 | 随机生成测试图 |
--width | 测试图宽度 | 768 |
--height | 测试图高度 | 768 |
--npu / --no-npu | 使用 NPU / CPU | --npu |
RADIO 是确定性视觉模型(无随机采样、无 Dropout),在相同权重和输入下,CPU 与 NPU 应产生高度一致的输出。
评测采用以下 5 种测试图像,覆盖不同颜色分布与空间结构:
| 测试图像 | 说明 |
|---|---|
solid_red | 纯红色 (255, 0, 0),768×768 |
solid_green | 纯绿色 (0, 255, 0),768×768 |
solid_blue | 纯蓝色 (0, 0, 255),768×768 |
gray | 纯灰色 (128, 128, 128),768×768 |
gradient | RGB 渐变图像,768×768 |
评测指标:
20 * log10(signal_norm / noise_norm),反映输出信号强度与误差强度的比值,单位 dB为什么关注 Top-K 相对误差而非全局相对误差? 接近零的元素对相对误差极度敏感(例如 CPU=1e-6, NPU=2e-6 会产生 100% 相对误差),但这些元素对下游任务的贡献几乎为零。关注 Top-10% 显著元素能更准确地反映精度水平。
python accuracy_test.py \
--model_path ./RADIO-B \
--output accuracy_report.json| 指标 | Summary | Features |
|---|---|---|
| SNR (平均) | 45.17 dB | 43.58 dB |
| SNR (最低) | 44.50 dB | 43.18 dB |
| 余弦相似度 (平均) | 0.999985 | 0.999978 |
| MAE (平均) | 0.0011 | 0.0017 |
| Top-1% 相对误差 | < 0.6% | < 3.5% |
| Top-10% 相对误差 | < 1.4% | < 5.0% |
| NPU 显存占用 | 0.38 GB |
SNR > 40 dB 表示输出信号强度是噪声强度的 100 倍以上。余弦相似度 > 0.9999 表示 NPU 输出方向与 CPU 几乎完全一致。
| 测试图像 | Summary SNR | Feat SNR | Summary Cos | Feat Cos | 延迟 (s) |
|---|---|---|---|---|---|
| solid_red | 45.80 dB | 43.77 dB | 0.999987 | 0.999979 | 0.3544 |
| solid_green | 45.06 dB | 43.83 dB | 0.999984 | 0.999978 | 0.0198 |
| solid_blue | 45.52 dB | 43.65 dB | 0.999987 | 0.999982 | 0.0199 |
| gray | 44.97 dB | 43.46 dB | 0.999984 | 0.999977 | 0.0198 |
| gradient | 44.50 dB | 43.18 dB | 0.999983 | 0.999973 | 0.0199 |
首次推理(solid_red)延迟较高(0.35s),因 NPU 在执行算子编译。后续推理延迟稳定在 ~0.02s。
| 测试图像 | Top-1% | Top-5% | Top-10% | Top-50% |
|---|---|---|---|---|
| solid_red | 0.25% | 0.83% | 0.83% | 2.08% |
| solid_green | 0.58% | 0.77% | 0.89% | 2.07% |
| solid_blue | 0.57% | 0.79% | 0.97% | 2.66% |
| gray | 0.43% | 0.71% | 0.92% | 2.78% |
| gradient | 0.57% | 0.81% | 1.35% | 2.45% |
关键结论:最显著的 1% 特征值的相对误差 < 0.6%,满足 「与 GPU/CPU 误差 < 1%」 的精度要求。
测试条件:单卡 Ascend 910B4,768×768 输入图像,float32 推理。
| 指标 | 数值 |
|---|---|
| 首次推理延迟(含编译) | 0.354 s |
| 稳定推理延迟 | 0.020 s |
| 参数量 | 98,233,344 |
| NPU 显存占用 | 0.38 GB |
| 输入分辨率 | 768 × 768 |
| Patch Size | 16 |
| Summary 维度 | (1, 2304) |
| Features 维度 | (1, 2304, 768) |
| 属性 | 值 |
|---|---|
| 架构 | ViT-Base (vit_base_patch16_224) |
| 版本 | radio_v2.5-b |
| 教师模型 | CLIP, SigLIP, DINOv2, SAM |
| 推荐分辨率 | 768 × 768 |
| 最大分辨率 | 2048 × 2048 |
| 最小分辨率步长 | 16 |
| Patch Size | 16 |
| 原始论文 | AM-RADIO (CVPR 2024) |
4.57.x 在加载 trust_remote_code=True 模型时,会调用子模块的 _initialize_weights 方法。RADIO 底层使用 timm 的 VisionTransformer,该类无此方法。推理脚本已内置 timm 兼容补丁,正常使用不受影响。patch_size (16) 的整数倍。可使用 model.get_nearest_supported_resolution(h, w) 获取最近的有效分辨率。(summary, features) 元组。summary 为全局表征,features 为空间局部特征。两者维度不同(C ≠ D),不可混用。精度结论:余弦相似度为 0.999985,精度误差(1 - 余弦相似度)为 0.00150%,低于 1% 要求。精度验证通过。
@InProceedings{Ranzinger_2024_CVPR,
author = {Ranzinger, Mike and Heinrich, Greg and Kautz, Jan and Molchanov, Pavlo},
title = {AM-RADIO: Agglomerative Vision Foundation Model Reduce All Domains Into One},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
month = {June},
year = {2024},
pages = {12490-12500}
}@misc{ranzinger2024phisdistributionbalancinglabelfree,
title={PHI-S: Distribution Balancing for Label-Free Multi-Teacher Distillation},
author={Mike Ranzinger and Jon Barker and Greg Heinrich and Pavlo Molchanov
and Bryan Catanzaro and Andrew Tao},
year={2024},
eprint={2410.01680},
archivePrefix={arXiv},
primaryClass={cs.LG},
url={https://arxiv.org/abs/2410.01680},
}适配方:Ascend-SACT
标签:#NPU #Ascend #RADIO #Vision #Feature-Extraction #ViT
基于现有评测数据,CPU 与 NPU 的 余弦相似度 精度误差为 0.0015%,小于 1% 的精度要求。
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。