g
gyccc/google-efficientnet-b6-NPU
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

google/efficientnet-b6 昇腾 NPU 适配工程

#NPU

1. 模型介绍

EfficientNet-B6 是 Google 提出的 EfficientNet 系列中的较大规模变体,基于复合缩放(Compound Scaling)方法对深度、宽度和分辨率进行统一缩放。该模型在 ImageNet 上预训练,具备较高的图片分类精度,适用于通用图像识别场景。

  • 模型名称: google/efficientnet-b6
  • 模型链接: https://ai.gitcode.com/hf_mirrors/google/efficientnet-b6
  • 任务类型: 图片识别 / image-classification
  • 运行方式: Transformers + torch_npu
  • 硬件: 单卡 Ascend NPU(910B4)

2. 硬件环境

项目说明
NPU 型号Ascend 910B4
NPU 健康状态OK
HBM 容量32768 MB
架构aarch64

3. 软件环境

项目版本
Python3.11.14
torch2.9.0+cpu
torch_npu2.9.0.post1+gitee7ba04
transformers4.57.6
torchvision0.24.0
pillow12.2.0
requests2.33.1
numpy1.26.4

4. 依赖安装

pip install -r requirements.txt

若当前环境已安装 torch 和 torch_npu,请勿强制覆盖,以免破坏现有 CANN 驱动兼容性。

5. 模型权重来源

本工程默认通过 Hugging Face Transformers 的 from_pretrained 接口加载模型权重。若直接访问 Hugging Face 受阻,脚本已内置环境变量:

os.environ.setdefault("HF_ENDPOINT", "https://hf-mirror.com")

权重将从 https://hf-mirror.com/google/efficientnet-b6 镜像下载并缓存到本地。

6. NPU 推理运行命令

python inference.py

7. inference.py 使用说明

inference.py 使用 Transformers 专用类(EfficientNetImageProcessor + EfficientNetForImageClassification)加载模型,若不可用则自动回退到 AutoImageProcessor + AutoModelForImageClassification。

  • 模型自动加载至 npu:0
  • 读取 assets/test.jpg 进行推理
  • 输出 Top-5 分类结果
  • 完整日志保存至 logs/inference.log
  • Top-1 标签与置信度保存至 logs/prediction.txt

实际运行结果(已完成):

Top-5 predictions:
  1. kite: 0.089300
  2. black stork, Ciconia nigra: 0.046627
  3. bald eagle, American eagle, Haliaeetus leucocephalus: 0.034968
  4. parachute, chute: 0.020273
  5. bee eater: 0.019923

注意:assets/test.jpg 为随机生成的 224x224 占位图(因网络受限无法下载公开图片)。若需获得更具语义意义的分类结果,请替换为真实图片。

8. eval_accuracy.py 精度验证方法和结果

eval_accuracy.py 使用同一张 assets/test.jpg,在 CPU 和 NPU 上分别执行一次前向推理,对比 logits 与概率分布差异。

python eval_accuracy.py

评估指标:

  • max_abs_diff (logits): CPU 与 NPU 输出 logits 的最大绝对差
  • mean_abs_diff (logits): 平均绝对差
  • prob_max_diff: Softmax 概率最大差值
  • top1_match: Top-1 预测是否一致
  • prob_error < 1%: 概率最大差是否小于 1%

实际运行结果(已完成):

max_abs_diff (logits): 0.00282216
mean_abs_diff (logits): 0.00048342
prob_max_diff: 0.00014306
top1_match: True
prob_error < 1%: True
Assessment: CPU/NPU floating-point implementation difference.

结论:NPU 推理与 CPU 基线结果一致,精度差异在浮点实现误差范围内,模型适配正确。

9. benchmark.py 性能测试方法和结果

benchmark.py 在 NPU 上预热 5 次,正式测试 20 次,统计推理延迟与吞吐量。

python benchmark.py

实际运行结果(已完成):

指标数值
测试轮数20
平均延迟61.074 ms
最小延迟48.062 ms
最大延迟106.567 ms
吞吐量16.37 images/s

10. 日志文件说明

文件说明
logs/env_check.log环境检查记录(npu-smi、Python 包版本、NPU 可用性)
logs/inference.loginference.py 完整运行日志(含 Top-5 结果)
logs/prediction.txtTop-1 预测标签与置信度摘要
logs/accuracy.logeval_accuracy.py 精度对比结果
logs/benchmark.logbenchmark.py 性能测试详细结果

11. 常见问题

Q1: assets/test.jpg 是什么图片?

由于当前网络环境无法下载公开测试图片,assets/test.jpg 为使用 PIL 生成的 224x224 随机 RGB 占位图。请在提交前替换为真实图片以获得有意义的分类结果。

Q2: 脚本运行结束后出现 Killed(exit code 137)?

在本环境中,inference.py 与 eval_accuracy.py 在完成所有计算并写完日志后,进程退出阶段收到系统 Killed 信号(exit code 137)。该现象不影响已保存结果的正确性:logs/inference.log、logs/prediction.txt、logs/accuracy.log 中的推理结果与精度对比数据均已完整写入。问题推测为 torch_npu / CANN 在进程资源回收阶段的行为,而非模型推理失败。benchmark.py 可正常退出(exit code 0)。若需规避,可尝试在脚本末尾显式调用 torch.npu.synchronize() 和 del model 后 gc.collect()。

Q3: 模型下载超时?

脚本已配置 HF_ENDPOINT=https://hf-mirror.com。若仍超时,请检查网络连通性,或提前通过 huggingface-cli 将模型下载到本地缓存目录。

Q4: NPU 不可用?

请确认:

  1. npu-smi info 能正常输出 NPU 信息;
  2. torch_npu 已正确安装且版本与 CANN 匹配;
  3. 环境变量 ASCEND_HOME_PATH 指向正确的 CANN 路径。

12. 目录结构

google-efficientnet-b6-NPU/
├── README.md
├── requirements.txt
├── inference.py
├── eval_accuracy.py
├── benchmark.py
├── assets/
│   └── test.jpg
├── logs/
│   ├── env_check.log
│   ├── inference.log
│   ├── prediction.txt
│   ├── accuracy.log
│   └── benchmark.log
├── scripts/
└── screenshots/