模型: C-RADIOv2-G (NVIDIA RADIO 视觉基础模型,~1.6B 参数)
硬件: Huawei Ascend NPU (Atlas 800 A2)
状态: ✅ 已适配,精度验证通过
本文档记录 C-RADIOv2-G 在华为昇腾 NPU 上的推理适配与精度验证结果。
C-RADIOv2-G 是基于 ViT-bigG (patch14, embed_dim=1664, depth=48) 的视觉基础模型,可输出图像级别的 summary 特征与空间级别的 spatial 特征,适用于图像分类、语义分割、深度估计及多模态 LLM 的视觉编码器等下游任务。
相关获取地址:
| 组件 | 版本 |
|---|---|
CANN | 8.5.1 |
PyTorch | 2.9.0+cpu |
torch_npu | 2.9.0.post1+gitee7ba04 |
transformers | 4.51.2 |
timm | >=0.9.0 |
safetensors | >=0.4.0 |
Ascend910_9362 (2 逻辑卡)Linux 5.10.0 (aarch64)float32pip install -r requirements.txt从 ModelScope 或 HuggingFace 镜像下载:
# ModelScope
modelscope download --model nv-community/C-RADIOv2-G --local_dir ./model_cache/nv-community/C-RADIOv2-G
# 或 HuggingFace 镜像
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download nv-community/C-RADIOv2-G --local-dir ./model_cache/nv-community/C-RADIOv2-G权重共约 7GB,请确保磁盘空间充足。
python3 inference.py预期输出:
============================================================
C-RADIOv2-G 昇腾 NPU 推理
============================================================
PyTorch: 2.9.0+cpu
torch_npu: 2.9.0.post1+gitee7ba04
NPU 数量: 2
使用设备: npu:0
模型目录: /opt/atomgit/model_cache/nv-community/C-RADIOv2-G
Backbone: vit_bigG_patch14_224
状态: 创建模型...
No pretrained configuration specified for vit_bigG_patch14 model. Using a default. Please add a config to the model pretrained_cfg registry or pass explicitly.
状态: 加载 safetensors 权重...
[INFO] model-00001-of-00002.safetensors
[INFO] model-00002-of-00002.safetensors
[INFO] 已加载 678 个张量
[INFO] pos_embed 插值: (1, 16384, 1664) -> (1, 21316, 1664)
[INFO] cls_token 适配: (9, 1664) -> (8, 1664)
状态: 切换到推理模式...
总参数: 1632.5M
设备: npu:0
输入形状: (1, 3, 224, 224)
状态: 预热推理 (3 iter)...
摘要特征: (1, 3328)
空间特征: (1, 1664, 16, 16) (NCHW 格式)
============================================================
✓ C-RADIOv2-G 已在昇腾 NPU 上成功运行!
============================================================inference.py 的执行流程:
AutoConfig.from_pretrained() 加载模型配置vit_bigG_patch14_224 (embed_dim=1664, patch_size=14),脚本自动将配置中的 vit_giant_patch16_224 修正为匹配的 backboneAutoModel.from_config() 构建 RADIOModel 实例load_state_dict 中 LayerScale._load_from_state_dict 的 KeyError bug)pos_embed 进行形状插值,裁剪 cls_token 以匹配配置中的 patch 数model.switch_to_deploy() 切换到推理模式,移至 NPU| 问题 | 解决方案 |
|---|---|
LayerScale._load_from_state_dict 抛出 KeyError | 绕过 load_state_dict,改用逐参数 .data.copy_() 赋值 |
pos_embed 形状不匹配 | 使用 patch_generator._load_embed() 插值对齐 |
cls_token 形状不匹配 | 按配置中的 num_register_tokens + 1 裁剪或补齐 |
| 配置 backbone 与权重不匹配 | 自动修正 config.args.model 为 vit_bigG_patch14_224,config.patch_size 为 14 |
项目提供了自动化精度验证脚本 verify_accuracy.py,对比 CPU 和 NPU 的推理结果,计算误差指标。
python3 verify_accuracy.pyeval_logs/ 目录| 指标 | 通过阈值 |
|---|---|
| 余弦相似度 | > 0.9999 |
| 相对 L2 误差 | < 0.01(参考) |
| 项 | 值 |
|---|---|
| PyTorch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1+gitee7ba04 |
| NPU | Ascend910_9362 |
| 数据类型 | float32 |
| 输入 | 1 × 3 × 224 × 224 / 378 × 378 / 448 × 448 |
| 指标 | Summary 特征 | Spatial 特征 | 判定 |
|---|---|---|---|
| 余弦相似度 | 0.9999958810 | 0.9999998204 | ✓ |
| MSE | 2.51e-08 | 1.90e-08 | ✓ |
| MAE | 1.07e-04 | 9.67e-05 | ✓ |
| 最大绝对误差 | 2.89e-03 | 3.08e-03 | ✓ |
| 相对 L2 误差 | 2.86e-03 | 1.25e-04 | ✓ |
| 指标 | Summary 特征 | Spatial 特征 | 判定 |
|---|---|---|---|
| 余弦相似度 | 0.9999958891 | 1.0000000824 | ✓ |
| MSE | 2.79e-08 | 1.86e-08 | ✓ |
| MAE | 1.13e-04 | 9.50e-05 | ✓ |
| 最大绝对误差 | 2.85e-03 | 3.30e-03 | ✓ |
| 相对 L2 误差 | 2.89e-03 | 1.22e-04 | ✓ |
| 指标 | Summary 特征 | Spatial 特征 | 判定 |
|---|---|---|---|
| 余弦相似度 | 0.9999959039 | 1.0000003478 | ✓ |
| MSE | 2.80e-08 | 1.84e-08 | ✓ |
| MAE | 1.13e-04 | 9.46e-05 | ✓ |
| 最大绝对误差 | 2.90e-03 | 3.20e-03 | ✓ |
| 相对 L2 误差 | 2.86e-03 | 1.21e-04 | ✓ |
| 分辨率 | CPU 耗时 | NPU 耗时 | 加速比 |
|---|---|---|---|
| 224×224 | 27.22 s | 30.68 ms | 887.2× |
| 378×378 | 53.89 s | 67.58 ms | 797.4× |
| 448×448 | 80.39 s | 139.29 ms | 577.2× |
✓ 精度验证通过。 所有测试分辨率下 Summary 和 Spatial 特征的余弦相似度均 > 0.99999,相对误差远低于 1% 阈值,NPU 推理相对 CPU 加速约 577~887 倍。
经公开网络检索,目前 未检索到 C-RADIOv2-G 在 GPU 平台上与 CPU 的直接 embedding 精度对比数据(如余弦相似度、MSE、相对 L2 误差等逐层/逐输出量化指标)。
公开资料中可获取的信息包括:
因此,本 README 中暂无法提供与 GPU 的直接精度对比数据。 如需 GPU 基线,建议在相同输入与相同 FP32 数据类型下,使用 NVIDIA A100/H100 运行 verify_accuracy.py 的 GPU 版本进行补充验证。
C-RADIOv2-G-npu/
├── inference.py # 昇腾 NPU 推理脚本(主入口)
├── verify_accuracy.py # CPU vs NPU 精度验证脚本
├── README.md # 部署文档(本文档)
├── requirements.txt # Python 依赖
├── .gitignore # Git 忽略规则
└── eval_logs/ # 验证结果输出目录
├── report_*.json # JSON 格式验证报告
└── eval_*.log # 详细日志当前 CANN 8.5.1 的 aclnnLayerNorm 算子在某些场景下对 BF16 权重与 FP32 输入的混合精度支持存在限制,可能报错:
Expected both tensors to have same dtype, but found weightOptional DT_BFLOAT16 and input DT_FLOAT建议:当前版本优先使用 FP32 推理,或确保模型与输入统一为同一数据类型(均为 BF16 或均为 FP32)。
trust_remote_code=True若出现显存不足:
torch.bfloat16 减小显存占用(需验证精度)del model 并调用 torch.npu.empty_cache()本项目基于原始模型 nvidia/C-RADIOv2-g 的 License 进行分发,仅包含昇腾适配代码和部署文档。