| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 7 天前 | ||
| 1 个月前 | ||
| 14 小时前 | ||
| 14 小时前 |
样例使用指导
功能描述
该样例基于 YOLOv13 ONNX 模型实现目标检测功能。
在该样例中:
- 先使用样例提供的脚本
preprocess.py,将图片进行 letterbox 缩放(640x640),并归一化到 0~1,转换为 .bin 格式。 - 加载离线模型 om 文件,对图片进行推理,得到检测结果(包括目标类别、置信度和 bbox 坐标)。
- 对检测结果进行 NMS(非极大值抑制)后处理,去除重复检测框。
- 可选:使用
draw_boxes.py将检测框绘制在原始图片上,生成可视化结果。
目录结构
├── scripts
│ ├── build.sh # 编译脚本
│ ├── run.sh # 运行脚本
│ ├── preprocess.py # 图片预处理:letterbox 缩放 + 归一化,生成 .bin 文件
│ └── draw_boxes.py # 可视化脚本:将检测结果绘制到原始图片上
├── src
│ ├── acl.json # ACL 初始化配置文件
│ ├── CMakeLists.txt # 编译配置
│ └── sample_yolov13.cpp # 主程序
├── model // 模型存放目录,需手动创建
│ └── yolov13.om // ATC 转换后的离线模型文件
├── data // 数据存放目录,需手动创建
│ ├── bus.jpg // 测试图片
│ ├── bus.bin // preprocess.py 预处理生成的 .bin 文件
│ └── bus_out.jpg // draw_boxes.py 生成的可视化结果
└── CMakeLists.txt // 编译脚本入口
环境准备
-
通过安装指导正确安装 CANN Toolkit 和 OPP 算子包
-
设置环境变量(以默认安装路径为例,请根据实际安装路径调整):
source /usr/local/Ascend/cann/set_env.sh或者(非标准路径安装):
source /home/developer/Ascend/cann-9.0.0/set_env.sh
实现步骤
-
以运行用户登录开发环境。
-
下载代码并上传至环境后,进入样例目录。下文中的"样例目录"均指
examples/acl/5_sample_yolov13目录。 -
准备 YOLOv13 模型。
-
获取 YOLOv13 权重文件。
从 YOLOv13 Release 页面 下载
yolov13n.pt权重文件:wget https://github.com/iMoonLab/yolov13/releases/download/yolov13/yolov13n.pt注意:如使用 GitHub 下载,请配置稳定的网络代理;若下载不稳定,也可通过浏览器访问上述链接手动下载。
-
安装 YOLOv13 所需的依赖。
YOLOv13 使用了自定义模块(
DSC3k2等),标准ultralytics无法直接加载该模型。需从 YOLOv13 源码仓库安装其 fork 版本的 ultralytics:# 下载 YOLOv13 源码仓库(含 fork 版 ultralytics) curl -L -o yolov13.zip "https://codeload.github.com/iMoonLab/yolov13/zip/refs/heads/main" unzip yolov13.zip # 安装 fork 版 ultralytics(若系统已有标准版需先卸载) pip3 uninstall ultralytics -y 2>/dev/null pip3 install --no-deps yolov13-main/ # 安装缺失依赖 pip3 install huggingface_hub seaborn py-cpuinfo -
导出 ONNX 模型。
import torch from ultralytics import YOLO model = YOLO("yolov13n.pt") model.export(format="onnx", opset=11, imgsz=640)执行后将生成
yolov13n.onnx文件。 -
将 ONNX 模型转换为适配昇腾 AI 处理器的离线模型(*.om 文件)。
切换到样例目录,执行如下命令:
atc --model=yolov13n.onnx --framework=5 --output=yolov13 \ --soc_version=Ascend910A \ --input_shape="images:1,3,640,640" \ --output_type=FP32将生成的
yolov13.om文件放入model/目录。--soc_version参数说明:用于指定模型推理运行时使用的昇腾 AI 处理器型号。不同芯片的 soc_version 取值不同,必须与运行环境一致。常用查询方法:- Atlas A2 训练/推理系列、Atlas 训练/推理系列:执行
npu-smi info,取 Name 字段值,前加Ascend即为 soc_version(如 Name 为910B4,则 soc_version =Ascend910B4) - Atlas A3 训练/推理系列:执行
npu-smi info -t board -i <id> -c <chip_id>,取 Chip Name 和 NPU Name,组合为Chip Name_NPU Name(如 Chip Name 为Ascend910B4,NPU Name 为1234,则 soc_version =Ascend910B4_1234)。其中id为设备 ID(通过npu-smi info -l查询),chip_id为芯片 ID(通过npu-smi info -m查询) - Ascend 950 系列:执行
npu-smi info -t board -i <id>,取 Chip Name 和 NPU Name 组合。其中id为设备 ID(通过npu-smi info -l查询)
详细说明参见 ATC soc_version 参数文档。
- Atlas A2 训练/推理系列、Atlas 训练/推理系列:执行
-
-
准备测试图片。
-
从 YOLOv13 官方仓库获取测试图片,放入
data/目录:cd data/ wget https://raw.githubusercontent.com/iMoonLab/yolov13/main/ultralytics/assets/bus.jpg -
执行预处理脚本,将 jpg 转换为 bin 格式:
python3 ../scripts/preprocess.py如果执行脚本报错 "ModuleNotFoundError: No module named 'cv2'",请使用以下方式安装 OpenCV 库。
注意:在 aarch64 平台(如 Atlas 推理卡)上,
opencv-python可能与 libGLdispatch 存在 TLS 内存分配冲突,导致ImportError: cannot allocate memory in static TLS block。建议安装无 GUI 依赖的opencv-python-headless:pip3 install opencv-python-headless若在 x86_64 平台或已确认无 TLS 冲突,也可使用标准
opencv-python。
-
构建验证
-
编译程序:
cd scripts/ bash build.sh -
运行程序:
bash run.sh样例支持以下测试参数:
参数 说明 --modelOM 模型路径,默认为 ../model/yolov13.om--input输入文件路径,默认为 ../data/bus.bin--warmup-runs预热次数,默认为 0--runs正式测试次数,默认为 1例如:
./out/yolov13_main \ --model=./model/yolov13.om \ --input=./data/bus.bin \ --warmup-runs=5 \ --runs=10 -
执行结果:
执行成功后,关键提示信息示例如下(置信度和 bbox 坐标会根据模型版本、环境有所不同):
[INFO] acl init success [INFO] set device success [INFO] create context success [INFO] create stream success [INFO] load model ../model/yolov13.om success. [INFO] start to process file: ../data/bus.bin [INFO] BENCHMARK aclmdlExecute run=0 latency_us=1526 [INFO] Average aclmdlExecute latency: 1.526 ms [INFO] detected 5 objects: [INFO] [0] bus (0.94) bbox: [92,136,559,435] [INFO] [1] person (0.92) bbox: [110,236,222,535] [INFO] [2] person (0.87) bbox: [211,241,284,510] [INFO] [3] person (0.86) bbox: [475,232,560,519] [INFO] [4] person (0.55) bbox: [80,330,123,515] [INFO] result saved to ../data/bus_result.txt [INFO] YOLOv13 SAMPLE PASSED. -
(可选)可视化检测结果:
cd ../data/ python3 ../scripts/draw_boxes.py执行后生成
bus_out.jpg,图片上绘制了检测框和类别标签。
多流参数寻优任务
功能说明
在 CANN 社区版 9.2.0 环境中,可使用 GE 高级调优功能“多流增强”,通过自动分配图内执行流,挖掘算子之间的并行执行空间。
Note
多流增强功能需在 CANN 社区版 9.2.0 环境中使用。请前往 CANN 软件下载页面,按以下条件选择安装包:
- 版本类型:
Weekly - 产品系列:A3 系列产品
- CPU 架构:AArch64
- 操作系统:openEuler
- 安装方式:离线安装
下载完成后,请按照页面中的安装指导部署环境。
本样例属于静态 Shape 离线编译场景,通过 ATC 参数 --multi_stream_parallel_mode 配置多流并行模式,并为每个候选参数生成独立的 OM。
| 参数值 | 说明 |
|---|---|
cv |
开启 Cube 算子与 Vector 算子的并行执行 |
LoadBalance:N |
采用负载均衡算法,将算子分配到最多 N 条流上执行 |
MainStream:N |
采用主流算法,串行算子在主流执行,其他可并行算子分配到其他流 |
| 不配置 | 不启用自动多流并行优化,作为默认性能基线 |
其中,N 为正整数,取值范围为 [1, 64]。配置的流数量超过实际可用计算资源时,性能可能下降。详细说明请参见 --multi_stream_parallel_mode 参数说明。
命令行参数
ATC 通过 --multi_stream_parallel_mode=<模式> 接收多流策略,并将对应配置写入生成的 OM:
--multi_stream_parallel_mode=<模式>
不传入 --multi_stream_parallel_mode 时,不启用自动多流并行优化,并将生成的 OM 作为默认性能基线。
TODO:寻找最优多流增强参数
请在 CANN 社区版 9.2.0 环境中测试不同的多流并行模式,找到本样例在指定环境和测试条件下的最优参数,并填写以下结论后提交 PR:
--multi_stream_parallel_mode=LoadBalance:55
例如,使用 cv 模式时,先编译对应的 OM:
atc --model=yolov13n.onnx \
--framework=5 \
--output=./model/yolov13_cv \
--soc_version=Ascend910_9362 \
--input_shape="images:1,3,640,640" \
--output_type=FP32 \
--multi_stream_parallel_mode=cv
首次寻优前,基于最新源码构建一次推理程序:
bash scripts/build.sh
构建完成后,使用相同输入执行样例:
./out/yolov13_main \
--model=./model/yolov13_cv.om \
--input=./data/bus.bin \
--warmup-runs=10 \
--runs=90
yolov13_main 只需基于最新源码构建一次。遍历其他 --multi_stream_parallel_mode 候选参数时,重新执行 ATC 生成对应的 OM,然后使用同一个 yolov13_main 测试即可,无需重复构建推理程序。
性能评价标准
多流参数寻优以样例输出的平均 aclmdlExecute 时延作为主评价指标,数值越小表示性能越优:
Average aclmdlExecute latency: <平均耗时> ms
每个 --multi_stream_parallel_mode 候选参数共执行 100 次推理:前 10 次通过 --warmup-runs=10 进行预热,不计入统计;后 90 次通过 --runs=90 进行正式测试。以这 90 次成功正式推理的算术平均时延作为评价结果,并将平均时延最小者作为当前测试环境下的推荐参数。
单次耗时使用 std::chrono::steady_clock 统计,起点位于 aclmdlExecute 调用前,终点位于调用返回后,统计范围仅覆盖 aclmdlExecute。ATC 编译、ACL 初始化、模型加载、输入拷贝和后处理均不计入统计。预热阶段会执行 aclmdlExecute,但不统计和输出耗时。
平均时延计算方式为:
Average aclmdlExecute latency = 成功正式推理的 aclmdlExecute 耗时总和 / 成功正式推理次数
样例同时输出后 90 次正式推理的单次耗时,便于核对平均值和观察时延波动:
BENCHMARK aclmdlExecute run=<从 0 开始的正式推理序号> latency_us=<耗时>
Note
当前样例已支持 --model、--input、--warmup-runs 和 --runs 测试参数,并输出单次及平均 aclmdlExecute 耗时。--multi_stream_parallel_mode 是唯一寻优变量,各候选参数应独立编译 OM,并在相同环境下按照“预热 10 次、正式测试 90 次”的方式进行测试。
参数固定原则:
- ONNX 模型和输入数据:保持模型结构、输入 Shape 和计算量一致。
soc_version:保持 OM 的目标芯片配置一致。--warmup-runs=10:固定预热 10 次,预热不参与统计。--runs=90:固定正式测试 90 次,保持平均时延样本数一致。--multi_stream_parallel_mode:作为寻优过程中的唯一变量。
日志字段含义:
BENCHMARK:便于脚本检索性能日志的固定标识。run:预热结束后正式推理的执行序号,不是多流数量或 batch size。latency_us:单次aclmdlExecute耗时,单位为微秒。Average aclmdlExecute latency:所有成功正式推理的平均aclmdlExecute时延,单位为毫秒。
说明
- 类别标签使用 COCO 数据集的 80 类标签,支持 person、car、bus 等常见类别。
- 如需处理更多图片,可在
sample_yolov13.cpp的main()函数中修改inputFiles列表。 - 如需调整检测阈值,可在代码中修改
kConfThresh(置信度阈值)和kIouThresh(NMS IoU 阈值)。