Host Profiling 常用检测工具¶
在AI模型训练与推理过程中,经常会遇到Device上执行空泡,最终定位到是Host侧下发卡顿导致的,下面介绍一些定位Host侧下发问题的常用方法
1. 获取子线程pytorch算子信息¶
由于社区pytorch profiler机制的限制,只能在一个线程里(即profiler开启的线程)采集torch算子(如aten::*)信息,子线程是采集不到的,如下图用例所示:
除了主线程外,另外启动三个子线程,调用同样的train,最终采集到的Profiling结果是这样的
此时可以使用torch-npu profiler在930版本新增的特性,在子线程中额外调用
enable_profiler_in_child_thread和disable_profiler_in_child_thread接口,即可以在子线程中也采集到框架侧的torch算子信息了
2. 获取框架侧所有线程的python调用栈¶
当前pytorch profiler对框架侧python调用栈数据进行了筛选,只会呈现有torchop或taskqueue线程的数据,如果用户进程中创建的python子线程比较多,需要观察其他子线程的调用栈,可以使用附件中的临时脚本python_trace_parse导出(后续会加到pytorch profiler正式版本中)
其中profiler_info.json和FRAMEWORK是pytorch profiler采集到的原始文件,用户采集时需要开启with_stack或者with_mudules选项
命令执行完成后会在当前目录下生成python_tracer.json文件,用perfetto或mindstudio insight打开,即可查看用户进程所有python线程的调用栈
通过对比模型前向线程或反向线程在下发算子耗时过长的时刻,其他python线程的行为,查看是否有线程切换或者GIL锁的情况,造成了下发线程的卡顿
3. 查看进程的系统调用¶
如果怀疑host侧下发卡顿是操作系统调用导致的,可以使用perf trace工具采集特定进程的系统调用情况,示例如下:
如采集pid为1724730的系统调用
默认情况下会采集所有的系统调用信息,数量可能会很多,可以加一个duration参数控制,只采集耗时大于duration(单位:ms)的系统调用
4. perf-trace-viewer¶
perf-trace-viewer是一款开源工具,基于perf sched命令,采集cpu核上的调度流水图,对于判断绑核是否成功,模型进程在执行过程中是否被其他进程抢占,非常有用。
首先从https://github.com/cisco-open/perf-trace-viewer/releases下载最新的perf-trace-viewer工具脚本collect和perf_trace_viewer
在模型运行过程中,在另一个终端执行
等待采集完成后会在当前目录下生成perf-data-***.tar.xz的文件,执行perf_trace_viewer命令进行解析
等待解析完成后,将生成的CPU调度流水图cpu_trace.json拖到perfetto中,即可查看这10s中CPU核上进程的调度,以及用户进程里每个线程的调度情况
CPU调度流水图对于判断绑核是否成功,算子下发线程(acl_thread)在执行过程中是否被抢占,是否发生了迁移的情况非常有帮助
5. perf record¶
Perf record 是 Linux 系统性能分析工具 perf 的核心命令,用于录制系统的性能数据(如 CPU 周期、指令、缓存命中、分支预测等事件),并生成一个名为 perf.data 的分析文件,供后续的 perf report 或其他工具进行深入分析
- 执行以下命令采集进程
1275545在10秒内的性能数据,生成perf.data文件
- 将
perf.data转换为中间脚本格式
- 折叠堆栈跟踪(需要FlameGraph脚本)
- 生成SVG火焰图
6. trace-cmd¶
trace-cmd是 Linux 上强大的内核跟踪工具 ftrace 的一个前端命令行工具。它封装了直接操作 /sys/kernel/debug/tracing/ 下复杂文件的过程,提供了更简单易用的命令接口
下面介绍几个核心子命令的使用方法
1) trace-cmd record - 记录跟踪数据¶
这是最常用的命令,用于开始捕获跟踪数据。
- 功能:启用指定的跟踪器或事件,并开始记录内核活动,直到被中断(如
Ctrl-C)。数据会保存在当前目录的trace.dat文件中。 -
常用选项:
-
-p <tracer>: 指定跟踪器(plugin),如function,function_graph,nop等。 -e <event>: 启用特定跟踪事件。可以指定多个-e。使用-e选项时,-p指定的跟踪器会被忽略。-e sched:sched_switch(跟踪进程切换)-e irq:irq_handler_entry(跟踪中断处理函数入口)-e all(启用所有事件,慎用,数据量巨大)
-f <filter>: 设置过滤器,仅跟踪符合条件的函数或事件。-f 'pid == 1234'(只跟踪 PID 为 1234 的进程)-f 'comm == python'(只跟踪名为python的进程)
-l <function>: 仅跟踪指定的函数(相当于设置set_ftrace_filter)。-n <function>: 不跟踪指定的函数(相当于设置set_ftrace_notrace)。-F <command>: 执行指定的命令 (<command>) 并只跟踪该命令及其子进程的运行情况。-o <file>: 指定输出文件名,默认为trace.dat。- 示例:
# 记录 10 秒内的函数调用图(function_graph),然后自动停止
trace-cmd record -p function_graph -D 10
# 跟踪进程调度切换事件(sched_switch),并记录到 my_trace.dat 文件
trace-cmd record -e sched:sched_switch -o my_trace.dat
# 跟踪名为 'nginx' 的进程的内核函数调用
trace-cmd record -p function -f 'comm == nginx'
# 跟踪执行 `ls -l` 命令时发生的所有 irq 事件
trace-cmd record -e irq -F ls -l
2) trace-cmd report - 解析和显示跟踪数据¶
- 功能:读取由
record命令生成的trace.dat文件,并以人类可读的格式打印跟踪结果。 -
常用选项:
-
-i <file>: 指定输入文件,默认为trace.dat。 -l: 显示记录文件中包含的事件列表。-f或-F: 与record类似,用于过滤报告输出。-w: 按 CPU 号分栏显示,方便查看多核上的并行事件。--cpu <cpu>: 只显示指定 CPU 上的事件。- 示例:
# 显示默认 trace.dat 文件的内容
trace-cmd report
# 显示特定文件的内容,并过滤出进程名为 'bash' 的事件
trace-cmd report -i my_trace.dat -f 'comm == bash'
# 以分栏格式显示,查看多核情况
trace-cmd report -w
3) trace-cmd start / trace-cmd stop - 开始/停止跟踪¶
- 功能:
start开始跟踪并将数据写入内核缓冲区(环形缓冲区),stop停止跟踪。数据不会自动保存到文件,需要后续用extract子命令提取。 - 使用场景:适用于需要长时间跟踪,但只想在特定事件发生后(如出现性能问题时)才保存快照的场景。
- 示例:
4) trace-cmd stat - 显示跟踪状态¶
- 功能:显示当前
ftrace的配置状态,类似于查看/sys/kernel/debug/tracing/下的多个文件。 - 示例:
5) trace-cmd list - 列出可用选项¶
- 功能:列出系统支持的事件、跟踪器和函数。
-
常用选项:
-
-e: 列出所有可用的跟踪事件。 -t: 列出所有可用的跟踪器(tracers)。-f: 列出所有可跟踪的内核函数。- 示例:
# 查看系统支持的所有跟踪事件
trace-cmd list -e
# 查看系统支持哪些跟踪器
trace-cmd list -t
# 查看所有可跟踪的函数(列表很长)
trace-cmd list -f | head -20
6) trace-cmd restore - 恢复跟踪设置¶
- 功能:清除当前所有跟踪设置,将其重置为默认状态(通常是
nop跟踪器)。在多次实验后,用于清理现场,避免之前的设置干扰后续操作。 - 示例:
7) trace-cmd stream - 实时流式输出¶
- 功能:实时输出跟踪事件到控制台,类似于
tail -f日志文件。 - 示例:
8) trace-cmd hist - 查看直方图¶
- 功能:对跟踪数据进行分析并生成直方图,用于统计事件的延迟分布、调用次数等,非常强大。
- 示例:
典型工作流程
- 探索:使用
trace-cmd list -e或trace-cmd list -t确定要跟踪的事件或跟踪器。 - 记录:使用
trace-cmd record并配合-e,-p,-f等选项捕获数据。 - 分析:使用
trace-cmd report查看原始时间线,或使用trace-cmd hist进行统计分析。 - 清理:使用
trace-cmd restore重置设置。
重要提示
- 需要 root 权限:大多数
trace-cmd操作都需要sudo权限。 - 缓冲区大小:如果跟踪数据量很大,可能会覆盖环形缓冲区中的旧数据。可以通过
-b选项(record子命令)或调整/sys/kernel/debug/tracing/buffer_size_kb来增加缓冲区大小。 - 开销:跟踪所有函数或事件会产生显著性能开销,并生成巨大的数据文件,请在测试环境中谨慎使用
-e all或广泛的函数跟踪。
通过组合这些子命令,可以高效地对 Linux 内核进行深入的性能分析和故障诊断
示例 跟踪指定进程的内核函数调用