# detect_perf **Repository Path**: sambios/detect_perf ## Basic Information - **Project Name**: detect_perf - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-04 - **Last Updated**: 2026-01-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # detect_perf `detect_perf` 用于对不同后端(RivsInference/GCU 或 ONNXRuntime/CPU)下的模型推理进行并发性能测试(FPS)。 - 支持 **多卡**(`dev_num`)与 **每卡多路**(`num_per_device`)并发。 - 通过 `config.json` 选择 `model_type` 与 `model_path`。 - **GCU 后端**会自动从 onnx 构建/或加载缓存的 `exec`,并且 `exec` 文件名带 **CPU 架构后缀**,避免跨架构覆盖: - `xxx.onnx.x86_64.exec` - `xxx.onnx.aarch64.exec` --- ## 目录结构(关键) - `src/main.cpp` - 读取 `config.json`,按 `dev_num * num_per_device` 创建线程持续推理并统计 FPS。 - `include/detector/base_detector.h` - detector 抽象接口。 - `src/detector/detector_factory.cpp` - `BaseDetector::CreateDetector(model_type, ...)` 的统一工厂(会根据编译时后端开关决定支持哪些类型)。 - `src/detector/yolo11_gcu_detector.cpp` - YOLO11 RivsInference/GCU 实现。 - `src/detector/resnet50_gcu_detector.cpp` - ResNet50 RivsInference/GCU 实现(分类 top1)。 - `src/detector/onnx_detector.cpp` - ONNXRuntime 基类(自动读取模型输入 shape,并处理动态维度)。 - `src/detector/yolo11_onnx_detector.cpp` - YOLO11 ONNXRuntime 实现。 - `src/detector/resnet50_onnx_detector.cpp` - ResNet50 ONNXRuntime 实现(分类 top1)。 --- ## 构建方式 本项目支持两种互斥/可选后端: - **GCU(RivsInference)**:`USE_RIVSINFERENCE=ON` - **ONNXRuntime**:`USE_ONNXRUNTIME=ON` > 说明: > - 你可以同时 ON,但一般测试时建议按需求只开一个。 > - 如果你想做 **onnxruntime-only(x86 CPU)** 构建,请设置 `USE_RIVSINFERENCE=OFF`,项目不会链接 `Rivs::Inference/Rivs::RT`。 ### 1) GCU(RivsInference)版本 ```bash cmake -B build -S . -DUSE_RIVSINFERENCE=ON -DUSE_ONNXRUNTIME=OFF cmake --build build -j ``` ### 2) ONNXRuntime(CPU)版本 需要先准备 onnxruntime 安装目录(包含 `include/onnxruntime_cxx_api.h` 和 `lib/libonnxruntime.so`)。 ```bash export ONNXRUNTIME_ROOT=/path/to/onnxruntime-linux-x64-1.xx.x cmake -B build -S . -DUSE_ONNXRUNTIME=ON -DUSE_RIVSINFERENCE=OFF cmake --build build -j ``` 如果找不到 onnxruntime,会在配置阶段直接报错并提示设置 `ONNXRUNTIME_ROOT`。 --- ## 运行方式 ### 1) 准备 `config.json` 运行时默认读取当前目录 `config.json`;也支持传入路径: ```bash ./build/detect_perf config.json ``` ### 2) `config.json` 字段说明 ```json { "dev_num": 1, "datasets": "/path/to/images_or_folder", "model_type": "yolo11_gcu", "model_path": "~/models/yolo11n.onnx", "num_per_device": 1 } ``` - `dev_num` - 使用的设备数量(多卡)。 - `num_per_device` - 每张卡/每个设备启用的并发通道数(每个通道一个线程)。 - 总线程数 = `dev_num * num_per_device`。 - `datasets` - 图片目录或单张图片路径。 - 程序会把目录下的图片全部读入内存,并循环推理。 - `model_path` - 模型路径(`.onnx`)。 - 支持 `~/`,会自动展开为 `$HOME`。 - `model_type` - 选择后端与模型解析逻辑(见下方)。 --- ## 支持的 model_type ### 1) GCU(需要 `USE_RIVSINFERENCE=ON`) - `yolo11_gcu` - `resnet50_gcu` ### 2) ONNXRuntime(需要 `USE_ONNXRUNTIME=ON`) - `yolo11_onnx` - `resnet50_onnx` > 注意: > - `model_type` 拼写必须完全匹配,否则会报: > - `CreateDetector failed: unsupported model_type='...' in current build.` --- ## GCU 的 exec 缓存规则(重要) GCU 版本会优先尝试加载缓存 `exec`,若不存在则从 onnx 构建并保存。 - `exec_path = ..exec` - 示例(x86_64): - `~/models/yolo11n.onnx.x86_64.exec` 这样同一 onnx 在不同 CPU 架构下不会互相覆盖。 --- ## 常见问题排查 ### 1) 运行立即退出、提示 CreateDetector nullptr 现象: - 日志包含: - `CreateDetector returned nullptr` 原因: - `model_type` 与当前编译后端不匹配。 解决: - 如果想跑 `*_gcu`,用: - `-DUSE_RIVSINFERENCE=ON` - 如果想跑 `*_onnx`,用: - `-DUSE_ONNXRUNTIME=ON` ### 2) GCU 侧提示 model not found 现象: - `ResNet50GcuDetector::loadModel() model not found` 或类似信息 原因: - `model_path` 不存在,或 `exec`/`onnx` 均不存在。 解决: - 检查 `model_path` 是否正确,是否使用了正确的 `~/` 路径。 - 检查同目录是否已有 `*.onnx..exec`。 ### 3) FPS 很高/很低 - FPS 与 `dev_num`、`num_per_device`、图片分辨率、模型输入 shape、后端配置都相关。 - 建议从 `dev_num=1`、`num_per_device=1` 开始逐步增加。 --- ## 示例 ### 1) 测试 YOLO11n(GCU) ```json { "dev_num": 2, "datasets": "/home/steven/enrigin_ws/datasets/coco128/images/train2017", "model_type": "yolo11_gcu", "model_path": "~/models/yolo11n.onnx", "num_per_device": 8 } ``` ### 2) 测试 ResNet50(GCU) ```json { "dev_num": 1, "datasets": "/home/steven/enrigin_ws/datasets/coco128/images/train2017", "model_type": "resnet50_gcu", "model_path": "~/models/resnet50-v1.5.onnx", "num_per_device": 4 } ``` ### 3) 测试 ResNet50(ONNXRuntime) ```json { "dev_num": 1, "datasets": "/home/steven/enrigin_ws/datasets/coco128/images/train2017", "model_type": "resnet50_onnx", "model_path": "~/models/resnet50-v1.5.onnx", "num_per_device": 4 } ``` --- ## 备注 - 当前 ResNet50 的预处理以性能测试为主,默认做 `resize + /255 + CHW`,如果需要严格对齐 ImageNet mean/std,请根据你的模型训练配置调整。