本文档记录 nvidia/RADIO-g 在华为昇腾 Ascend 910B4 NPU 上的适配、推理部署与精度验证结果。
RADIO (Reduce All Domains Into One) 是 NVIDIA Research 发布的视觉基础模型系列,采用多教师知识蒸馏融合 CLIP、SigLIP、DINOv2、SAM 等视觉表征。
RADIO-g 是 RADIO v2.5 系列的 Giant 版本,基于 DINOv2-g Student 架构,参数量约 1.16B,是 RADIO 系列中最大的模型。模型输出两个张量:
(B, 1536)(B, 4096, 1536)(896×896 输入,patch_size=14)适配要点:
transformers.AutoModel 加载,通过 trust_remote_code 加载模型自定义代码dino_v2_g_student 架构,需对 dinov2_arch.py 中的 LayerScale._load_from_state_dict 进行兼容性修复,以适配 transformers 4.57.x 的 meta-device 加载机制相关获取地址:
| 组件 | 版本 |
|---|---|
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 |
Ascend 910B4(1 卡,32GB HBM)Linux 5.10.0 aarch64pip install torch transformers timm Pillow einops -i https://pypi.tuna.tsinghua.com/simpleexport HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download nvidia/RADIO-g \
--local-dir ./RADIO-g --local-dir-use-symlinks Falseimport torch
from PIL import Image
from transformers import AutoModel, CLIPImageProcessor
model_path = "./RADIO-g"
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, 1536) - 全局图像表征
# features: (1, 4096, 1536) - 空间局部特征(896x896, patch=14)python inference.py --model_path ./RADIO-g --image example.jpgRADIO-g 是确定性视觉模型。评测采用 896×896 纯色与渐变测试图像。
由于 RADIO-g 使用不同于 B/L/H 的 dino_v2_g_student 架构,需先对 dinov2_arch.py 进行兼容性修复后才能使用 AutoModel.from_pretrained 正常加载。
| 设备 | Summary L2 Norm | 推理延迟 | 显存占用 |
|---|---|---|---|
| CPU (float32) | 3.2556 | — | ~4.5 GB |
| NPU (float32) | 3.2556 | 0.815 s | 4.35 GB |
CPU 与 NPU 的 Summary L2 Norm 完全一致(3.2556),证明权重加载与推理计算正确。
测试条件:单卡 Ascend 910B4,896×896 输入,float32 推理。
| 指标 | 数值 |
|---|---|
| 推理延迟 | 0.815 s |
| 参数量 | 1,159,548,416 |
| NPU 显存占用 | 4.35 GB |
| 输入分辨率 | 896 × 896 |
| Patch Size | 14 |
| Summary 维度 | (1, 1536) |
| Features 维度 | (1, 4096, 1536) |
| 属性 | 值 |
|---|---|
| 架构 | DINOv2-g Student |
| 版本 | radio_v2.5-g |
| 教师模型 | CLIP, SigLIP, DINOv2, SAM |
| 推荐分辨率 | 896 × 896 |
| 最大分辨率 | 1792 × 1792 |
| Patch Size | 14 |
dinov2_arch.py 中 LayerScale._load_from_state_dict 存在两个兼容性问题:
strict 检查在 transformers 4.57.x 的 meta-loading 下会错误触发 KeyErrorsuper()._load_from_state_dict() 导致参数停留在 meta deviceif strict: 改为 if False:,并取消注释 return super()._load_from_state_dict(...) 行patch_size (14) 的整数倍。精度结论:CPU 与 NPU 的 Summary L2 Norm 完全一致(3.2556),推理计算正确,精度误差低于 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}
}适配方:Ascend-SACT
标签:#NPU #Ascend #RADIO #Vision #Feature-Extraction #ViT #DINOv2
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。