g
gcw_C8PI9e90/resnet18.a1_in1k-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

ResNet-18 (timm/resnet18.a1_in1k) Ascend NPU 适配验证报告

1. 模型简介

ResNet-18 是微软研究院何恺明等人提出的深度残差网络(Deep Residual Network)系列中最轻量的成员。通过引入残差连接(skip connection),有效解决了深层网络训练中的退化问题。

本仓库验证的模型为 timm/resnet18.a1_in1k,来源于 Hugging Face timm(PyTorch Image Models)模型库,在 ImageNet-1k 数据集上预训练。模型使用 ResNet-18 架构,适用于图像分类任务,支持 1000 类 ImageNet 标准分类。

属性值
模型标识timm/resnet18.a1_in1k
timm 架构resnet18
参数量11,689,512(11.7M)
输入尺寸3 x 224 x 224
输出类别1000(ImageNet-1k)
预训练数据ImageNet-1k
框架PyTorch / timm

2. 环境配置

硬件环境

组件规格
NPU 设备Ascend 910B4
CPU 架构ARM(aarch64)
操作系统Linux(HCE 2.0)

软件环境

软件版本
CANN8.5.1
Python3.11.14
PyTorch2.9.0
torch_npu2.9.0.post1
timm最新版本(latest)
NumPy最新兼容版本

环境检查

NPU 设备可用性通过 torch.npu.is_available() 确认,运行模式下所有张量和模型均通过 .to("npu") 显式迁移至 Ascend NPU 设备。

3. 快速开始

3.1 下载模型

import timm

# 直接从 Hugging Face Hub 下载
model = timm.create_model("resnet18.a1_in1k", pretrained=True)
model.eval()

3.2 安装依赖

pip install timm torch torch_npu pillow requests numpy

3.3 运行推理

使用本仓库提供的推理脚本 inference.py:

# 下载模型权重后,指定模型路径和图片进行推理
python inference.py --model_path ./model --image https://example.com/sample.jpg

# 使用本地图片
python inference.py --model_path ./model --image ./test_image.jpg --top_k 5

推理脚本会自动检测 NPU 设备可用性,优先使用 NPU 进行加速推理。输出内容包括 Top-5 预测类别及其置信度,以及单次推理延迟。

3.4 核心推理代码

import torch
import timm
from timm.data import create_transform, resolve_data_config
from PIL import Image

# 设备初始化(自动选择 NPU)
device = torch.device("npu" if torch.npu.is_available() else "cpu")

# 加载模型
model = timm.create_model("resnet18.a1_in1k", pretrained=True).to(device)
model.eval()

# 数据预处理
data_config = resolve_data_config(model=model)
transform = create_transform(**data_config)

# 加载并预处理图像
image = Image.open("test.jpg").convert("RGB")
input_tensor = transform(image).unsqueeze(0).to(device)

# 推理
with torch.no_grad():
    output = model(input_tensor)
    if device.type == "npu":
        torch.npu.synchronize()

# 后处理
probs = torch.nn.functional.softmax(output, dim=-1)
top_probs, top_indices = torch.topk(probs, 5, dim=-1)

4. 精度验证结果

4.1 验证方法

精度验证采用 CPU vs NPU 数值一致性对比 策略:

  • 使用相同的随机种子生成 50 张合成测试图像(3 x 224 x 224)
  • 分别在 CPU(FP32)和 NPU(FP32)上运行推理
  • 对比输出 logits 和 softmax 概率的数值差异
  • 衡量指标:Top-1 预测匹配率、最大相对误差、概率余弦相似度

4.2 总体结果

指标结果
测试样本数50
Top-1 匹配率100.00%(50/50)
Top-1 匹配数50
平均最大相对误差(Logits)0.04%
最大相对误差(Logits)0.07%
平均概率余弦相似度1.000000
综合判定PASS

4.3 逐样本精度详情

样本Logits 最大差异最大相对误差概率 MSE余弦相似度CPU Top-1NPU Top-1匹配
00.0028670.04%5.56e-121.0000002121是
10.0018240.04%2.17e-121.0000002121是
20.0015470.02%1.03e-121.000000701701是
30.0018560.03%1.51e-121.0000002121是
40.0028310.06%5.99e-120.9999992121是
50.0022990.05%2.82e-121.0000002121是
100.0018490.04%1.95e-121.0000002121是
200.0016300.03%1.71e-121.0000002121是
300.0030990.07%9.36e-120.9999992121是
400.0024230.05%2.80e-121.0000002121是
490.0023250.03%3.07e-121.000000701701是

注:所有 50 个样本的 Top-1 预测完全一致,NPU 推理结果与 CPU 高度吻合,最大相对误差仅 0.07%,平均余弦相似度达到 1.0,证明 NPU 推理精度与 CPU 基准无差异。

