1. BPU trace理论基础
在学习BPU trace前,希望大家对UCP trace已经有简单的了解,详情可见工具链用户手册《统一计算平台(UCP)-UCP性能分析工具-UCP Trace使用说明》章节。
1.1 BPU Trace配置文件模板
在system模式下抓取BPU trace,需在perfetto配置文件中加入BPU trace的数据源,ucp_bpu_trace.cfg中已默认添加了BPU trace数据源,具体配置项如下所示:
bputrace_period_ms用于设置读取BPU trace的周期,可根据实际使用场景调整该参数,当BPU负载较大时,可以适当缩短读取周期,避免发生因读写速度不匹配导致的trace数据被覆盖的问题。
当前BPU Trace功能暂不支持运行时动态开启,若需在应用运行期间实时捕获BPU Trace数据,需在应用启动前通过命令手动开启该功能,具体操作指令为:echo 1 > /sys/devices/system/bpu/bpu0/trace
补充:配置时出现Invalid argument,可能的原因:bpu trace只支持在power_enable为0时设置,需要在 tracebox perfetto终端(先继续阅读) 先把这个节点修改为0。可参考如下方式修改
1.2 常用数据源介绍

2. BPU trace使用基础示例
2.1 基础示例运行
终端A
终端B
新建run.sh,内容如下
运行run.sh
为了能够抓取完整的数据,需要确保hrt_model_exec执行结束前,perfetto进程未退出,即终端B任务先结束。
2.2 BPU Trace文件解读

bpu_trace和ucp_trace进行了关联。
3. 进阶内容
3.1 偶发推理问题如何trace
问题描述:长稳测试时,偶发某问题,复现概率很低,希望在出现该问题前后,能抓到现场的trace info,应该如何进行?
处理建议:
对于不知何时触发问题的长稳测试场景,需要开启环境变量HB_UCP_ENABLE_PERFETTO,执行perfetto命令,将duration_ms设置为0进行持续抓取trace。
通过设置ucp_system.cfg中 buffers的fill_policy: RING_BUFFER,实现新数据对旧数据的buffer覆盖。
ucp_system.cfg配置信息如下所示,注意,buffer的大小,需要根据用户实际场景先验证下,根据实际情况调整。
3.2 BPU_LB_Schedule线程简介
问:ucp中bpu_lb_schedule线程的作用是什么?线程数是多少?

BPU-LB_schedule只有一个,如果有多个核,会根据核的数量启动BPU-Worker线程,单核就不启动。
问:bpu调度线程优先级能否提高,优先保证模型infer完成?
通过HB_UCP_SCHEDULE_PRIORITY环境变量控制。默认为1,数值越大,优先级越高。BPU的调度线程是FIFO。

3.3 CPU-OP-Processe线程简介
问:ucp中 CPU-OP-Processe线程的作用是什么?线程数是多少?
J6E上CPU-OP-Processe线程默认有6个,CPU-OP-Processe是根据CPU核的数量来启动线程,可以通过HB_UCP_ENABLE_CPU_BACKEND_CORE_NUM环境变量来设置数量。
在hbm模型中没有CPU算子时,trace示意图如下:

里面是没有CPU-OP-Processe线程的。
问:异构模型中(bpu+cpu),cpu算子如何分发?通过bpu_lb_schedule还是唤醒cpu_op_procese线程?
答:有task_schedule,bpu任务结束后,通过task_schedule进行cpu算子分发。没有CPU调度线程,CPU-OP-Process就是用于运行cpu算子,优先级是写死的0,也就是非FIFO。
