本文档记录 NVIDIA RADIO-L(AM-RADIO: Reduce All Domains Into One)视觉基础模型在 华为昇腾 Ascend910 NPU 上的适配、推理、精度验证与性能基准测试结果。
RADIO-L 是一个大规模视觉基础模型,通过多教师蒸馏(CLIP、SigLIP、DINOv2、SAM)融合多种视觉表征能力,输出全局特征向量(summary)和密集空间特征(spatial_features),适用于图像分类、分割、检测等下游任务。
相关资源:
| 组件 | 版本 |
|---|---|
| CPU | aarch64 |
| NPU | Ascend910_9362 (2 逻辑卡,64GB HBM/卡) |
| OS | Linux 5.10.0 (aarch64) |
| Python | 3.11.14 |
| torch | 2.9.0 |
| torch_npu | 2.9.0.post1+gitee7ba04 |
| transformers | 4.40.1 |
| open_clip_torch | 3.3.0 |
| timm | 最新版 |
# 方式一:从 GitCode 镜像仓库克隆
git clone https://gitcode.com/hf_mirrors/nvidia/RADIO-L.git
cd RADIO-L
# 方式二:从 HuggingFace 直接下载
git clone https://huggingface.co/nvidia/RADIO-L模型权重文件:model.safetensors(约 1.2GB,319.88M 参数)
pip install torch torch_npu transformers timm open_clip_torch pillow numpyRADIO-L 使用 HuggingFace trust_remote_code=True 加载自定义模型代码,在昇腾 NPU 上无需修改任何模型源代码即可直接运行:
hf_model.py, radio_model.py, eradio_model.py 等)transformers.AutoModel.from_pretrained(..., trust_remote_code=True) 加载model.to("npu:0") 将模型迁移至 NPUfloat32、float16# float32 精度推理
python3 inference.py --dtype float32
# float16 精度推理(可提升性能)
python3 inference.py --dtype float16
# 指定输入图像
python3 inference.py --image /path/to/image.jpg模型输出包含两个部分:
| 输出 | 形状 | 说明 |
|---|---|---|
summary | [1, 3072] | 全局图像特征向量,类似于 ViT 的 CLS token |
spatial_features | [1, 2304, 1024] | 密集空间特征,适用于分割、检测等稠密任务 |
import torch
from PIL import Image
from transformers import AutoModel, CLIPImageProcessor
repo = "./RADIO-L"
image_processor = CLIPImageProcessor.from_pretrained(repo)
model = AutoModel.from_pretrained(repo, trust_remote_code=True)
model = model.to("npu:0").eval()
image = Image.open("image.jpg").convert("RGB")
pixel_values = image_processor(images=image, return_tensors="pt", do_resize=True).pixel_values.to("npu:0")
summary, spatial_features = model(pixel_values)
print(f"Summary: {summary.shape}, Features: {spatial_features.shape}")空间特征可还原为 2D 格式:
from einops import rearrange
patch_size = 16 # RADIO-L patch size
h, w = pixel_values.shape[-2] // patch_size, pixel_values.shape[-1] // patch_size
spatial = rearrange(spatial_features, 'b (h w) d -> b d h w', h=h, w=w)NPU vs CPU 对比验证:使用 3 张不同分辨率的随机图像,计算余弦相似度和相对误差。
python3 accuracy_run.py| 指标 | 值 |
|---|---|
| 最小余弦相似度 | 0.99997289 |
| 平均余弦相似度 | 0.99999778 |
| 最大相对误差 | 0.00805 (0.8%) |
| 最大绝对误差 | 0.0370 |
| 图像 | 输出 | 余弦相似度 | 相对误差 | 最大绝对误差 |
|---|---|---|---|---|
| 图像1 (768x768) | output[0] (summary) | 0.99997384 | 0.00793 | 0.0115 |
| 图像1 (768x768) | output[1] (features) | 1.00001622 | 0.00644 | 0.0224 |
| 图像2 (768x768) | output[0] (summary) | 0.99997469 | 0.00784 | 0.0103 |
| 图像2 (768x768) | output[1] (features) | 1.00001482 | 0.00665 | 0.0370 |
| 图像3 (768x1024) | output[0] (summary) | 0.99997289 | 0.00805 | 0.0117 |
| 图像3 (768x1024) | output[1] (features) | 1.00003422 | 0.00647 | 0.0201 |
结论:✅ 全部指标满足误差 < 1% 的要求。
测试条件:
| Batch Size | 平均延迟 (ms) | P50 (ms) | P95 (ms) | 吞吐量 (img/s) |
|---|---|---|---|---|
| 1 | 99.2 | 100.0 | 105.8 | 10.1 |
| 2 | 99.3 | 98.7 | 105.7 | 20.1 |
| 4 | 200.0 | 200.0 | 211.6 | 20.0 |
| 8 | 400.7 | 400.0 | 408.4 | 20.0 |
分析:
| 分辨率 | 平均延迟 (ms) |
|---|---|
| 224x224 | 35.1 |
| 384x384 | 39.7 |
| 512x512 | 55.6 |
| 768x768 | 99.2 |
| 1024x1024 | 114.7 |
分析:
| 优化方向 | 建议方案 | 预期收益 |
|---|---|---|
| 混合精度 | 使用 --dtype float16 | ~1.5-2x 加速 |
| Batch 策略 | 推荐 BS=2 以平衡延迟和吞吐 | 2x 吞吐 @ 相同延迟 |
| 输入尺寸 | 根据下游任务选择最小可用分辨率 | 线性降低延迟 |
| 算子优化 | 使用 torch_npu 融合算子替换 | 10-30% 性能提升 |
RADIO-L/
├── README.md # 本文档
├── inference.py # NPU 推理脚本
├── accuracy_run.py # NPU vs CPU 精度验证
├── accuracy_run_perf.py # NPU 性能基准测试
├── accuracy_results.json # 精度验证结果
├── perf_results.json # 性能测试结果
├── config.json # 模型配置
├── hf_model.py # HuggingFace 模型封装
├── radio_model.py # RADIO 基础模型
├── eradio_model.py # E-RADIO 模型
├── adaptor_base.py # Adaptor 基类
├── adaptor_generic.py # 通用 Adaptor
├── adaptor_mlp.py # MLP Adaptor
├── adaptor_registry.py # Adaptor 注册
├── open_clip_adaptor.py # OpenCLIP Adaptor
├── cls_token.py # CLS token 处理
├── common.py # 公共工具
├── vit_patch_generator.py # ViT Patch 生成器
├── vitdet.py # ViTDet 支持
├── extra_timm_models.py # 额外 timm 模型注册
├── enable_cpe_support.py # CPE 支持
├── enable_spectral_reparam.py # 频谱重参数化
└── input_conditioner.py # 输入条件化trust_remote_code=True,因为模型使用自定义代码架构PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 以优化内存管理