#+NPU #+昇腾 #+Ascend910 #+CV #+图像分类 #+DenseNet #+CNN #+密集连接
本仓库包含了 DenseNet121 在华为昇腾 Ascend910 NPU 上的适配版本,支持 CPU 和 NPU 两种推理方式,并提供了完整的精度验证流程。
DenseNet(Densely Connected Convolutional Networks)是一种高效的卷积神经网络架构,由康奈尔大学、清华大学和 Facebook AI 研究院于 2017 年提出(CVPR 2017 最佳论文)。其核心创新是密集连接机制(Dense Connectivity),其中每一层都接收前面所有层输出的拼接作为自己的输入。这种设计使得特征在网络中能够最大化复用、梯度能够高效反向传播,从而以更少的参数达到更优的性能。DenseNet-121 是 DenseNet 系列的 121 层版本。
原始模型地址: AIBSECO/densenet121
图像分类(Image Classification),1000 类 ImageNet 分类
PyTorch(torchvision)
图像(Image),RGB 格式,预处理后为 224×224 张量
1000 个类别的分类 logits 和概率分数
| 依赖 | 版本 |
|---|---|
| Python | >= 3.8 |
| PyTorch | >= 2.0.0 |
| torch_npu | >= 2.0.0 |
| torchvision | >= 0.15.0 |
| NumPy | >= 1.20.0 |
| Pillow | >= 9.0.0 |
本适配基于华为 Ascend910 NPU(CANN 8.5.1,显存 64GB)完成。适配内容包括:
model.to("npu:0") 将模型权重迁移到 NPU 设备实现加速推理# 安装基础依赖
pip install torch torchvision torch_npu numpy Pillow -i https://mirrors.aliyun.com/pypi/simple/
# 设置 NPU 环境变量
export ASCEND_RT_VISIBLE_DEVICES=0CPU 推理:
python3 inference.py --device cpuNPU 推理:
python3 inference.py --device npuCPU vs NPU 精度对比:
python3 compare_cpu_npu.py# CPU 推理
python3 inference.py --device cpu
# NPU 推理
python3 inference.py --device npuimport torch
from torchvision.models import densenet121, DenseNet121_Weights
from PIL import Image
from torchvision import transforms
# 加载模型
model = densenet121(weights=DenseNet121_Weights.DEFAULT)
model = model.to("npu:0")
# 图像预处理
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
image = Image.open("test_image.jpg").convert("RGB")
input_tensor = transform(image).unsqueeze(0).to("npu:0")
# 推理
with torch.no_grad():
output = model(input_tensor)
probs = torch.nn.functional.softmax(output, dim=-1)
print(probs)关键比较指标:
| 指标 | 值 |
|---|---|
| 最大绝对误差 | 4.263878e-03 |
| 平均绝对误差 | 7.661122e-04 |
| 相对误差 | 0.0600% |
| 余弦相似度 | 0.9999998808 |
| 最大概率绝对误差 | 5.721152e-04 |
| 平均概率绝对误差 | 1.653563e-06 |
| Top-1 标签匹配 | True |
| Top-5 一致率 | 100% |
| CPU 推理耗时 | 149.86 ms |
| NPU 推理耗时 | 191.22 ms |
| 排名 | CPU 类别 | CPU 分数 | NPU 类别 | NPU 分数 |
|---|---|---|---|---|
| Top-1 | doormat | 0.258878 | doormat | 0.258306 |
| Top-2 | jigsaw puzzle | 0.040298 | jigsaw puzzle | 0.040213 |
| Top-3 | poncho | 0.034918 | poncho | 0.035000 |
| Top-4 | prayer rug | 0.033270 | prayer rug | 0.033162 |
| Top-5 | broom | 0.020888 | broom | 0.020946 |
NPU 与 CPU 推理结果误差 < 1%(实际相对误差为 0.0600%),精度完全满足要求。余弦相似度为 0.9999998808,Top-1 和 Top-5 结果完全一致,NPU 推理结果与 CPU 推理结果高度一致。
| 平台 | 推理耗时 (ms) | 加速比 |
|---|---|---|
| CPU | 149.86 | 1.00x |
| NPU (Ascend910) | 191.22 | 0.78x |
注:DenseNet-121 为 8M 参数的中等规模模型。单次推理时 NPU 耗时高于 CPU 主要是由于算子下发和数据传输开销。对于批量推理场景,NPU 的并行计算优势将更加明显。


#+NPU #+昇腾 #+Ascend910 #+CV #+图像分类 #+DenseNet #+CNN #+密集连接