本文档记录 timm/eca_resnext26ts.ch_in1k 在华为昇腾 Ascend 910B NPU 上的适配、推理与精度测试。
| 组件 | 版本 |
|---|---|
| CANN | 8.5.1 |
| torch | 2.9.0 |
| torch_npu | 2.9.0 |
| timm | 1.0.27 |
| torchvision | 0.24.0 |
| modelscope | 1.35.3 |
# 使用清华 PyPI 镜像安装依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torch_npu timm torchvision pillow numpy modelscope确保 CANN 和 torch_npu 已正确安装,NPU 设备可用:
python3 -c "import torch; print('NPU:', torch.npu.is_available(), 'Device:', torch.npu.get_device_name(0))"from modelscope.hub.snapshot_download import snapshot_download
snapshot_download('timm/eca_resnext26ts.ch_in1k', cache_dir='./model')# NPU 推理
python3 inference.py --device npu --model_path <model_checkpoint_dir>
# CPU 推理
python3 inference.py --device cpu --model_path <model_checkpoint_dir>python3 compare_cpu_npu.py --model_name 'timm/eca_resnext26ts.ch_in1k' --model_path <model_checkpoint_dir> --num_tests 5
| 指标 | CPU | NPU | 加速比 |
|---|---|---|---|
| 平均推理耗时 | 153.8ms | 38.8ms | 3.97x |
NPU 推理使用 torch.npu.synchronize() 精确计时,首次推理含模型加载和编译预热,后续推理为稳定态延迟。
在 CPU 和 NPU 上分别加载同一模型权重,使用相同的随机输入张量(5个不同随机种子),运行推理后对比输出 logits。
评估指标:MAE(平均绝对误差)、最大差异、余弦相似度、相对误差百分比、Top-1 匹配率。
| 测试编号 | CPU Top-1 | NPU Top-1 | Top-1 一致 | Top-5重叠 | 相对误差 | 余弦相似度 | 状态 |
|---|---|---|---|---|---|---|---|
| 1 | 885 | 885 | True | 5/5 | 0.0131% | 0.99999944 | PASS |
| 2 | 885 | 885 | True | 5/5 | 0.0196% | 0.99999883 | PASS |
| 3 | 885 | 885 | True | 5/5 | 0.0184% | 0.99999927 | PASS |
| 4 | 21 | 21 | True | 5/5 | 0.0150% | 0.99999948 | PASS |
| 5 | 885 | 885 | True | 5/5 | 0.0205% | 0.99999884 | PASS |
| 指标 | 数值 |
|---|---|
| 测试用例数 | 5 |
| Top-1 匹配 | 5/5 |
| 平均 MAE | 7.252009e-04 |
| 平均相对误差 | 0.0173% |
| 平均余弦相似度 | 0.99999917 |
| 精度要求 | NPU vs CPU 误差 < 1% |
| 精度结论 | ✅ 通过 |
| 总体状态 | PASS |
Test 1: MAE=5.7294e-04 MaxDiff=2.3085e-03 RelErr=0.0131% CosSim=0.99999944 CPU=162.3ms NPU=174.6ms Status=PASS Test 2: MAE=8.1121e-04 MaxDiff=4.5403e-03 RelErr=0.0196% CosSim=0.99999883 CPU=154.6ms NPU=4.8ms Status=PASS Test 3: MAE=7.6600e-04 MaxDiff=4.0278e-03 RelErr=0.0184% CosSim=0.99999927 CPU=151.0ms NPU=4.8ms Status=PASS Test 4: MAE=6.0993e-04 MaxDiff=2.9545e-03 RelErr=0.0150% CosSim=0.99999948 CPU=150.4ms NPU=4.8ms Status=PASS Test 5: MAE=8.6592e-04 MaxDiff=4.3107e-03 RelErr=0.0205% CosSim=0.99999884 CPU=150.4ms NPU=4.8ms Status=PASS
精度测试结论:NPU 与 CPU 推理结果误差为 0.0173%,小于 1%,符合精度要求。
eca_resnext26ts/
├── inference.py # NPU/CPU 推理脚本
├── compare_cpu_npu.py # CPU vs NPU 精度对比脚本
├── requirements.txt # 依赖清单
├── accuracy_report.json # 精度测试报告
├── terminal_screenshot.png # 推理运行截图
└── readme.md # 本文档torch_npu 将 PyTorch 模型迁移至 Ascend NPUtransfer_to_npu 自动完成 CUDA 到 NPU 的 API 映射import torch
import timm
import torch_npu
# 加载模型
device = torch.device("npu:0" if torch.npu.is_available() else "cpu")
model = timm.create_model('eca_resnext26ts', pretrained=False, num_classes=1000)
state_dict = torch.load("pytorch_model.bin", map_location="cpu", weights_only=True)
model.load_state_dict(state_dict, strict=True)
model = model.to(device)
model.eval()
# 推理
with torch.no_grad():
output = model(input_tensor.to(device))
probs = torch.nn.functional.softmax(output[0], dim=0)
top5 = torch.topk(probs, k=5)torch_npu 会有设备替换警告,属正常现象torch.no_grad() 上下文进行推理以节省显存torch.npu.empty_cache() 释放 NPU 显存#NPU #Ascend #CV #图像分类 #ECA #ResNeXt #timm
适配方: Ascend NPU Adaptation
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。