新手提问:目前在RDKX5上有两个在modelzoo上下载来的.bin模型分别负责姿态检测和场景识别,且有利用mediapipe负责手部检测,以及一个语言问答模块,功能模块写好之后接入主控制器,一上板做测试CPU在studio上显示70%至90%,板子也比较热,但是BPU利用率就比较低,不知道这样正常吗?或者怎么调整比较好?
我来帮你分析这个问题,并搜索社区中相关的优化建议。
你好!欢迎来到地瓜机器人社区。针对你在 RDK X5 上遇到的 CPU 占用高(70-90%)、板子发热,但 BPU 利用率低 的问题,这是新手在多模型并发场景下非常典型的情况。
核心结论
这不正常,但很常见。 你的 BPU 没有被充分利用,导致大量本应由 BPU 处理的 AI 推理任务(姿态检测、场景识别、手部检测)跑在了 CPU 上,或者是因为数据预处理/后处理以及多进程调度占满了 CPU。
RDK X5 的设计初衷是 CPU 负责逻辑与预处理,BPU 负责高算力推理。如果 BPU 闲置而 CPU 满载,说明架构没搭好。
排查与优化步骤
第一步:精准定位瓶颈(不要只看 Studio 概览)
Studio 的监控可能有延迟或粒度不够。请在板子上通过 SSH 运行以下命令,观察真实负载:
# 1. 查看 CPU 各核心占用,确认是单核满载还是多核满载
top -H -p $(pgrep -f "你的主程序名")
# 2. 查看 BPU 详细利用率(关键命令)
hrut_somstatus
- 观察点:
hrut_somstatus中BPU的ratio是否真的低?(有些情况是瞬间推理,平均值看起来低,但瞬时可能高)。- CPU 占用高的是哪个线程?是
inference线程,还是preprocess(图像缩放/格式转换) 或postprocess(解析结果) 线程?
第二步:检查模型部署方式(最常见原因)
你提到使用了 Model Zoo 的 .bin 模型和 MediaPipe。
-
Model Zoo 模型 (.bin):
- 确认调用方式:必须使用地平线提供的 C++/Python 推理 API (如
hrt或dnn) 才能调用 BPU。如果你只是加载了模型文件但用 OpenCV 的dnn模块或其他通用推理引擎跑,它们可能默认跑在 CPU 上。 - 参考案例:查看 Model Zoo 对应模型的
demo代码,确保你的集成方式与官方 Demo 一致。 - 社区资源:参考 RDK X5 上跑通 YOLOv5:从模型转换到实测的完整踩坑记录 或 万字长文,学弟一看就会的 RDKX5 模型转换及部署。
- 确认调用方式:必须使用地平线提供的 C++/Python 推理 API (如
-
MediaPipe 手部检测:
- 高风险点:MediaPipe 默认主要依赖 CPU (x86/ARM 优化),在 RDK X5 上如果不经过特殊移植或配置,它极大概率是纯 CPU 运行。这会瞬间吃掉大量 CPU 资源。
- 建议:
- 检查是否有 RDK X5 适配版的 MediaPipe(利用 BPU 加速)。
- 如果没有,考虑替换为 Model Zoo 中已有的手部检测模型(通常已有 BPU 优化版本)。
- 或者降低 MediaPipe 的输入分辨率和运行频率(例如从 30FPS 降到 15FPS)。
第三步:优化数据流与并发设计
如果模型确实在 BPU 上跑,CPU 依然高,通常是数据搬运和串行处理的问题。
-
异步推理(Async Inference):
- 不要在一个循环里串行执行:
预处理 -> 推理(阻塞) -> 后处理 -> 下一帧。 - 正确做法:使用多线程/多进程。
- 线程 A (采集):负责读摄像头,放入队列。
- 线程 B (预处理):从队列取图,做 Resize/Normalize,放入 BPU 输入队列。
- 线程 C (推理):BPU 异步回调,拿到结果放入输出队列。
- 线程 D (后处理/逻辑):从输出队列取结果,做 NMS、逻辑判断。
- 参考帖子:RDK x5 4G 运行 OpenCV 分辨率在 320*240,帧率仍然不高 中提到的“需要使用多线程,异步等方式来进行程序设计”。
- 不要在一个循环里串行执行:
-
减少内存拷贝:
- 确保图像数据在 CPU 和 BPU 之间传递时使用了共享内存(Zero-Copy),避免频繁的
memcpy。RDK 的 API 通常支持fd传递。
- 确保图像数据在 CPU 和 BPU 之间传递时使用了共享内存(Zero-Copy),避免频繁的
-
多模型调度:
- 你有两个
.bin模型 + MediaPipe。如果它们同时全速运行,CPU 调度开销会很大。 - 策略:根据业务需求降频。例如,场景识别不需要每帧都做(1-5Hz 即可),姿态检测可以高频(15-30Hz)。不要所有模型都锁死在 30FPS。
- 你有两个
第四步:散热与频率检查
板子发热严重会导致 CPU/BPU 降频,进而导致处理变慢、占用率看似“虚高”(因为都在等资源)。
# 查看当前温度和频率
cat /sys/class/thermal/thermal_zone*/temp
# 或者使用
hrut_somstatus
- 如果温度超过 80℃,请检查散热片是否贴好,风扇是否转动。
- 参考帖子:RDKX5 运行时温度过高。
给你的具体建议(Action Plan)
- 立刻替换 MediaPipe:这是最大的嫌疑对象。去 Model Zoo 找有没有类似的手部/关键点检测模型,替换掉 MediaPipe。
- 验证 BPU 真实负载:运行
hrut_somstatus,如果ratio确实很低,说明模型没跑在 BPU 上,检查代码中的推理接口调用。 - 改为异步架构:如果你的代码是单线程循环调用三个模型,必须重构为多线程/生产者-消费者模式。
- 降低非关键模型频率:场景识别没必要每帧运行,改为每秒运行 2-3 次即可,释放 CPU 给姿态检测。
推荐社区资源
- Model Zoo 使用指南:4.3. 模型仓库 (Model Zoo)
- 性能优化案例:RDK X5 BPU 负载测试
- 部署教程:万字长文,学弟一看就会的 RDKX5 模型转换及部署 (强烈推荐,涵盖了很多坑)
建议:你可以先运行 hrut_somstatus 截图,并贴出你加载模型的核心代码片段(如何调用的),社区大佬能更精准地帮你定位是哪一行代码导致了 CPU 满载。
欢迎将排查结果或代码片段回复在此贴,我们一起解决!