【我的目标】
在RDX X5板子上,使用一个KWS(关键词唤醒)模型 (.bin格式) 进行实时的音频流推理。
【我的环境】
-
硬件平台 : 地平线 RDX X5 (已确认)
-
板端系统固件版本 : 3.0.1-beta (通过 cat /etc/version 获取)
-
开发方式 : 使用ROS2 Humble,通过Python节点调用地平线官方或社区提供的推理库。
【遇到的核心问题】
无论是使用hobot_dnn库,还是bpu_infer_lib库,在Python代码中调用模型的forward()方法进行推理时,程序都会在底层报错,最终导致推理失败。
最底层的C++错误日志高度一致,都是:
Generated code
[BPU_PLAT]Make sure inst Suport (X5) Platform!!
[BPU_PLAT]Incompatible Platform!!
[BPU_PLAT]FC Parse error!
[BPU_PLAT]Calloc fc space failed!
[BPU_PLAT]core mask[0x1] write fc to hw failed[-2]!!
[E][DNN][funccall_handle.cpp:141][Schedule] hb_bpu_core_set_fc_prio failed! error code: -2
同时,上层Python会捕获到一个异常,例如:
-
使用hobot_dnn时: TypeError: Input must be a NumPy array of type uint8 或 <method ‘forward’ … exception set>
-
使用bpu_infer_lib时: (直接报上述底层错误)
【我们已经进行的详细尝试和排查】
我们为了解决这个问题,进行了大量的、系统的排查,但问题依旧:
- 确认模型与平台匹配 :
-
我们使用的模型转换配置文件 (.yaml) 中,明确指定了march: bayes,确保是为X5平台编译。
-
我们也尝试过在hb_mapper makertbin命令中,通过–march bayes参数强制指定,生成的日志也确认编译目标是bayes。
- 尝试解决版本不匹配问题 (核心) :
-
现象 : 我们发现,板子上的运行时库版本为HBRT 3.15.54.0。而我们使用最新的OpenExplorer v1.2.8工具链(hb_mapper 1.24.3)生成的模型,其内部记录的model builder version为3.15.55.0,日志明确报了Inconsistency。
-
我们的尝试 : 我们怀疑是版本不匹配导致了硬件调度失败。因此,我们找到了并成功下载了旧版本的OpenExplorer v1.2.2和v1.2.6的Docker镜像 。使用这两个旧版工具链(hb_mapper版本分别为1.23.5和1.23.8)在纯净的工作目录 中重新编译了模型。
-
结果 : 新生成的模型,其内部model builder version变为了3.15.47.0,与板端的3.15.54.0更加接近。但是,部署到板子上运行后,依然报出完全相同的hb_bpu_core_set_fc_prio failed! error code: -2错误。
- 确认数据预处理流程 :
-
我们通过模型照片和yaml文件,确认了模型输入规格为(1, 200, 39),norm_type为no_preprocess。
-
我们在Python代码中,严格按照此规格,实现了fbank特征提取,并将数据量化为uint8类型。我们甚至使用了模型照片上提供的[-3.817, 3.558]范围来计算固定的量化参数。
-
结果 : 数据类型不匹配的TypeError消失了,但最终还是卡在了同一个硬件调度错误上。
[BPU_PLAT]core mask[0x1] write fc to hw failed[-2]!!
[E][DNN][funccall_handle.cpp:141]Schedule hb_bpu_core_set_fc_prio failed! error code: -2
hbDNNWaitTaskDone failed
arg_height=1 arg_width=200, arg_channels=39
[ERROR] [1751899801.914676689] [kws_final_node_authoritative_quant]: Keyword detection error: ‘NoneType’ object is not subscriptable
Traceback (most recent call last):
File “/root/kws_ros_ws/install/kws_detector/lib/python3.10/site-packages/kws_detector/kws_final_node.py”, line 126, in detect_keyword
confidence = float(np.max(results[0].buffer))
TypeError: ‘NoneType’ object is not subscriptable
[BPU_PLAT]Make sure inst Suport (X5) Platform!!
[BPU_PLAT]Incompatible Platform!!
[BPU_PLAT]FC Parse error!
[BPU_PLAT]Calloc fc space failed!
[BPU_PLAT]core mask[0x1] write fc to hw failed[-2]!!
[E][DNN][funccall_handle.cpp:141]Schedule hb_bpu_core_set_fc_prio failed! error code: -2
hbDNNWaitTaskDone failed