yolo检测适配昇腾Atlas300IDuo笔记

yolo检测适配昇腾Atlas300IDuo笔记

本文档记录 AI 服务在昇腾(Ascend)Atlas 300I Duo 推理卡上的完整适配过程,涵盖环境配置、驱动/固件/Docker 安装、模型转换、AI 服务集成。


文章目录

  • yolo检测适配昇腾Atlas300IDuo笔记
    • 一、环境配置
    • 二、模型适配
      • [1. 模型转换](#1. 模型转换)
        • [(1)pt 转 onnx](#(1)pt 转 onnx)
        • [(2)onnx 转 om(含 AIPP 加速前处理)](#(2)onnx 转 om(含 AIPP 加速前处理))
        • [(3)使用 msit 定位精度问题](#(3)使用 msit 定位精度问题)
      • [2. 集成 AI 服务](#2. 集成 AI 服务)
    • 附录
      • [A. 参考资料汇总](#A. 参考资料汇总)
      • [B. 关键文件/目录说明](#B. 关键文件/目录说明)

一、环境配置

1. 基础环境

项目 配置
物理机系统 银河麒麟 Kylin V10(aarch64)
CPU HUAWEI Kunpeng 920 7260 @ 2.6GHz / 128 核
NPU Atlas 300I Duo × 2

本方案针对 aarch64(鲲鹏) 架构,所有安装包均需使用对应的 aarch64 版本。

2. 基础命令

bash 复制代码
# 查看 NPU 是否在位(d500 为昇腾 NPU 的 PCI 设备标识)
lspci | grep d500
  • lspci | grep d500 用于确认物理机上已正确挂载昇腾 NPU 设备。

3. 驱动和固件安装

(1)检查依赖
bash 复制代码
# 检查 gcc
rpm -qa | grep gcc

# 检查 kernel-devel(需与当前内核版本匹配)
rpm -qa | grep kernel-devel-$(uname -r)

# 检查 make
make -v

安装驱动前需确保 gcc、make、kernel-devel 均已安装且版本匹配,否则驱动编译/安装会失败。

(2)创建驱动运行用户

驱动进程需要以专用用户运行,创建 HwHiAiUser 用户:

bash 复制代码
groupadd HwHiAiUser
useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash
(3)安装固件
bash 复制代码
# 先用 --check 进行安装前环境自检
./Ascend-hdk-310p-npu-firmware_7.7.0.6.236.run --check

# 通过校验后再执行安装(--install)
./Ascend-hdk-310p-npu-firmware_7.7.0.6.236.run --install
(4)安装驱动
bash 复制代码
./Ascend-hdk-310p-npu-driver_25.2.0_linux-aarch64.run --full
  • 使用 --full 参数执行完整安装。
  • 安装完成后,如日志提示需要重启,则按要求重启系统。
  • 重启后执行 sudo su,通过 npu-smi info 验证驱动是否安装成功。
(5)验证
bash 复制代码
# 查看 NPU 型号与工作状态
npu-smi info

4. Docker 安装

昇腾环境通常以容器方式承载推理服务,本步骤安装 Docker 以及昇腾专用容器运行时 Ascend Docker Runtime。

(1)安装 Docker
bash 复制代码
dnf install -y docker-engine.aarch64

也可通过离线 RPM 包安装,详见下文「离线安装(可选)」小节。

(2)安装 Ascend Docker Runtime
bash 复制代码
chmod +x Ascend-docker-runtime_7.1.RC1_linux-aarch64.run

# 自检
./Ascend-docker-runtime_7.1.RC1_linux-aarch64.run --check

# 安装
./Ascend-docker-runtime_7.1.RC1_linux-aarch64.run --install

# 重载 daemon 并重启 docker
systemctl daemon-reload && systemctl restart docker
离线安装 Docker(可选)

若无法使用在线源安装 Docker,可以找一台同配置的可以联网的机器,下载docker 安装包,安装包位于 docker-packages/ 目录。

bash 复制代码
mkdir -p ./docker-packages

dnf install -y --downloadonly --downloaddir=./docker-packages docker-engine.aarch64

把安装包复制到离线的机器上,可使用本地 RPM 包离线安装,:

bash 复制代码
cd docker-packages
rpm -ivh --nodeps --force ./*.rpm

# 启动并设置开机自启
systemctl enable docker && systemctl start docker

在线安装失败或内网环境时,优先使用本地 RPM 包离线安装。

若没有同配置且可联网的机器,也可以前往 https://update.cs2c.com.cn/NS/V10/V10SP2/os/adv/lic/base/aarch64/Packages/ 下载对应的 RPM 包尝试安装。


5. 镜像拉取

镜像仓库:https://www.hiascend.com/developer/ascendhub

(1)拉取 MindIE 推理镜像
bash 复制代码
docker pull --platform=arm64 \
  swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.RC2-300I-Duo-py311-openeuler24.03-lts
(2)创建并启动容器
bash 复制代码
docker run -itd --privileged --net=host \
  --shm-size 500g \
  --device=/dev/davinci0 \
  --device=/dev/davinci1 \
  --device=/dev/davinci2 \
  --device=/dev/davinci3 \
  --device=/dev/davinci_manager \
  --device=/dev/hisi_hdc \
  --device=/dev/devmm_svm \
  -v /usr/local/dcmi:/usr/local/dcmi \
  -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
  -v /usr/local/sbin:/usr/local/sbin \
  -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
  -v /etc/hccn.conf:/etc/hccn.conf \
  -v /data_1/test:/data_1/test\
  -v /etc/machine-id:/etc/machine-id \
  -v /sbin/dmidecode:/sbin/dmidecode \
  -v /dev/mem:/dev/mem \
  --name ai_test1 \
  swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.1.2-300I-Duo-py311-openeuler24.03-lts /bin/bash

关键参数说明:

参数 说明
--privileged 以特权模式运行,容器内可访问宿主机所有设备
--net=host 使用宿主网络栈,便于服务对外暴露端口
--shm-size 500g 设置共享内存为 500G,避免多路并发推理因共享内存不足而失败
--device=/dev/davinci* 将 NPU 设备(davinci0~3)映射进容器
--device=/dev/davinci_manager 映射 NPU 管理设备
--device=/dev/hisi_hccn 映射网卡/互联设备
--device=/dev/devmm_svm 映射设备内存设备
-v /usr/local/Ascend/... 挂载驱动与固件,使容器内可使用 NPU
-v /data_1/test:/data_1/test 挂载模型/数据目录
--name ai_test1 指定容器名称

容器创建后,后续模型转换、AI 服务运行均在此容器内(或遵循容器挂载路径)进行。


二、模型适配

1. 模型转换

流程为:pt → onnx → om。

本文以yolov7检测为例 :下载pt → onnx 转换代码:https://gitee.com/ascend/modelzoo-GPL/blob/master/built-in/PyTorch/Official/cv/object_detection/Yolov7_for_PyTorch

(1)pt 转 onnx
bash 复制代码
python export.py \
  --weights xxx.pt \
  --grid --simplify \
  --topk-all 1000 --iou-thres 0.65 --conf-thres 0.35 \
  --img-size 1280 1280 --max-wh 1280
(2)onnx 转 om(含 AIPP 加速前处理)
bash 复制代码
atc --model yolov7_640.onnx \
    --output=yolov7_640_310P3 \
    --framework=5 \
    --soc_version=Ascend310P3 \
    --insert_op_conf=aipp_yolov7_det_640.config

说明:

  • 实测发现预处理部分较慢(约 30ms),通过 --insert_op_conf=aipp_*.config 将通道转换、归一化 等耗时操作下沉到 NPU,使用 AIPP 加速后,预处理耗时降至约 8ms 。
    aipp_yolov7_det_640.config样例:

(3)使用 msit 定位精度问题

为定位漏检现象,使用华为 msit 工具进行精度对比。

bash 复制代码
# 1. 安装 msit 的 compare 模块
msit install compare

# 2. 使用 msit 进行精度对比
msit debug compare \
  -gm /data_1/test/weights/yolov7_640.onnx \
  -om /data_1/test/weights/yolov7_640.om \
  -c /usr/local/Ascend/ascend-toolkit/latest/ \
  -o /data_1/test/weights/msit_results/ \
  --advisor

精度对比结果显示,ONNX 转 OM 的过程中,第 234 层 将 ONNX 算子 Conv_46, Sigmoid_47, Mul_48 直接融合成 Conv_46Sigmoid_47Mul_48 算子时,首次出现精度损失;此后类似的算子融合均存在精度损失,导致后续损失不断放大。

解决方法:禁用所有算子融合。 新建 fusion_switch.cfg 文件,在其中配置禁用所有算子融合,然后重新转换:

bash 复制代码
atc --model yolov7_640.onnx \
    --output=yolov7_640 \
    --framework=5 \
    --soc_version=Ascend310P3 \
    --insert_op_conf=aipp_yolov7_det_640.config \
    --fusion_switch_file=fusion_switch.cfg

使用该方式转换出的模型进行测试,不再出现精度损失。


2. 集成 AI 服务

将原使用 pt 推理 和 trt 推理 的部分,统一替换为 om 推理,并修改相应模型加载逻辑即可。


附录

A. 参考资料汇总

主题 链接
驱动与固件下载 https://www.hiascend.com/hardware/firmware-drivers/community?product=2&model=18&cann=8.2.RC2&driver=Ascend+HDK+25.2.0
昇腾 Docker 化部署 https://www.hiascend.com/document/detail/zh/canncommercial/82RC1/softwareinst/instg/instg_0020.html?Mode=DockerIns&InstallType=local&OS=Debian&Software=cannToolKit
镜像仓库 https://www.hiascend.com/developer/ascendhub
YOLOv7-for-PyTorch 官方代码 https://gitee.com/ascend/modelzoo-GPL/tree/master/built-in/PyTorch/Official/cv/object_detection/Yolov7_for_PyTorch
msit 精度对比工具 https://gitcode.com/Ascend/msit/tree/master/msit/docs/debug/compare
ATC 算子融合开关参数 https://www.hiascend.com/document/detail/zh/canncommercial/82RC1/devaids/atctool/atlasatcparam_16_0053.html

B. 关键文件/目录说明

路径 / 文件 说明
Ascend-hdk-310p-npu-driver_25.2.0_linux-aarch64.run NPU 驱动安装包
Ascend-hdk-310p-npu-firmware_7.7.0.6.236.run NPU 固件安装包
Ascend-docker-runtime_7.1.RC1_linux-aarch64.run 昇腾容器运行时
Ascend-mindie_2.1.RC2_linux-aarch64_abi1.run MindIE 推理框架
docker-packages/ Docker 离线安装 RPM 包
fusion_switch.cfg 禁用算子融合的配置文件
aipp_*.config AIPP 前处理加速配置
相关推荐
遇雪长安1 小时前
MCU 固件启动即崩,bootloader 如何发现
1024程序员节
Zevalin爱灰灰1 小时前
Linux入门第一部分(Ubuntu入门篇) 第二章 浅尝Ubuntu(二)
linux·嵌入式·1024程序员节
泡海椒1 小时前
JQuick-SQL REST API 数据接入:应用层调用接口后注册分析表
数据库·sql·1024程序员节
_MH88881 小时前
2026.10.24|距离上一次写 CSDN,刚好过去了一年
1024程序员节
XIU YUAN1 小时前
ESP32-C6 专业游戏合集系统 - 打造你的掌上游戏机
1024程序员节
程序猿乐锅1 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
lzqrzpt1 小时前
太阳能控制器选型要点:电路工艺与工程适配技术解析
python·1024程序员节
前端 贾公子1 小时前
LangGraph == 静态分支
1024程序员节