5. 性能基准测试

5.1 测试方法

  • 批次大小:1(单张图片)
  • 迭代次数:100 次推理(含 10 次预热)
  • 预热:10 次推理用于模型预热,不计入统计
  • 同步:每次推理后调用 torch.npu.synchronize() 确保精确计时
  • 输入:随机生成的 224x224 RGB 图像
  • 数据类型:FP32

5.2 整体性能指标

指标数值
平均延迟(Avg Latency)4.41 ms
最小延迟(Min Latency)4.30 ms
最大延迟(Max Latency)4.59 ms
P50 延迟(中位数)4.40 ms
P90 延迟4.51 ms
吞吐量(Throughput)226.81 img/s
参数量11.7M

5.3 延迟分布

延迟数据分布表现出优秀的稳定性:

  • 延迟范围:4.30 ms ~ 4.59 ms(波动幅度仅 0.29 ms)
  • P50/P90 差异:0.11 ms,表明绝大多数推理请求延迟集中在 4.4 ms 附近
  • 延迟标准差:约 0.06 ms,波动极小
  • 推理过程中无异常长尾延迟,性能表现极为稳定

5.4 性能汇总

百分位延迟(ms)
P50(中位数)4.40
P75约 4.45
P904.51
P95约 4.55
P99约 4.58
最大值4.59

5.5 算子融合优化

推理过程中,Ascend CANN 编译器自动应用了算子融合优化(fusion_result.json),主要融合算子包括:

融合 Pass生效次数匹配次数
ARefreshCubeC0FusionPass11
FixPipeAbilityProcessPass11
TransdataCastFusionPass03
TransdataFz2FzgFusionPass03
TransdataFzg2FzFusionPass03
Conv2DFixPipeToExtendConv2DFusionPass01
ConvWeightCompressFusionPass01

这些融合 Pass 由 CANN 编译器在构图阶段自动匹配并应用,有效减少了算子启动开销和数据搬运次数,对提升推理性能有积极作用。

6. 项目结构

resnet18.a1_in1k-npu/
├── readme.md                 # 本文件 - 模型适配验证报告
├── inference.py              # 推理脚本(支持图片 URL 和本地文件)
├── accuracy_eval.py          # 精度验证脚本(CPU vs NPU 一致性对比)
├── perf_benchmark.py         # 性能基准测试脚本(延迟/吞吐量)
├── accuracy_report.json      # 精度验证结果报告(JSON 格式,50 样本详情)
├── perf_report.json          # 性能基准测试报告(JSON 格式,100 次迭代详情)
├── fusion_result.json        # CANN 算子融合日志
└── model/                    # 模型权重目录(需手动下载)
    └── pytorch_model.bin     # ResNet-18 预训练权重

脚本说明

文件功能
inference.py单图推理,支持 URL 和本地图片,输出 Top-K 分类结果与延迟
accuracy_eval.pyNPU vs CPU 精度对比,生成 50 样本详细报告
perf_benchmark.py性能基准,测量 100 次推理的延迟分布与吞吐量
accuracy_report.json精度验证详细数据,包含每样本的 logits 差异和预测匹配
perf_report.json性能基准详细数据,包含 100 次迭代的原始延迟
fusion_result.jsonCANN 图融合 Pass 执行日志

7. 注意事项

  1. NPU 设备要求:本验证在 Ascend 910B4 NPU 上完成,CANN 版本 8.5.1。其他 NPU 型号或 CANN 版本可能需调整配置。
  2. 环境依赖冲突:torch_npu 版本必须与 PyTorch 版本严格匹配,建议使用配套发布的版本组合。
  3. 首次推理延迟:首次推理包含模型编译和构图开销(约数十秒),后续推理为正常延迟。基准测试已包含预热机制。
  4. 精度验证说明:当前验证采用合成数据,用于验证 NPU 与 CPU 的数值一致性。实际下游任务的 Top-1 准确率(如 ImageNet 验证集上的 69.8%)需使用真实数据集评估。
  5. 模型来源:模型来自 Hugging Face timm/resnet18.a1_in1k,由 Ross Wightman 在 ImageNet-1k 上训练并贡献至 timm 模型库。
  6. 批量推理:当前基准测试使用 batch_size=1。如需批量推理优化吞吐量,可调整 perf_benchmark.py 中的 BATCH_SIZE 参数。

8. 标签

image-classification resnet resnet18 timm ascend npu ascend-910b4 huawei pytorch imagenet cann-8.5.1 torch-npu

精度结论

基于现有评测数据,CPU 与 NPU 的 余弦相似度 精度误差为 0.0%,小于 1% 的精度要求。

推理成功证据

本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:

# NPU 推理
python3 inference.py --device npu

# CPU 推理
python3 inference.py --device cpu

推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。