本文档记录 timm/eca_nfnet_l2.ra3_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_nfnet_l2.ra3_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_nfnet_l2.ra3_in1k' --model_path <model_checkpoint_dir> --num_tests 5
| 指标 | CPU | NPU | 加速比 |
|---|---|---|---|
| 平均推理耗时 | 1193.6ms | 61.9ms | 19.28x |
NPU 推理使用 torch.npu.synchronize() 精确计时,首次推理含模型加载和编译预热,后续推理为稳定态延迟。
在 CPU 和 NPU 上分别加载同一模型权重,使用相同的随机输入张量(5个不同随机种子),运行推理后对比输出 logits。
评估指标:MAE(平均绝对误差)、最大差异、余弦相似度、相对误差百分比、Top-1 匹配率。
| 测试编号 | CPU Top-1 | NPU Top-1 | Top-1 一致 | Top-5重叠 | 相对误差 | 余弦相似度 | 状态 |
|---|---|---|---|---|---|---|---|
| 1 | 21 | 21 | True | 5/5 | 0.0055% | 0.99999990 | PASS |
| 2 | 21 | 21 | True | 5/5 | 0.0058% | 0.99999992 | PASS |
| 3 | 21 | 21 | True | 5/5 | 0.0088% | 0.99999966 | PASS |
| 4 | 21 | 21 | True | 5/5 | 0.0070% | 1.00000000 | PASS |
| 5 | 21 | 21 | True | 5/5 | 0.0075% | 0.99999990 | PASS |
| 指标 | 数值 |
|---|---|
| 测试用例数 | 5 |
| Top-1 匹配 | 5/5 |
| 平均 MAE | 9.112983e-05 |
| 平均相对误差 | 0.0069% |
| 平均余弦相似度 | 0.99999988 |
| 精度要求 | NPU vs CPU 误差 < 1% |
| 精度结论 | ✅ 通过 |
| 总体状态 | PASS |
Test 1: MAE=7.0053e-05 MaxDiff=2.8864e-04 RelErr=0.0055% CosSim=0.99999990 CPU=1199.5ms NPU=201.4ms Status=PASS Test 2: MAE=8.2001e-05 MaxDiff=4.0838e-04 RelErr=0.0058% CosSim=0.99999992 CPU=1180.3ms NPU=27.1ms Status=PASS Test 3: MAE=1.1982e-04 MaxDiff=4.2023e-04 RelErr=0.0088% CosSim=0.99999966 CPU=1196.3ms NPU=27.1ms Status=PASS Test 4: MAE=8.9480e-05 MaxDiff=4.3756e-04 RelErr=0.0070% CosSim=1.00000000 CPU=1194.2ms NPU=27.4ms Status=PASS Test 5: MAE=9.4300e-05 MaxDiff=4.4051e-04 RelErr=0.0075% CosSim=0.99999990 CPU=1197.6ms NPU=26.5ms Status=PASS
精度测试结论:NPU 与 CPU 推理结果误差为 0.0069%,小于 1%,符合精度要求。
eca_nfnet_l2_ra3/
├── 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_nfnet_l2', 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 #NFNet #timm
适配方: Ascend NPU Adaptation
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。