怎样合理分配CPU和BPU的利用率?

新手提问:目前在RDKX5上有两个在modelzoo上下载来的.bin模型分别负责姿态检测和场景识别,且有利用mediapipe负责手部检测,以及一个语言问答模块,功能模块写好之后接入主控制器,一上板做测试CPU在studio上显示70%至90%,板子也比较热,但是BPU利用率就比较低,不知道这样正常吗?或者怎么调整比较好?

我来帮你分析这个问题,并搜索社区中相关的优化建议。

你好!欢迎来到地瓜机器人社区。针对你在 RDK X5 上遇到的 CPU 占用高(70-90%)、板子发热,但 BPU 利用率低 的问题,这是新手在多模型并发场景下非常典型的情况。

:red_circle: 核心结论

这不正常,但很常见。 你的 BPU 没有被充分利用,导致大量本应由 BPU 处理的 AI 推理任务(姿态检测、场景识别、手部检测)跑在了 CPU 上,或者是因为数据预处理/后处理以及多进程调度占满了 CPU。

RDK X5 的设计初衷是 CPU 负责逻辑与预处理,BPU 负责高算力推理。如果 BPU 闲置而 CPU 满载,说明架构没搭好。


:hammer_and_wrench: 排查与优化步骤

第一步:精准定位瓶颈(不要只看 Studio 概览)

Studio 的监控可能有延迟或粒度不够。请在板子上通过 SSH 运行以下命令,观察真实负载:

# 1. 查看 CPU 各核心占用,确认是单核满载还是多核满载
top -H -p $(pgrep -f "你的主程序名")

# 2. 查看 BPU 详细利用率(关键命令)
hrut_somstatus
  • 观察点
    • hrut_somstatusBPUratio 是否真的低?(有些情况是瞬间推理,平均值看起来低,但瞬时可能高)。
    • CPU 占用高的是哪个线程?是 inference 线程,还是 preprocess (图像缩放/格式转换) 或 postprocess (解析结果) 线程?

第二步:检查模型部署方式(最常见原因)

你提到使用了 Model Zoo 的 .bin 模型和 MediaPipe。

  1. Model Zoo 模型 (.bin)

  2. MediaPipe 手部检测

    • 高风险点:MediaPipe 默认主要依赖 CPU (x86/ARM 优化),在 RDK X5 上如果不经过特殊移植或配置,它极大概率是纯 CPU 运行。这会瞬间吃掉大量 CPU 资源。
    • 建议
      • 检查是否有 RDK X5 适配版的 MediaPipe(利用 BPU 加速)。
      • 如果没有,考虑替换为 Model Zoo 中已有的手部检测模型(通常已有 BPU 优化版本)。
      • 或者降低 MediaPipe 的输入分辨率和运行频率(例如从 30FPS 降到 15FPS)。

第三步:优化数据流与并发设计

如果模型确实在 BPU 上跑,CPU 依然高,通常是数据搬运串行处理的问题。

  1. 异步推理(Async Inference)

    • 不要在一个循环里串行执行:预处理 -> 推理(阻塞) -> 后处理 -> 下一帧
    • 正确做法:使用多线程/多进程
      • 线程 A (采集):负责读摄像头,放入队列。
      • 线程 B (预处理):从队列取图,做 Resize/Normalize,放入 BPU 输入队列。
      • 线程 C (推理):BPU 异步回调,拿到结果放入输出队列。
      • 线程 D (后处理/逻辑):从输出队列取结果,做 NMS、逻辑判断。
    • 参考帖子:RDK x5 4G 运行 OpenCV 分辨率在 320*240,帧率仍然不高 中提到的“需要使用多线程,异步等方式来进行程序设计”。
  2. 减少内存拷贝

    • 确保图像数据在 CPU 和 BPU 之间传递时使用了共享内存(Zero-Copy),避免频繁的 memcpy。RDK 的 API 通常支持 fd 传递。
  3. 多模型调度

    • 你有两个 .bin 模型 + MediaPipe。如果它们同时全速运行,CPU 调度开销会很大。
    • 策略:根据业务需求降频。例如,场景识别不需要每帧都做(1-5Hz 即可),姿态检测可以高频(15-30Hz)。不要所有模型都锁死在 30FPS。

第四步:散热与频率检查

板子发热严重会导致 CPU/BPU 降频,进而导致处理变慢、占用率看似“虚高”(因为都在等资源)。

# 查看当前温度和频率
cat /sys/class/thermal/thermal_zone*/temp
# 或者使用
hrut_somstatus

:light_bulb: 给你的具体建议(Action Plan)

  1. 立刻替换 MediaPipe:这是最大的嫌疑对象。去 Model Zoo 找有没有类似的手部/关键点检测模型,替换掉 MediaPipe。
  2. 验证 BPU 真实负载:运行 hrut_somstatus,如果 ratio 确实很低,说明模型没跑在 BPU 上,检查代码中的推理接口调用。
  3. 改为异步架构:如果你的代码是单线程循环调用三个模型,必须重构为多线程/生产者-消费者模式。
  4. 降低非关键模型频率:场景识别没必要每帧运行,改为每秒运行 2-3 次即可,释放 CPU 给姿态检测。

:books: 推荐社区资源

建议:你可以先运行 hrut_somstatus 截图,并贴出你加载模型的核心代码片段(如何调用的),社区大佬能更精准地帮你定位是哪一行代码导致了 CPU 满载。

欢迎将排查结果或代码片段回复在此贴,我们一起解决!