使用这个rdkx5的model_zoo转换demo,得到了这个bin文件,参考这个https://forum.d-robotics.cc/t/topic/33301帖子,AI说我的宿主机的OE版本和这个X3上的镜像版本不匹配,倒是这个BPU无法并行,应该怎么提高这个识别的帧率
问题分析与解决方案
根据你的描述,核心问题是:用 RDK X5 的 model_zoo 工具链转换的模型,在 RDK X3 上运行时 BPU 无法并行,导致帧率只有 4 FPS。
根本原因
- 工具链与板卡不匹配:你用 RDK X5 的工具链(bayes-e 架构)转换模型,但目标是 RDK X3(bernoulli2 架构)
- OE 版本不匹配:宿主机工具链版本与 X3 板端系统版本不一致,导致算子兼容性差
- BPU 子图分裂:模型被拆分成多个子图,CPU-BPU 频繁切换导致性能暴跌
解决步骤
步骤 1:确认 X3 的 OE 版本
# 在 X3 板端执行
cat /etc/os-release
hb_sys --version
步骤 2:下载匹配的 X3 工具链
RDK X3 需要使用 bernoulli2 架构的工具链,而不是 X5 的 bayes-e。
# 在宿主机(Ubuntu)操作
# 1. 下载 X3 对应的 OpenExplorer 工具链
# 访问:https://developer.d-robotics.cc/
# 选择 RDK X3 对应的工具链(通常是 xj3 系列)
# 2. 加载 Docker 镜像
docker load < openexplorer_ai_toolchain_ubuntu_20_x3_cpu_v1.x.x.tar.gz
# 3. 验证镜像
docker images | grep openexplorer
步骤 3:使用 hb_mapper checker 诊断模型
# 在 Docker 环境内执行
hb_mapper checker --model-type onnx --march bernoulli2 --model /data/your_model.onnx > checker_log.txt
# 查看算子分布
grep "BPU" checker_log.txt | wc -l # BPU 算子数量
grep "CPU" checker_log.txt | wc -l # CPU 算子数量
# 关键:检查是否有算子被退回 CPU
grep -i "warning\|fallback" checker_log.txt
步骤 4:重新量化模型(使用正确的配置)
创建 X3 专用的量化配置文件:
# yolo_config_x3.yaml
model_parameters:
onnx_model: '/data/yolov8.onnx'
march: 'bernoulli2' # X3 使用 bernoulli2,不是 bayes-e
working_dir: '/data/output'
output_model_file_prefix: 'yolov8_bernoulli2_640x640_nv12'
input_parameters:
input_type_rt: 'nv12'
input_type_train: 'rgb'
input_layout_train: 'NCHW'
norm_type: 'data_scale'
scale_value: 0.003921568627451
calibration_parameters:
cal_data_dir: '/data/calibration_data'
cal_data_type: 'float32'
calibration_type: 'default'
compiler_parameters:
compile_mode: 'latency'
optimize_level: 'O3'
执行量化:
# 启动 X3 工具链 Docker
docker run -it --rm \
-v $(pwd):/data \
openexplorer/ai_toolchain_ubuntu_20_x3_cpu:v1.x.x \
/bin/bash
# 在 Docker 内执行量化
hb_mapper makertbin --model-type onnx --config /data/yolo_config_x3.yaml
步骤 5:验证模型子图数量
# 检查生成的 bin 文件
hrt_model_exec model_info --model_file yolov8_bernoulli2_640x640_nv12.bin
# 关键指标:
# - BPU subgraph count: 应该是 1(如果是 2+ 说明有算子在 CPU)
# - Input: nv12
# - Outputs: 正确的输出数量
步骤 6:板端性能测试
# test_x3_performance.py
from hobot_dnn import pyeasy_dnn as dnn
import time
import numpy as np
# 加载模型
models = dnn.load('yolov8_bernoulli2_640x640_nv12.bin')
model = models[0]
# 创建测试数据(NV12 格式)
nv12_data = np.random.randint(0, 255, (960, 640), dtype=np.uint8)
# 预热
for _ in range(20):
model.forward(nv12_data)
# 性能测试
times = []
for _ in range(100):
start = time.time()
model.forward(nv12_data)
elapsed = (time.time() - start) * 1000
times.append(elapsed)
print(f"平均延迟:{np.mean(times):.2f} ms")
print(f"理论 FPS: {1000 / np.mean(times):.1f}")
预期性能对比
| 场景 | BPU 延迟 | FPS | 子图数 |
|---|---|---|---|
| 错误配置(X5 工具链) | ~250ms | 4 FPS | 2+ |
| 正确配置(X3 工具链) | ~15-20ms | 50-60 FPS | 1 |
额外优化建议
- 启用 CPU 性能模式:
sudo bash -c "echo 1 > /sys/devices/system/cpu/cpufreq/boost"
sudo bash -c "echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor"
-
检查后处理瓶颈:如果 BPU 推理很快但整体 FPS 低,可能是 Python 后处理太慢,考虑用 C++ 或 Cython 优化。
-
参考社区案例:查看 RDK X3 YOLOv5 30FPS 和 YOLOv5 部署优化 帖子获取具体代码。
需要你提供的信息
如果问题仍未解决,请提供:
- X3 板端系统版本(
hb_sys --version输出) - 使用的工具链版本
hb_mapper checker的完整日志hrt_model_exec model_info的输出
建议将完整排查过程沉淀到社区,帮助其他遇到类似问题的开发者!
model zoo 指的是?rdk_model_zoo/demos/detect/YOLOv5 at rdk_x3 · D-Robotics/rdk_model_zoo · GitHub
YOLOv5s_v2.0 BPU推理帧率为 38.2 FPS ,可以参考model zoo的推理demo自己写一个cpp的推理,让RDK studio来干就可以了