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

C-RADIOv2-B 在昇腾 NPU 上的部署

本文档记录 C-RADIOv2-B 在 昇腾 NPU 上的适配与验证结果。

C-RADIOv2-B 是 NVIDIA 发布的视觉基础模型(Vision Foundation Model),基于 Vision Transformer,用于提取图像的 summary embedding 与 spatial feature,可应用于图像分类、语义分割、深度估计及多模态 LLM 等下游任务。

  • 原仓库: https://huggingface.co/nvidia/C-RADIOv2-B
  • 镜像仓库: https://ai.gitcode.com/hf_mirrors/nvidia/RADIO-B

1. 验证环境

组件版本
Python3.11.14
torch2.9.0+cpu
torch-npu2.9.0.post1+gitee7ba04
transformers4.50.0
timm1.0.27
Pillow>=9.0
CANN8.5.1
  • NPU: Ascend 910B

2. 权重下载

方式 1: 从 AtomGit 下载(优先)

python3 -m atomgit download hf_mirrors/nvidia/C-RADIOv2-B -d /opt/atomgit/weight/C-RADIOv2-B

方式 2: 从 ModelScope 下载

modelscope download --model nv-community/C-RADIOv2-B --local_dir /opt/atomgit/weight/C-RADIOv2-B

3. 环境依赖安装

pip install torch==2.9.0 transformers timm Pillow

注意:若已安装 torch-npu,请确保 torch 与 torch-npu 版本一致(本文档使用 2.9.0)。

由于本模型使用了 trust_remote_code=True 加载自定义架构,需将模型目录下的 Python 文件复制到 HuggingFace 模块缓存目录,以便 transformers 正确加载:

mkdir -p ~/.cache/huggingface/modules/transformers_modules/C-RADIOv2-B
cp /opt/atomgit/weight/C-RADIOv2-B/*.py ~/.cache/huggingface/modules/transformers_modules/C-RADIOv2-B/

4. 推理验证

4.1 运行推理

python inference.py

4.2 推理脚本

from PIL import Image
from transformers import AutoModel, CLIPImageProcessor

hf_repo = "/opt/atomgit/weight/C-RADIOv2-B"
device = "npu"

image_processor = CLIPImageProcessor.from_pretrained(hf_repo)
model = AutoModel.from_pretrained(hf_repo, trust_remote_code=True)
model.eval().to(device)
print(f"Load model from {hf_repo}, device: {model.device}")

image = Image.open("./assets/demo.png").convert("RGB")
# resize to height=432, width=704
image = image.resize((704, 432))
pixel_values = image_processor(images=image, return_tensors="pt", do_resize=True).pixel_values
pixel_values = pixel_values.to(device)

summary, features = model(pixel_values)
print(f"{summary.shape=}\n{features.shape=}")

4.3 推理输出

Load model from /opt/atomgit/weight/C-RADIOv2-B, device: npu:0
summary.shape=torch.Size([1, 2304])
features.shape=torch.Size([1, 1188, 768])

模型成功在 NPU 上完成推理,输出 summary embedding 维度为 [1, 2304],spatial feature 维度为 [1, 1188, 768]。

5. 性能评测

5.1 运行性能测试

python benchmark.py --batch_size 1 --iterations 100 --warmup 10

5.2 性能脚本

import time
import torch
from PIL import Image
from transformers import AutoModel, CLIPImageProcessor

hf_repo = "/opt/atomgit/weight/C-RADIOv2-B"
device = "npu"

image_processor = CLIPImageProcessor.from_pretrained(hf_repo)
model = AutoModel.from_pretrained(hf_repo, trust_remote_code=True)
model.eval().to(device)

image = Image.open("./assets/demo.png").convert("RGB").resize((704, 432))
pixel_values = image_processor(images=image, return_tensors="pt", do_resize=True).pixel_values.to(device)

# Warmup
for _ in range(10):
    with torch.no_grad():
        _ = model(pixel_values)
torch.npu.synchronize()

# Benchmark
start = time.perf_counter()
for _ in range(100):
    with torch.no_grad():
        _ = model(pixel_values)
torch.npu.synchronize()
end = time.perf_counter()

latency = (end - start) / 100 * 1000
throughput = 100 / (end - start)
print(f"Latency: {latency:.2f} ms")
print(f"Throughput: {throughput:.2f} images/s")

5.3 性能结果

指标数值
Batch size1
Iterations100
Total time0.791 s
Average latency7.910 ms
Throughput126.42 images/s

6. 精度评测

6.1 运行精度测试

python accuracy.py

6.2 精度对比结果

以 CPU (float32) 为基准,对比 NPU (float32) 输出:

指标SummaryFeatures
最大绝对误差1.09e-021.61e-02
平均绝对误差1.98e-032.07e-03
L2 相对误差0.8667%0.7339%
余弦相似度0.9999640.999991

结论: NPU 与 CPU 输出的 L2 相对误差均 < 1%,余弦相似度均 > 0.9999,精度验证 PASS。

7. 交付件清单

  • inference.py — 推理脚本
  • benchmark.py — 性能评测脚本
  • accuracy.py — 精度验证脚本
  • README.md — 适配文档(含 NPU 标签)
  • output/inference_log.txt — 推理运行日志
  • output/benchmark_log.txt — 性能评测日志
  • output/accuracy_log.txt — 精度验证日志
  • assets/demo.png — 测试样例图片

8. 注意事项

  1. 信任远程代码: 本模型依赖 trust_remote_code=True 加载自定义 ViT 架构,加载前需确保 transformers_modules 缓存目录中包含模型仓库的 .py 文件。
  2. 输入分辨率: RADIO 要求输入分辨率必须是 patch size(16)的整数倍,建议使用 get_nearest_supported_resolution 获取合法分辨率。
  3. 无 torch.compile: 本模型未使用 torch.compile,无需设置 TORCH_COMPILE_DISABLE。
  4. NPU 同步: 性能测试时需调用 torch.npu.synchronize() 确保 NPU 计算完成后再计时。
  5. 精度对比: 由于浮点运算顺序差异,NPU 与 CPU 的逐元素相对误差可能因接近零值而失真,建议采用 L2 相对误差 或 余弦相似度 作为精度评估指标。