ResNet-50 是微软研究院何恺明等人提出的深度残差网络(Deep Residual Network)系列中最广泛使用的成员之一。通过引入瓶颈残差模块(Bottleneck Block)和残差连接(skip connection),在保持较高分类精度的同时控制了计算开销。
本仓库验证的模型为 timm/resnet50.a1_in1k,来源于 Hugging Face timm(PyTorch Image Models)模型库,在 ImageNet-1k 数据集上预训练。模型使用 ResNet-50 架构,适用于图像分类任务,支持 1000 类 ImageNet 标准分类。
| 属性 | 值 |
|---|---|
| 模型标识 | timm/resnet50.a1_in1k |
| timm 架构 | resnet50 |
| 参数量 | 25,557,032(25.6M) |
| 输入尺寸 | 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 设备。torch_npu.contrib.transfer_to_npu 用于辅助设备迁移。
import timm
# 直接从 Hugging Face Hub 下载
model = timm.create_model("resnet50.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("resnet50.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 匹配率 | 98.00%(49/50) |
| Top-1 匹配数 | 49 |
| 平均最大相对误差(Logits) | 0.82% |
| 最大相对误差(Logits) | 1.13% |
| 平均概率余弦相似度 | 0.999997 |
| 综合判定 | PASS(Top-1 匹配率 98%,超过 95% 阈值) |
| 样本 | 最大相对误差 | 概率 MSE | 余弦相似度 | CPU Top-1 | NPU Top-1 | 匹配 |
|---|---|---|---|---|---|---|
| 0 | 0.70% | 5.68e-11 | 0.999997 | 892 | 892 | 是 |
| 1 | 0.87% | 1.06e-10 | 0.999996 | 21 | 21 | 是 |
| 2 | 0.71% | 3.15e-11 | 0.999998 | 812 | 812 | 是 |
| 5 | 1.07% | 6.98e-11 | 0.999996 | 812 | 812 | 是 |
| 10 | 1.13% | 1.28e-10 | 0.999993 | 21 | 21 | 是 |
| 14 | 1.02% | 9.46e-11 | 0.999994 | 21 | 21 | 是 |
| 27 | 0.86% | 4.50e-11 | 0.999996 | 892 | 111 | 否 |
| 28 | 0.65% | 2.52e-11 | 0.999999 | 21 | 21 | 是 |
| 30 | 0.70% | 9.40e-11 | 0.999997 | 21 | 21 | 是 |
| 40 | 0.50% | 2.76e-11 | 0.999999 | 21 | 21 | 是 |
| 49 | 0.67% | 3.90e-11 | 0.999998 | 21 | 21 | 是 |
样本 27 出现了 Top-1 预测不一致(CPU 预测类别 892,NPU 预测类别 111):
| 项目 | 值 |
|---|---|
| 样本编号 | 27 |
| CPU Top-1 类别 | 892 |
| NPU Top-1 类别 | 111 |
| Logits 最大差异 | 未记录 |
| 最大相对误差 | 0.86% |
| 概率 MSE | 4.50e-11 |
| 概率余弦相似度 | 0.999996 |
该样本相对误差为 0.86%,低于 1%,且概率余弦相似度高达 0.999996,表明 NPU 与 CPU 的输出概率分布几乎一致。Top-1 不一致发生在概率非常接近的类别之间,属于数值精度边界情况。整体匹配率 98% 超过 95% 验收阈值,综合判定为 PASS。
| 对比项 | ResNet-18(11.7M) | ResNet-50(25.6M) |
|---|---|---|
| Top-1 匹配率 | 100% | 98% |
| 平均相对误差 | 0.04% | 0.82% |
| 最大相对误差 | 0.07% | 1.13% |
| 平均余弦相似度 | 1.000000 | 0.999997 |
ResNet-50 的数值误差整体大于 ResNet-18,与模型参数量更多、计算图更深更复杂有关,属于预期行为。
torch.npu.synchronize() 确保精确计时| 指标 | 数值 |
|---|---|
| 平均延迟(Avg Latency) | 11.16 ms |
| 最小延迟(Min Latency) | 10.36 ms |
| 最大延迟(Max Latency) | 12.76 ms |
| P50 延迟(中位数) | 10.82 ms |
| P90 延迟 | 12.00 ms |
| 吞吐量(Throughput) | 89.62 img/s |
| 参数量 | 25.6M |
与 ResNet-18 相比,ResNet-50 的延迟分布呈现双峰特征:
| 阶段 | 迭代范围 | 延迟范围 | 说明 |
|---|---|---|---|
| 预热后阶段 | 1-10 | 10.36-10.52 ms | 最低延迟区间,NPU pipeline 完全预热 |
| 平稳变化期 | 11-18 | 10.57-10.97 ms | 延迟小幅上升 |
| 稳定高延迟期 | 19-63 | 11.86-12.76 ms | 主要推理区间,P90 在此范围内 |
| 回落阶段 | 64-100 | 10.40-11.01 ms | 延迟回落至接近初始水平 |
延迟波动范围约 2.4 ms(10.36 - 12.76 ms),相比 ResNet-18 的 0.29 ms 波动幅度显著增大,可能与以下因素相关:
| 百分位 | 延迟(ms) |
|---|---|
| P50(中位数) | 10.82 |
| P75 | 约 11.95 |
| P90 | 12.00 |
| P95 | 约 12.05 |
| P99 | 约 12.29 |
| 最大值 | 12.76 |
推理过程中,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 |
| ConvToFullyConnectionFusionPass | 0 | 1 |
| CubeTransFixpipeFusionPass | 0 | 1 |
与 ResNet-18 相比,算子融合 Pass 类型一致,但 ResNet-50 的计算图更大,融合效果对性能的影响更显著。
| 对比项 | ResNet-18 | ResNet-50 | 倍数 |
|---|---|---|---|
| 参数量 | 11.7M | 25.6M | 2.19x |
| 平均延迟 | 4.41 ms | 11.16 ms | 2.53x |
| 吞吐量 | 226.81 img/s | 89.62 img/s | 0.40x |
| P50 延迟 | 4.40 ms | 10.82 ms | 2.46x |
| P90 延迟 | 4.51 ms | 12.00 ms | 2.66x |
ResNet-50 的参数量约为 ResNet-18 的 2.19 倍,推理延迟约为 2.53 倍,延迟增长与参数量增长基本呈线性关系,说明 NPU 对两种模型的计算资源利用效率相当。
resnet50.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-50 预训练权重| 文件 | 功能 |
|---|---|
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 版本严格匹配,建议使用配套发布的版本组合(如本环境中的 torch 2.9.0 + torch_npu 2.9.0.post1)。timm/resnet50.a1_in1k,由 Ross Wightman 在 ImageNet-1k 上训练并贡献至 timm 模型库。ResNet-50 在 ImageNet-1k 验证集上的预期 Top-1 准确率约为 76.1%。perf_benchmark.py 中的 BATCH_SIZE 参数,预期可进一步提升吞吐量。image-classification resnet resnet50 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 上推理成功。