专栏算法工具链【J6】BPU trace简介与实操

【J6】BPU trace简介与实操

Jade-self2025-07-18
144
0

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 常用数据源介绍

Description

2. BPU trace使用基础示例

2.1 基础示例运行

  • 终端A

  • 终端B

新建run.sh,内容如下

运行run.sh

为了能够抓取完整的数据,需要确保hrt_model_exec执行结束前,perfetto进程未退出,即终端B任务先结束。

2.2 BPU Trace文件解读

使用官方的 Perfetto UI 打开ucp_traceprocessor处理后的ucp_new.pftrace,展示从UCP模型推理任务的创建,提交,调度执行,直至任务完成执行并最终释放的完整流程。
Description

bpu_trace和ucp_trace进行了关联。

3. 进阶内容

3.1 偶发推理问题如何trace

问题描述:长稳测试时,偶发某问题,复现概率很低,希望在出现该问题前后,能抓到现场的trace info,应该如何进行?

处理建议:

  1. 对于不知何时触发问题的长稳测试场景,需要开启环境变量HB_UCP_ENABLE_PERFETTO,执行perfetto命令,将duration_ms设置为0进行持续抓取trace。

  2. 通过设置ucp_system.cfg中 buffers的fill_policy: RING_BUFFER,实现新数据对旧数据的buffer覆盖。

  3. ucp_system.cfg配置信息如下所示,注意,buffer的大小,需要根据用户实际场景先验证下,根据实际情况调整。

3.2 BPU_LB_Schedule线程简介

问:ucp中bpu_lb_schedule线程的作用是什么?线程数是多少?

Description
答:BPU_LB_Schedule只有1个线程,负责bpu任务调度。
BPU-LB_schedule只有一个,如果有多个核,会根据核的数量启动BPU-Worker线程,单核就不启动。

问:bpu调度线程优先级能否提高,优先保证模型infer完成?

答:可以提高,BPU-LB_schedule是负责下发bpu任务的线程,需要占用CPU资源。
通过HB_UCP_SCHEDULE_PRIORITY环境变量控制。默认为1,数值越大,优先级越高。BPU的调度线程是FIFO。
Description

3.3 CPU-OP-Processe线程简介

问:ucp中 CPU-OP-Processe线程的作用是什么?线程数是多少?

答:CPU-OP-Processe线程负责cpu算子计算。
J6E上CPU-OP-Processe线程默认有6个,CPU-OP-Processe是根据CPU核的数量来启动线程,可以通过HB_UCP_ENABLE_CPU_BACKEND_CORE_NUM环境变量来设置数量。

在hbm模型中没有CPU算子时,trace示意图如下:

Description

里面是没有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。

算法工具链
技术深度解析社区征文征程6杂谈
评论0
0/1000