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

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

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

C-RADIOv2-L 是 NVIDIA 发布的视觉基础模型(Vision Foundation Model),基于视觉Transformer(Vision Transformer)构建,参数量约为 32000 万,用于提取图像的摘要嵌入(summary embedding)和空间特征(spatial feature),可应用于图像分类、语义分割、深度估计及多模态大语言模型(LLM)等下游任务。

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

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:昇腾 910B

2. 权重下载

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

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

方式 2: 从 ModelScope 下载

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

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-L
cp /opt/atomgit/weight/C-RADIOv2-L/*.py ~/.cache/huggingface/modules/transformers_modules/C-RADIOv2-L/

4. 推理验证

4.1 运行推理

python inference.py

4.2 推理脚本

from PIL import Image
from transformers import AutoModel, CLIPImageProcessor

hf_repo = "/opt/atomgit/weight/C-RADIOv2-L"
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-L, device: npu:0
summary.shape=torch.Size([1, 3072])
features.shape=torch.Size([1, 1188, 1024])

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

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-L"
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 time2.213 s
Average latency22.126 ms
Throughput45.20 images/s

6. 精度评测

6.1 运行精度测试

python accuracy.py

6.2 精度对比结果

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

指标SummaryFeatures
最大绝对误差1.06e-021.06e-01
平均绝对误差1.55e-032.29e-03
L2 相对误差0.6577%0.6457%
余弦相似度0.9999791.000006

结论: 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 相对误差 或 余弦相似度 作为精度评估指标。