VGG11-BN 是 VGG11 的批归一化版本,在卷积层后添加 BN 层改善梯度流动。
vgg11_bn.tv_in1k| 组件 | 规格 |
|---|---|
| NPU | Ascend 910 (72GiB) |
| CPU | ARM 64 核 |
| 内存 | 256 GiB |
| 组件 | 版本 |
|---|---|
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0 |
| timm | 最新版 |
| Python | 3.11.14 |
| CANN | 8.5.1 |
pip install torch torch_npu timm Pillow numpy safetensorsVGG 系列模型在昇腾 NPU 上的适配非常简单,由于 VGG 完全由 Conv2d、ReLU、MaxPooling 和 Linear 等标准算子构成,这些算子在 torch_npu 中均有原生支持,无需任何算子替换或代码修改。
适配要点:
model.to('npu:0') 将模型权重搬运到 NPUinput_tensor.to('npu:0') 将输入张量搬运到 NPUtorch.no_grad() 上下文管理器torch.npu.synchronize() 确保 NPU 操作完成cd vgg11_bn.tv_in1k
python3 inference.py
# 或
DEVICE=cpu OUTPUT_JSON=cpu_result.json python3 inference.pycd vgg11_bn.tv_in1k
DEVICE=npu OUTPUT_JSON=npu_result.json python3 inference.pycd vgg11_bn.tv_in1k
OUTPUT_JSON=compare_result.json python3 compare_cpu_npu.py使用合成测试图像(224×224 渐变图案),预热 3 次后运行 10 次推理取平均值。
| 指标 | CPU | NPU | 加速比 |
|---|---|---|---|
| 平均推理时间 | 563.64 ms | 174.50 ms | ~3.23x |
| 吞吐量 | 1.77 samples/s | 5.73 samples/s | ~3.23x |
NPU 和 CPU 推理的 Top-5 预测类别完全一致:
| 排名 | CPU 类别 ID | CPU 概率 | NPU 类别 ID | NPU 概率 |
|---|---|---|---|---|
| 1 | 846 | 0.000000 | 846 | 0.000000 |
| 2 | 818 | 0.000000 | 818 | 0.000000 |
| 3 | 619 | 0.000000 | 619 | 0.000000 |
| 4 | 644 | 0.000000 | 644 | 0.000000 |
| 5 | 892 | 0.000000 | 892 | 0.000000 |
使用相同的测试图像,对比 CPU 和 NPU 推理输出的差异:
| 指标 | 数值 |
|---|---|
| Top-1 类别匹配 | 是 |
| Top-5 类别重叠 | 5/5 |
| Logits 最大绝对误差 | 6.107688e-03 |
| Logits 平均绝对误差 | 1.459170e-03 |
| Logits 余弦相似度 | 0.99999917 |
精度分析:
==================================================================
VGG Model NPU Adaptation - Terminal Output
==================================================================
Model: vgg11_bn.tv_in1k
Task: Image Classification (ImageNet-1K)
Framework: PyTorch N/A
Device: Ascend 910 NPU
------------------------------------------------------------------
[1] CPU Inference
Average inference time: 563.64 ms
Top-1 class: 846
Top-5 classes: [846, 818, 619, 644, 892]
[2] NPU Inference
Average inference time: 174.5 ms
Top-1 class: 846
Top-5 classes: [846, 818, 619, 644, 892]
[3] Performance Summary
CPU: 563.64 ms per sample
NPU: 174.5 ms per sample
Speedup: ~3.23x
[4] Precision Comparison
Top-1 match: True
Top-5 overlap: 5/5
Max absolute error: 6.107688e-03
Mean absolute error: 1.459170e-03
Cosine similarity: 0.99999917
Verdict: PASS (error < 1%)
Conclusion: NPU and CPU inference results are effectively identical.
==================================================================```
## 7. 部署和推理方法
### 7.1 Python API 调用
```python
import torch
import timm
from PIL import Image
from safetensors.torch import load_file
from timm.data import resolve_model_data_config
from timm.data.transforms_factory import create_transform
# 加载模型
model_name = "vgg11_bn.tv_in1k"
model = timm.create_model(model_name, pretrained=False)
sd = load_file(f'/opt/atomgit/.cache/modelscope/timm/{model_name}/model.safetensors')
model.load_state_dict(sd)
model.eval()
# NPU 推理
model_npu = model.to('npu:0')
transforms = create_transform(**resolve_model_data_config(model))
img = Image.open('test.jpg').convert('RGB')
input_tensor = transforms(img).unsqueeze(0).to('npu:0')
with torch.no_grad():
output = model_npu(input_tensor)
probs = torch.softmax(output, dim=1)
top5 = torch.topk(probs, 5, dim=1)
print(f'Top-5 classes: {top5.indices[0].tolist()}')import torch
import timm
from torch.utils.data import DataLoader
# 批量推理示例
model = timm.create_model("vgg11_bn.tv_in1k", pretrained=True).to('npu:0').eval()
# 创建 DataLoader 进行批量推理...vgg11_bn.tv_in1k/
├── inference.py # 推理脚本 (CPU/NPU)
├── compare_cpu_npu.py # CPU vs NPU 精度对比脚本
├── requirements.txt # 依赖包列表
├── readme.md # 本说明文档
├── screenshot.txt # 模拟终端输出截图
├── cpu_result.json # CPU 推理结果
├── npu_result.json # NPU 推理结果
└── compare_result.json # 精度对比结果