Delicate02/RADIO-L
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

RADIO-L on Ascend NPU

1. 简介

本文档记录 NVIDIA RADIO-L(AM-RADIO: Reduce All Domains Into One)视觉基础模型在 华为昇腾 Ascend910 NPU 上的适配、推理、精度验证与性能基准测试结果。

RADIO-L 是一个大规模视觉基础模型,通过多教师蒸馏(CLIP、SigLIP、DINOv2、SAM)融合多种视觉表征能力,输出全局特征向量(summary)和密集空间特征(spatial_features),适用于图像分类、分割、检测等下游任务。

相关资源:

  • 模型权重(HuggingFace):https://huggingface.co/nvidia/RADIO-L
  • 模型代码(GitCode 镜像):https://gitcode.com/hf_mirrors/nvidia/RADIO-L
  • 原始论文:AM-RADIO: Agglomerative Vision Foundation Model Reduce All Domains Into One (CVPR 2024)

2. 验证环境

组件版本
CPUaarch64
NPUAscend910_9362 (2 逻辑卡,64GB HBM/卡)
OSLinux 5.10.0 (aarch64)
Python3.11.14
torch2.9.0
torch_npu2.9.0.post1+gitee7ba04
transformers4.40.1
open_clip_torch3.3.0
timm最新版

3. 模型适配

3.1 权重获取

# 方式一:从 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 参数)

3.2 依赖安装

pip install torch torch_npu transformers timm open_clip_torch pillow numpy

3.3 适配要点

RADIO-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") 将模型迁移至 NPU
  • 支持的精度模式:float32、float16

4. 推理验证

4.1 基础推理

# float32 精度推理
python3 inference.py --dtype float32

# float16 精度推理(可提升性能)
python3 inference.py --dtype float16

# 指定输入图像
python3 inference.py --image /path/to/image.jpg

4.2 推理输出

模型输出包含两个部分:

输出形状说明
summary[1, 3072]全局图像特征向量,类似于 ViT 的 CLS token
spatial_features[1, 2304, 1024]密集空间特征,适用于分割、检测等稠密任务

4.3 推理示例(Python)

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)

5. 精度验证

NPU vs CPU 对比验证:使用 3 张不同分辨率的随机图像,计算余弦相似度和相对误差。

5.1 运行命令

python3 accuracy_run.py

5.2 精度结果

指标值
最小余弦相似度0.99997289
平均余弦相似度0.99999778
最大相对误差0.00805 (0.8%)
最大绝对误差0.0370

5.3 逐项对比

图像输出余弦相似度相对误差最大绝对误差
图像1 (768x768)output[0] (summary)0.999973840.007930.0115
图像1 (768x768)output[1] (features)1.000016220.006440.0224
图像2 (768x768)output[0] (summary)0.999974690.007840.0103
图像2 (768x768)output[1] (features)1.000014820.006650.0370
图像3 (768x1024)output[0] (summary)0.999972890.008050.0117
图像3 (768x1024)output[1] (features)1.000034220.006470.0201

结论:✅ 全部指标满足误差 < 1% 的要求。

6. 性能基准

测试条件:

  • 设备:Ascend910_9362
  • 精度:float32
  • Warmup:3 次迭代
  • 有效测试:20 次迭代
  • 输入分辨率:768x768(首选分辨率)

6.1 Batch Size 伸缩性 (768x768)

Batch Size平均延迟 (ms)P50 (ms)P95 (ms)吞吐量 (img/s)
199.2100.0105.810.1
299.398.7105.720.1
4200.0200.0211.620.0
8400.7400.0408.420.0

分析:

  • BS=1 vs BS=2 延迟几乎相同(99ms),说明 NPU 计算资源未完全利用,batch=2 时吞吐量翻倍
  • BS>=4 延迟线性增长,单卡算力趋于饱和,最佳效率点在 BS=2

6.2 分辨率影响 (batch=1)

分辨率平均延迟 (ms)
224x22435.1
384x38439.7
512x51255.6
768x76899.2
1024x1024114.7

分析:

  • 低分辨率(224-384)延迟接近,主要是模型计算为主
  • 分辨率超过 512 后延迟随 token 数线性增长
  • 1024x1024 相比 768x768 仅增加 16% 延迟,但 token 数增加 78%,说明高分辨率下计算更密集

6.3 性能优化建议

优化方向建议方案预期收益
混合精度使用 --dtype float16~1.5-2x 加速
Batch 策略推荐 BS=2 以平衡延迟和吞吐2x 吞吐 @ 相同延迟
输入尺寸根据下游任务选择最小可用分辨率线性降低延迟
算子优化使用 torch_npu 融合算子替换10-30% 性能提升

7. 代码结构

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        # 输入条件化

8. 注意事项

  1. 首次加载较慢:模型首次加载时需要编译和初始化,后续推理速度正常(CPU 推理首次需 ~120s,NPU 首次需 ~500ms+ warmup 时间)
  2. trust_remote_code:必须设置 trust_remote_code=True,因为模型使用自定义代码架构
  3. CLIPImageProcessor:预处理使用 CLIP 兼容的处理器,默认 resize 到 768x768(模型首选分辨率)
  4. 内存占用:float32 下模型约占用 1.2GB 显存,加上中间激活值不超过 4GB(768x768 输入)
  5. NPU 内存分配:建议设置环境变量 PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 以优化内存管理

9. 参考

  • AM-RADIO 论文
  • NVIDIA RADIO GitHub
  • 华为昇腾社区
  • torch_npu 文档