当前 AI 训练、推理业务场景中,广泛使用 Python 多线程执行算子下发、内存搬运等任务。然而,由于 Python 的全局解释器锁(GIL)的存在,导致在多线程环境下,Python 解释器只能同时执行一个线程,无法实现真正的并行计算,各线程需竞争 GIL 锁,导致锁抢占频繁、线程调度不均,引发模型运行效率下降。
针对以上问题,通过集成 openEuler ,我们设计了 GIL Tracer 工具,提供简单易用、无侵入性的 GIL 锁检测能力,用于分析 Python 多线程程序中 GIL 锁的使用情况,帮助开发人员识别系统性能瓶颈,优化线程调度策略,并与 MindStudio Profiler 数据联合分析,助力用户优化业务逻辑,提升应用整体性能。
使用流程
- 通过命令行或 API 接口两种方式采集 Python GIL 数据。
- 将采集的 Python GIL 数据进行后处理,转换为Chrome Trace Json格式。
- 联合 Profiler 数据导入,进行可视化展示,Profiler 数据采集可参见 或 中的性能工具部分。
将 sysTrace 二进制工具添加到 PATH 环境变量中。
[object Object]配置 sysTrace 相关环境变量,包括:
支持命令行和 API 接口两种方式采集 GIL 数据。
功能说明
通过执行 gil_trace_record.py 脚本采集 GIL 数据。
命令格式
参数说明
使用示例
在 NPU 上启动模型 Python 进程,获取其 PID,假设为 12345,新创建一个终端窗口,用于运行 gil_trace_record.py 脚本(需要 root 权限)。
示例1:采集指定 PID 为 12345 的进程的 GIL 数据,持续时间为 10 秒。
[object Object]示例2:采集所有运行在 NPU 上的 Python 进程的 GIL 数据,持续时间为 10 秒。
[object Object]示例3:采集指定 PID 为 12345 的进程的 GIL 数据,手动结束采集。
[object Object]
输出说明
采集结束后,会在 sysTrace 配置的数据目录下(默认 [object Object])生成对应的 GIL 数据文件,文件名格式为 [object Object],其中 [object Object] 为进程 ID,[object Object] 为模型进程所在的 Rank ID,默认值为 0。
功能说明
gil_trace_record.py 中提供独立控制 GIL 数据采集启停的 API 接口,开发者可以将数据采集逻辑精细地嵌入到应用程序中,适合需要动态控制采集时机、条件触发采集或与业务逻辑深度集成的场景。
使用示例
开始采集接口
[object Object]结束采集接口
[object Object]
示例代码如下:
参数说明
输出说明
采集结束后,会在 sysTrace 配置的数据目录下(默认 [object Object])生成对应的 GIL 数据文件,文件名格式为 [object Object],其中 [object Object] 为进程 ID,[object Object] 为模型进程所在的 Rank ID,默认值为 0。
功能说明
gil_trace_convert.py 脚本用于将采集的 GIL 数据进行加工处理,转换为 Chrome Trace Json 格式,以便导入 MindStudio Insight 可视化工具联合展示与分析。
命令格式
参数说明
使用示例
将转换后的 Chrome Trace Json 文件导入 MindStudio Insight 可视化工具,即可展示 GIL 数据的采集情况。
单独采集
其中,每个色块表示一个 GIL 事件,分为三种类型:
[object Object]:表示线程等待 GIL 锁。[object Object]:表示线程持有 GIL 锁。[object Object]:表示线程释放 GIL 锁。
与 Profiler 数据联合呈现
使用 API 接口同时采集 GIL 和 Profiler 数据,可将两者的采集数据联合展示在 MindStudio Insight 中,方便分析和优化 Python 多线程性能问题。
由于 sysTrace 工具底层限制,执行 gil_trace_record.py 脚本或调用 gil_trace_record.py 中的 API 接口时,需要确保当前用户有足够的权限(root 权限),否则可能会导致采集数据失败。
数据后处理脚本 gil_trace_convert.py 无特殊权限要求,可在普通用户权限下运行。