test_convnext.r160_in1k 是一个轻量级的 ConvNeXt 图像分类模型,参数量仅 0.3M,输入尺寸为 160x160。该模型主要用于 ConvNeXt 架构的测试和验证,在 ImageNet-1k 数据集上训练。
本仓库提供了该模型在 华为昇腾 NPU (Ascend910) 上的适配代码和推理结果。
| 属性 | 值 |
|---|---|
| 模型名称 | test_convnext.r160_in1k |
| 原始模型地址 | ModelScope |
| 任务类型 | 图像分类 (Image Classification) |
| 模型架构 | ConvNeXt |
| 框架 | PyTorch + timm |
| 输入格式 | RGB 图像,160×160 |
| 输出格式 | 1000 类 ImageNet 分类 logits |
| 参数量 | 0.3M |
| 数据集 | ImageNet-1k |
| 组件 | 版本 |
|---|---|
| Python | 3.11.x |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| timm | 1.0.27 |
| modelscope | 1.35.3 |
| CANN | 8.5.1 |
| NPU | Ascend910 (64GB) |
该模型为标准 timm ConvNeXt 图像分类模型,无需修改模型代码即可直接运行在昇腾 NPU 上。适配过程主要包括:
pip install -r requirements.txt模型已通过 ModelScope 自动下载到本地目录。
python3 inference.py该脚本会自动完成 CPU 和 NPU 推理,输出 Top-5 分类结果和推理耗时。
python3 compare_cpu_npu.py该脚本对比 CPU 和 NPU 的推理结果,包括 logits 差异、概率差异、Top-5 一致性和余弦相似度。
使用测试图片 test/test_owl.jpg 进行推理:
| 排名 | CPU 类别索引 | CPU 概率 | NPU 类别索引 | NPU 概率 | 匹配 |
|---|---|---|---|---|---|
| 1 | 24 | 59.59% | 24 | 59.62% | ✓ |
| 2 | 63 | 4.94% | 63 | 4.94% | ✓ |
| 3 | 82 | 2.46% | 82 | 2.46% | ✓ |
| 4 | 43 | 2.35% | 43 | 2.34% | ✓ |
| 5 | 42 | 1.99% | 42 | 1.99% | ✓ |
| 设备 | 耗时 (ms/sample) | 加速比 |
|---|---|---|
| CPU | 7.37 | 1.00x |
| NPU | 2.70 | 2.73x |
| 指标 | 值 |
|---|---|
| Logits 最大绝对差异 | 0.00319815 |
| Logits 平均绝对差异 | 0.00063203 |
| 概率最大差异 | 0.039% |
| 概率平均差异 | 0.000% |
| Top-5 一致率 | 100% (5/5) |
| 余弦相似度 (logits) | 99.999984% |
| 显著 logits 最大相对误差 | 0.081% |
| 显著 logits 平均相对误差 | 0.021% |
NPU 与 CPU 推理误差 < 1%,精度验证通过。

import timm
import torch
from PIL import Image
# 加载模型
model = timm.create_model('test_convnext.r160_in1k', pretrained=True)
model = model.eval()
# 数据预处理
data_config = timm.data.resolve_model_data_config(model)
transforms = timm.data.create_transform(**data_config, is_training=False)
# 加载图片并推理
img = Image.open('test.jpg').convert('RGB')
input_tensor = transforms(img).unsqueeze(0)
# CPU 推理
with torch.no_grad():
output = model(input_tensor)
# NPU 推理
if hasattr(torch, 'npu') and torch.npu.is_available():
model_npu = model.to('npu')
input_npu = input_tensor.to('npu')
with torch.no_grad():
output_npu = model_npu(input_npu)Apache-2.0