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 |
| 组件 | 规格 |
|---|---|
| NPU 设备 | Ascend 910B4 |
| CPU 架构 | ARM(aarch64) |
| 操作系统 | Linux(HCE 2.0) |
| 软件 | 版本 |
|---|---|
| CANN | 8.5.1 |
| Python | 3.11.14 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| timm | 最新版本(latest) |
| NumPy | 最新兼容版本 |
NPU 设备可用性通过 torch.npu.is_available() 确认,运行模式下所有张量和模型均通过 .to("npu") 显式迁移至 Ascend NPU 设备。
import timm
# 直接从 Hugging Face Hub 下载
model = timm.create_model("resnet18.a1_in1k", pretrained=True)
model.eval()pip install timm torch torch_npu pillow requests numpy使用本仓库提供的推理脚本 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 预测类别及其置信度,以及单次推理延迟。
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)精度验证采用 CPU vs NPU 数值一致性对比 策略:
| 指标 | 结果 |
|---|---|
| 测试样本数 | 50 |
| Top-1 匹配率 | 100.00%(50/50) |
| Top-1 匹配数 | 50 |
| 平均最大相对误差(Logits) | 0.04% |
| 最大相对误差(Logits) | 0.07% |
| 平均概率余弦相似度 | 1.000000 |
| 综合判定 | PASS |
| 样本 | Logits 最大差异 | 最大相对误差 | 概率 MSE | 余弦相似度 | CPU Top-1 | NPU Top-1 | 匹配 |
|---|---|---|---|---|---|---|---|
| 0 | 0.002867 | 0.04% | 5.56e-12 | 1.000000 | 21 | 21 | 是 |
| 1 | 0.001824 | 0.04% | 2.17e-12 | 1.000000 | 21 | 21 | 是 |
| 2 | 0.001547 | 0.02% | 1.03e-12 | 1.000000 | 701 | 701 | 是 |
| 3 | 0.001856 | 0.03% | 1.51e-12 | 1.000000 | 21 | 21 | 是 |
| 4 | 0.002831 | 0.06% | 5.99e-12 | 0.999999 | 21 | 21 | 是 |
| 5 | 0.002299 | 0.05% | 2.82e-12 | 1.000000 | 21 | 21 | 是 |
| 10 | 0.001849 | 0.04% | 1.95e-12 | 1.000000 | 21 | 21 | 是 |
| 20 | 0.001630 | 0.03% | 1.71e-12 | 1.000000 | 21 | 21 | 是 |
| 30 | 0.003099 | 0.07% | 9.36e-12 | 0.999999 | 21 | 21 | 是 |
| 40 | 0.002423 | 0.05% | 2.80e-12 | 1.000000 | 21 | 21 | 是 |
| 49 | 0.002325 | 0.03% | 3.07e-12 | 1.000000 | 701 | 701 | 是 |
注:所有 50 个样本的 Top-1 预测完全一致,NPU 推理结果与 CPU 高度吻合,最大相对误差仅 0.07%,平均余弦相似度达到 1.0,证明 NPU 推理精度与 CPU 基准无差异。
torch.npu.synchronize() 确保精确计时| 指标 | 数值 |
|---|---|
| 平均延迟(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 |
延迟数据分布表现出优秀的稳定性:
| 百分位 | 延迟(ms) |
|---|---|
| P50(中位数) | 4.40 |
| P75 | 约 4.45 |
| P90 | 4.51 |
| P95 | 约 4.55 |
| P99 | 约 4.58 |
| 最大值 | 4.59 |
推理过程中,Ascend CANN 编译器自动应用了算子融合优化(fusion_result.json),主要融合算子包括:
| 融合 Pass | 生效次数 | 匹配次数 |
|---|---|---|
| ARefreshCubeC0FusionPass | 1 | 1 |
| FixPipeAbilityProcessPass | 1 | 1 |
| TransdataCastFusionPass | 0 | 3 |
| TransdataFz2FzgFusionPass | 0 | 3 |
| TransdataFzg2FzFusionPass | 0 | 3 |
| Conv2DFixPipeToExtendConv2DFusionPass | 0 | 1 |
| ConvWeightCompressFusionPass | 0 | 1 |
这些融合 Pass 由 CANN 编译器在构图阶段自动匹配并应用,有效减少了算子启动开销和数据搬运次数,对提升推理性能有积极作用。
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.py | NPU vs CPU 精度对比,生成 50 样本详细报告 |
perf_benchmark.py | 性能基准,测量 100 次推理的延迟分布与吞吐量 |
accuracy_report.json | 精度验证详细数据,包含每样本的 logits 差异和预测匹配 |
perf_report.json | 性能基准详细数据,包含 100 次迭代的原始延迟 |
fusion_result.json | CANN 图融合 Pass 执行日志 |
torch_npu 版本必须与 PyTorch 版本严格匹配,建议使用配套发布的版本组合。timm/resnet18.a1_in1k,由 Ross Wightman 在 ImageNet-1k 上训练并贡献至 timm 模型库。perf_benchmark.py 中的 BATCH_SIZE 参数。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 上推理成功。