EdgeNeXt 是一种结合了 CNN 和 Transformer 的高效图像分类架构,由 Microsoft Research 提出。该模型通过引入转置卷积(transposed convolutions)和分裂注意力(split attention)机制,在保持高性能的同时大幅降低了计算量和参数量。
本仓库提供 edgenext_base.in21k_ft_in1k 在华为昇腾 NPU 上的适配与推理实现,包含完整的推理脚本、精度对比工具和测试结果。该模型是 EdgeNeXt Base 变体,先在 ImageNet-21K 上预训练,再在 ImageNet-1K 上微调。
图像分类 (Image Classification - ImageNet-1K, 1000 classes)
| 参数 | 值 |
|---|---|
| 参数量 | 18.5M |
| 输入尺寸 | 256x256 |
| 输入通道 | 3 |
| 类别数 | 1000 (ImageNet-1K) |
| 组件 | 版本 |
|---|---|
| Python | 3.11 |
| PyTorch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1 |
| timm | 最新版 |
| ModelScope | 1.35.3 |
| CANN | 8.5.1 |
| NPU | Ascend910 |
| OS | Linux (aarch64) |
该模型使用 timm 框架的 EdgeNeXt 实现,在昇腾 NPU 上无需额外修改即可运行。适配过程:
snapshot_download)timm.create_model() 创建模型并加载本地权重.to("npu:0") 将模型移至 NPU 设备create_transform 进行图像预处理# 安装依赖(使用清华 PyPI 镜像)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision timm modelscope pillow numpy
# 安装 torch_npu(昇腾 NPU 支持)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch_npucd edgenext_base.in21k_ft_in1k
python3 inference.py --model edgenext_base.in21k_ft_in1k --device cpucd edgenext_base.in21k_ft_in1k
python3 inference.py --model edgenext_base.in21k_ft_in1k --device npucd edgenext_base.in21k_ft_in1k
python3 compare_cpu_npu.py --model edgenext_base.in21k_ft_in1k使用合成测试图像进行推理。
| Rank | Class ID | Probability |
|---|---|---|
| 1 | 21 | 0.153165 |
| 2 | 128 | 0.076960 |
| 3 | 405 | 0.044047 |
| 4 | 701 | 0.043085 |
| 5 | 22 | 0.025672 |
| Rank | Class ID | Probability |
|---|---|---|
| 1 | 21 | 0.152845 |
| 2 | 128 | 0.077034 |
| 3 | 405 | 0.044708 |
| 4 | 701 | 0.043289 |
| 5 | 22 | 0.025552 |
| 指标 | 值 |
|---|---|
| 最大绝对 Logit 差异 | 0.02301238 |
| 平均绝对 Logit 差异 | 0.00460232 |
| 最大绝对概率差异 | 0.00066141 |
| 平均绝对概率差异 | 0.00000537 |
| Logits 余弦相似度 | 0.99998512 |
| Pearson 相关系数 | 0.99998524 |
| 最大相对误差 | 0.3789% |
| CPU 预测类别 | 21 |
| NPU 预测类别 | 21 |
| Top-1 类别一致 | 是 |
| Top-5 重合数 | 5/5 |
NPU 与 CPU 推理结果误差 < 1%(最大相对误差: 0.3789%)。
NPU 与 CPU 的推理结果在数值上高度一致,余弦相似度达到 0.9999 以上,Top-1 和 Top-5 预测类别完全一致。昇腾 NPU (Ascend910) 在该模型上的推理精度完全满足要求。
| 设备 | 推理耗时 (ms) | 加速比 |
|---|---|---|
| CPU (Intel Xeon) | 170.08 | 1x |
| NPU (Ascend910) | 7.60 | 22.37x |

edgenext_base.in21k_ft_in1k/
├── inference.py # NPU/CPU 推理脚本
├── compare_cpu_npu.py # CPU vs NPU 精度对比脚本
├── requirements.txt # 依赖包列表
├── precision_results.json # 精度测试结果 (JSON)
├── compare.log # 精度测试日志
├── inference_cpu.log # CPU 推理日志
├── inference_npu.log # NPU 推理日志
├── terminal_screenshot.png # 模拟终端输出截图
└── README.md # 本文件import torch
import torch_npu
from PIL import Image
from timm import create_model
from timm.data import create_transform, IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD
model_name = "edgenext_base.in21k_ft_in1k"
model = create_model(model_name, pretrained=False, num_classes=1000)
import timm
timm.models.load_checkpoint(model, "./model.safetensors")
model.eval()
model.to("npu:0")
transform = create_transform(
input_size=(3, 256, 256),
is_training=False,
mean=IMAGENET_DEFAULT_MEAN,
std=IMAGENET_DEFAULT_STD,
interpolation='bicubic',
)
image = Image.open("test.jpg").convert("RGB")
input_tensor = transform(image).unsqueeze(0).to("npu:0")
with torch.no_grad():
outputs = model(input_tensor)
logits = outputs if not hasattr(outputs, "logits") else outputs.logits
probs = torch.softmax(logits, dim=-1)
pred = torch.argmax(probs, dim=-1).item()
print(f"Predicted class: {pred}")python3 compare_cpu_npu.py --model edgenext_base.in21k_ft_in1k本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。