文件最后提交记录最后更新时间
msprof support gil tracer Co-authored-by: eejiechu<wjchuee@foxmail.com> # message auto-generated for no-merge-commit merge: !83 merge gil_tracer_dev into master msprof support gil tracer Created-by: eejiechu Commit-by: eejiechu Merged-by: ascend-robot Description: # PR 合入模板 **注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。** ---- ## 1. 修改描述 - **修改原因:** msprof 支持 Python GIL 锁检测能力 - **修改内容:** 1. 引入 openeuler systrace 组件,新增 GIL Tracer 采集和转换脚本 2. 添加 GIL Tracer 使用文档 ---- ## 2. 功能验证 - [x] **功能自验** ![profiler_gil_tracer.PNG](https://raw.gitcode.com/user-images/assets/8551954/847f7e88-5bd3-497a-9ac9-c4d34baba18d/profiler_gil_tracer.PNG 'profiler_gil_tracer.PNG') - [ ] **本地自验用例截图** - [ ] **冒烟是否通过** (填入群链接的自验证报告中,如未通过,请说明原因:____________________ ,功能代码请主动申报添加冒烟) ---- ## 3. 分支合并要求 - [ ] **代码合并**(请确保将 master 分支的最新代码同步合并至 poc 分支及 pre-research 分支,同时保证 poc 分支的代码也已正确合并到 pre-research 分支。) ---- ## 3. 代码检视 - **要求:** - 合入代码超过 200 行,需三人以上会议检视。 - 检视密度≥1个/100行。 - 检视缺陷密度未达要求需提供说明。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [ ] **是否经过代码检视** - [ ] **是否具备 UT 测试用例看护** (如不符合,请说明原因:____________________) - **检视意见数:____ 条** (请填写本次检视的意见总数,用于commit合入前审视) ---- ## 4. 安全自检 ### Python、C++: - [ ] **对外接口新增/删除/变更后,资料要同步新增/删除/变更,新增接口入参校验参考外部输入表格** - [ ] **不允许私有的文件操作,需要使用公共模块的安全函数** - [ ] **任务结束后需要删除临时文件,同时需要考虑任务失败后,临时文件没有残留** - [ ] **数组访问需要校验越界场景,对除法需要做除零校验** - [ ] **需要对递归方法做递归深度校验,正则表达式必须做 ReDoS 校验** - [ ] **需要充分进行接口输入和返回值异常情况的校验** - [ ] **日志打印不要出现拼写或语法错误,不要暴露代码细节和敏感信息** ### C++: - [ ] **指针使用前需要判空** - [ ] **数值计算校验溢出和反转** - [ ] **不可存在内存泄漏(异常场景需要释放内存)** - [ ] **类型转换不能出现数据截断** - [ ] **拷贝字符串时,目的缓冲区至少比源缓冲区大 1** - [ ] **拷贝内存时,目的缓冲区不小于源缓冲区** - [ ] **内存释放后指针赋值为 nullptr** ---- ## 5. 变更知会 - [x] **资料修改** - [ ] **变更通知(消息知会 + 邮件知会)** ---- See merge request: Ascend/msprof!833 个月前
docs: msprof资料合入950产品 Co-authored-by: cai-weiwei1989<734267852@qq.com> # message auto-generated for no-merge-commit merge: !107 merge master into master docs: msprof资料合入950产品 Created-by: cai-weiwei1989 Commit-by: cai-weiwei1989 Merged-by: ascend-robot Description: # PR 合入模板 **注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。** ---- ## 1. 修改描述 - **修改原因:** 新增950系列产品 - **修改内容:** 1、docs/zh/msprof_parsing_instruct.md、misc/function_monitor/README.md中所有特性补充支持950PR/Ascend 950DT产品 2、docs/zh/profile_data_file_references.md新增950PR/Ascend 950DT产品特有数据soc_pmu(TLB命中率)、ccu_mission(集合通信指令信息)、ccu_channel(集合通信硬件加速单元带宽信息)、ub(UB带宽数据)、ub(UB带宽数据)以及全文数据补充支持950PR/Ascend 950DT产品 ## 2. 功能验证 - [ ] **功能自验** - [ ] **本地自验用例截图** - [ ] **冒烟是否通过** (填入群链接的自验证报告中,如未通过,请说明原因:____________________ ,功能代码请主动申报添加冒烟) ---- ## 3. 分支合并要求 - [ ] **代码合并**(请确保将 master 分支的最新代码同步合并至 poc 分支及 pre-research 分支,同时保证 poc 分支的代码也已正确合并到 pre-research 分支。) ---- ## 3. 代码检视 - **要求:** - 合入代码超过 200 行,需三人以上会议检视。 - 检视密度≥1个/100行。 - 检视缺陷密度未达要求需提供说明。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [ ] **是否经过代码检视** - [ ] **是否具备 UT 测试用例看护** (如不符合,请说明原因:____________________) - **检视意见数:____ 条** (请填写本次检视的意见总数,用于commit合入前审视) ---- ## 4. 安全自检 ### Python、C++: - [ ] **对外接口新增/删除/变更后,资料要同步新增/删除/变更,新增接口入参校验参考外部输入表格** - [ ] **不允许私有的文件操作,需要使用公共模块的安全函数** - [ ] **任务结束后需要删除临时文件,同时需要考虑任务失败后,临时文件没有残留** - [ ] **数组访问需要校验越界场景,对除法需要做除零校验** - [ ] **需要对递归方法做递归深度校验,正则表达式必须做 ReDoS 校验** - [ ] **需要充分进行接口输入和返回值异常情况的校验** - [ ] **日志打印不要出现拼写或语法错误,不要暴露代码细节和敏感信息** ### C++: - [ ] **指针使用前需要判空** - [ ] **数值计算校验溢出和反转** - [ ] **不可存在内存泄漏(异常场景需要释放内存)** - [ ] **类型转换不能出现数据截断** - [ ] **拷贝字符串时,目的缓冲区至少比源缓冲区大 1** - [ ] **拷贝内存时,目的缓冲区不小于源缓冲区** - [ ] **内存释放后指针赋值为 nullptr** ---- ## 5. 变更知会 - [ ] **资料修改** - [ ] **变更通知(消息知会 + 邮件知会)** ---- See merge request: Ascend/msprof!1072 个月前
msprof support gil tracer Co-authored-by: eejiechu<wjchuee@foxmail.com> # message auto-generated for no-merge-commit merge: !83 merge gil_tracer_dev into master msprof support gil tracer Created-by: eejiechu Commit-by: eejiechu Merged-by: ascend-robot Description: # PR 合入模板 **注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。** ---- ## 1. 修改描述 - **修改原因:** msprof 支持 Python GIL 锁检测能力 - **修改内容:** 1. 引入 openeuler systrace 组件,新增 GIL Tracer 采集和转换脚本 2. 添加 GIL Tracer 使用文档 ---- ## 2. 功能验证 - [x] **功能自验** ![profiler_gil_tracer.PNG](https://raw.gitcode.com/user-images/assets/8551954/847f7e88-5bd3-497a-9ac9-c4d34baba18d/profiler_gil_tracer.PNG 'profiler_gil_tracer.PNG') - [ ] **本地自验用例截图** - [ ] **冒烟是否通过** (填入群链接的自验证报告中,如未通过,请说明原因:____________________ ,功能代码请主动申报添加冒烟) ---- ## 3. 分支合并要求 - [ ] **代码合并**(请确保将 master 分支的最新代码同步合并至 poc 分支及 pre-research 分支,同时保证 poc 分支的代码也已正确合并到 pre-research 分支。) ---- ## 3. 代码检视 - **要求:** - 合入代码超过 200 行,需三人以上会议检视。 - 检视密度≥1个/100行。 - 检视缺陷密度未达要求需提供说明。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [ ] **是否经过代码检视** - [ ] **是否具备 UT 测试用例看护** (如不符合,请说明原因:____________________) - **检视意见数:____ 条** (请填写本次检视的意见总数,用于commit合入前审视) ---- ## 4. 安全自检 ### Python、C++: - [ ] **对外接口新增/删除/变更后,资料要同步新增/删除/变更,新增接口入参校验参考外部输入表格** - [ ] **不允许私有的文件操作,需要使用公共模块的安全函数** - [ ] **任务结束后需要删除临时文件,同时需要考虑任务失败后,临时文件没有残留** - [ ] **数组访问需要校验越界场景,对除法需要做除零校验** - [ ] **需要对递归方法做递归深度校验,正则表达式必须做 ReDoS 校验** - [ ] **需要充分进行接口输入和返回值异常情况的校验** - [ ] **日志打印不要出现拼写或语法错误,不要暴露代码细节和敏感信息** ### C++: - [ ] **指针使用前需要判空** - [ ] **数值计算校验溢出和反转** - [ ] **不可存在内存泄漏(异常场景需要释放内存)** - [ ] **类型转换不能出现数据截断** - [ ] **拷贝字符串时,目的缓冲区至少比源缓冲区大 1** - [ ] **拷贝内存时,目的缓冲区不小于源缓冲区** - [ ] **内存释放后指针赋值为 nullptr** ---- ## 5. 变更知会 - [x] **资料修改** - [ ] **变更通知(消息知会 + 邮件知会)** ---- See merge request: Ascend/msprof!833 个月前
gil trace convert fix Co-authored-by: eejiechu<wjchuee@foxmail.com> # message auto-generated for no-merge-commit merge: !111 merge gil_convert_fix into master gil trace convert fix Created-by: eejiechu Commit-by: eejiechu Merged-by: ascend-robot Description: # PR 合入模板 **注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。** ---- ## 1. 修改描述 - **修改原因:** systrace gil 检测工具,落盘的原始数据,tracing 格式由 B、E 改为 ts + dur 的格式,gil tracer 转换脚本需要适配 - **修改内容:** 1. 适配 ts + dur 的格式 2. 修改时间计算方式,避免精度损失 ---- ## 2. 功能验证 - [x] **功能自验** 原始数据 ![image.png](https://raw.gitcode.com/user-images/assets/8551954/2704f2d3-46d7-4baa-b665-a5ac52b13a27/image.png 'image.png') 转换后 ![image.png](https://raw.gitcode.com/user-images/assets/8551954/efb4f1f5-06a8-4b2c-b36e-7090fec49e70/image.png 'image.png') - [ ] **本地自验用例截图** - [ ] **冒烟是否通过** (填入群链接的自验证报告中,如未通过,请说明原因:____________________ ,功能代码请主动申报添加冒烟) ---- ## 3. 分支合并要求 - [ ] **代码合并**(请确保将 master 分支的最新代码同步合并至 poc 分支及 pre-research 分支,同时保证 poc 分支的代码也已正确合并到 pre-research 分支。) ---- ## 3. 代码检视 - **要求:** - 合入代码超过 200 行,需三人以上会议检视。 - 检视密度≥1个/100行。 - 检视缺陷密度未达要求需提供说明。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [ ] **是否经过代码检视** - [ ] **是否具备 UT 测试用例看护** (如不符合,请说明原因:____________________) - **检视意见数:____ 条** (请填写本次检视的意见总数,用于commit合入前审视) ---- ## 4. 安全自检 ### Python、C++: - [ ] **对外接口新增/删除/变更后,资料要同步新增/删除/变更,新增接口入参校验参考外部输入表格** - [ ] **不允许私有的文件操作,需要使用公共模块的安全函数** - [ ] **任务结束后需要删除临时文件,同时需要考虑任务失败后,临时文件没有残留** - [ ] **数组访问需要校验越界场景,对除法需要做除零校验** - [ ] **需要对递归方法做递归深度校验,正则表达式必须做 ReDoS 校验** - [ ] **需要充分进行接口输入和返回值异常情况的校验** - [ ] **日志打印不要出现拼写或语法错误,不要暴露代码细节和敏感信息** ### C++: - [ ] **指针使用前需要判空** - [ ] **数值计算校验溢出和反转** - [ ] **不可存在内存泄漏(异常场景需要释放内存)** - [ ] **类型转换不能出现数据截断** - [ ] **拷贝字符串时,目的缓冲区至少比源缓冲区大 1** - [ ] **拷贝内存时,目的缓冲区不小于源缓冲区** - [ ] **内存释放后指针赋值为 nullptr** ---- ## 5. 变更知会 - [ ] **资料修改** - [ ] **变更通知(消息知会 + 邮件知会)** ---- See merge request: Ascend/msprof!1112 个月前
msprof support gil tracer Co-authored-by: eejiechu<wjchuee@foxmail.com> # message auto-generated for no-merge-commit merge: !83 merge gil_tracer_dev into master msprof support gil tracer Created-by: eejiechu Commit-by: eejiechu Merged-by: ascend-robot Description: # PR 合入模板 **注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。** ---- ## 1. 修改描述 - **修改原因:** msprof 支持 Python GIL 锁检测能力 - **修改内容:** 1. 引入 openeuler systrace 组件,新增 GIL Tracer 采集和转换脚本 2. 添加 GIL Tracer 使用文档 ---- ## 2. 功能验证 - [x] **功能自验** ![profiler_gil_tracer.PNG](https://raw.gitcode.com/user-images/assets/8551954/847f7e88-5bd3-497a-9ac9-c4d34baba18d/profiler_gil_tracer.PNG 'profiler_gil_tracer.PNG') - [ ] **本地自验用例截图** - [ ] **冒烟是否通过** (填入群链接的自验证报告中,如未通过,请说明原因:____________________ ,功能代码请主动申报添加冒烟) ---- ## 3. 分支合并要求 - [ ] **代码合并**(请确保将 master 分支的最新代码同步合并至 poc 分支及 pre-research 分支,同时保证 poc 分支的代码也已正确合并到 pre-research 分支。) ---- ## 3. 代码检视 - **要求:** - 合入代码超过 200 行,需三人以上会议检视。 - 检视密度≥1个/100行。 - 检视缺陷密度未达要求需提供说明。 - 大于 1000 行代码原则上不允许合入,需进行备案。 - [ ] **是否经过代码检视** - [ ] **是否具备 UT 测试用例看护** (如不符合,请说明原因:____________________) - **检视意见数:____ 条** (请填写本次检视的意见总数,用于commit合入前审视) ---- ## 4. 安全自检 ### Python、C++: - [ ] **对外接口新增/删除/变更后,资料要同步新增/删除/变更,新增接口入参校验参考外部输入表格** - [ ] **不允许私有的文件操作,需要使用公共模块的安全函数** - [ ] **任务结束后需要删除临时文件,同时需要考虑任务失败后,临时文件没有残留** - [ ] **数组访问需要校验越界场景,对除法需要做除零校验** - [ ] **需要对递归方法做递归深度校验,正则表达式必须做 ReDoS 校验** - [ ] **需要充分进行接口输入和返回值异常情况的校验** - [ ] **日志打印不要出现拼写或语法错误,不要暴露代码细节和敏感信息** ### C++: - [ ] **指针使用前需要判空** - [ ] **数值计算校验溢出和反转** - [ ] **不可存在内存泄漏(异常场景需要释放内存)** - [ ] **类型转换不能出现数据截断** - [ ] **拷贝字符串时,目的缓冲区至少比源缓冲区大 1** - [ ] **拷贝内存时,目的缓冲区不小于源缓冲区** - [ ] **内存释放后指针赋值为 nullptr** ---- ## 5. 变更知会 - [x] **资料修改** - [ ] **变更通知(消息知会 + 邮件知会)** ---- See merge request: Ascend/msprof!833 个月前
README.md

GIL Tracer

简介

当前 AI 训练、推理业务场景中,广泛使用 Python 多线程执行算子下发、内存搬运等任务。然而,由于 Python 的全局解释器锁(GIL)的存在,导致在多线程环境下,Python 解释器只能同时执行一个线程,无法实现真正的并行计算,各线程需竞争 GIL 锁,导致锁抢占频繁、线程调度不均,引发模型运行效率下降。

针对以上问题,通过集成 openEuler sysTrace,我们设计了 GIL Tracer 工具,提供简单易用、无侵入性的 GIL 锁检测能力,用于分析 Python 多线程程序中 GIL 锁的使用情况,帮助开发人员识别系统性能瓶颈,优化线程调度策略,并与 MindStudio Profiler 数据联合分析,助力用户优化业务逻辑,提升应用整体性能。

使用流程

  1. 通过命令行或 API 接口两种方式采集 Python GIL 数据。
  2. 将采集的 Python GIL 数据进行后处理,转换为Chrome Trace Json格式。
  3. 联合 Profiler 数据导入MindStudio Insight,进行可视化展示,Profiler 数据采集可参见 MindStudio 性能调优工具

使用前准备

  1. 安装 sysTrace 工具,具体请参见 《sysTrace 安装指南》。

  2. 将 sysTrace 二进制工具添加到 PATH 环境变量中。

    export PATH=$PATH:<sysTrace_path>/systrace/build
    
  3. 配置 sysTrace 相关环境变量,包括:

    1. 运行时依赖,参见 《sysTrace 使用指南》。
    2. 日志、数据目录配置,参见 《sysTrace 采集使用指南》。
  4. 获取仓库中提供的采集、转换脚本 gil_trace_record.pygil_trace_convert.py,以及文件操作相关脚本(file_manager.py),推荐 Profiler 和 GIL 数据同步采集。

GIL 数据采集

支持命令行和 API 接口两种方式采集 GIL 数据。

方式一:命令行采集

功能说明

通过执行 gil_trace_record.py 脚本采集 GIL 数据。

命令格式

python gil_trace_record.py [--pid <PID>] [--duration <duration>]

参数说明

参数 可选/必选 说明
--pid 可选 指定要采集 GIL 数据的进程 PID 列表,多个 PID 之间用逗号分隔。默认值为 None,即采集所有运行在 NPU 上的 Python 进程。
--duration 可选 指定采集数据的持续时间,单位为s。默认值为 -1,表示持续采集,需要手动 Ctrl+C 结束采集。

使用示例

在 NPU 上启动模型 Python 进程,获取其 PID,假设为 12345,新创建一个终端窗口,用于运行 gil_trace_record.py 脚本(需要 root 权限)。

  • 示例1:采集指定 PID 为 12345 的进程的 GIL 数据,持续时间为 10 秒。

    python gil_trace_record.py --pid 12345 --duration 10
    
  • 示例2:采集所有运行在 NPU 上的 Python 进程的 GIL 数据,持续时间为 10 秒。

    python gil_trace_record.py --duration 10
    
  • 示例3:采集指定 PID 为 12345 的进程的 GIL 数据,手动结束采集。

    python gil_trace_record.py --pid 12345
    # 采集过程中,按下 Ctrl+C 键,即可手动结束采集
    

输出说明

采集结束后,会在 sysTrace 配置的数据目录下(默认 /home/sysTrace/GIL)生成对应的 GIL 数据文件,文件名格式为 GIL_<pid>_rank_<rank_id>.json,其中 <pid> 为进程 ID,<rank_id> 为模型进程所在的 Rank ID,默认值为 0。

方式二:API 接口采集

功能说明

gil_trace_record.py 中提供独立控制 GIL 数据采集启停的 API 接口,开发者可以将数据采集逻辑精细地嵌入到应用程序中,适合需要动态控制采集时机、条件触发采集或与业务逻辑深度集成的场景。

使用示例

  1. 开始采集接口

    gil_trace_record_start(pid_list=None, duration=-1)
    
  2. 结束采集接口

    gil_trace_record_stop()
    

示例代码如下:

import os
from gil_trace_record import gil_trace_record_start, gil_trace_record_stop

def train():
    # 采集当前进程的 GIL 数据,持续时间为 10 秒
    gil_trace_record_start(pid_list=[os.getpid()], duration=10)

    profiling_start()

    # 模型运行...

    profiling_stop()
    gil_trace_record_stop()

参数说明

参数 可选/必选 说明
pid_list 可选 指定要采集 GIL 数据的进程 PID 列表。默认值为 None,即采集所有运行在 NPU 上的 Python 进程。
duration 可选 指定采集数据的持续时间,单位为s。默认值为 -1,表示持续采集,要手动调用 gil_trace_record_stop() 结束采集。

输出说明

采集结束后,会在 sysTrace 配置的数据目录下(默认 /home/sysTrace/GIL)生成对应的 GIL 数据文件,文件名格式为 GIL_<pid>_rank_<rank_id>.json,其中 <pid> 为进程 ID,<rank_id> 为模型进程所在的 Rank ID,默认值为 0。

数据后处理

功能说明

gil_trace_convert.py 脚本用于将采集的 GIL 数据进行加工处理,转换为 Chrome Trace Json 格式,以便导入 MindStudio Insight 可视化工具联合展示与分析。

命令格式

python gil_trace_convert.py --input <input_file> --output <output_file>

参数说明

参数 可选/必选 说明
--input 必选 指定输入的 GIL 数据文件路径,需要指定到文件名。
--output 必选 指定输出的 Chrome Trace Json 文件路径,需要指定到文件名。

使用示例

python gil_trace_convert.py --input GIL_12345_rank_0.json --output GIL_12345_rank_0_trace.json

数据可视化

将转换后的 Chrome Trace Json 文件导入 MindStudio Insight 可视化工具,即可展示 GIL 数据的采集情况。

单独采集

GIL Trace

其中,每个色块表示一个 GIL 事件,分为三种类型:

  • take_gil:表示线程等待 GIL 锁。
  • hold_gil:表示线程持有 GIL 锁。
  • drop_gil:表示线程释放 GIL 锁。

与 Profiler 数据联合呈现

使用 API 接口同时采集 GIL 和 Profiler 数据,可将两者的采集数据联合展示在 MindStudio Insight 中,方便分析和优化 Python 多线程性能问题。

GIL Trace with Profiler

安全说明

由于 sysTrace 工具底层限制,执行 gil_trace_record.py 脚本或调用 gil_trace_record.py 中的 API 接口时,需要确保当前用户有足够的权限(root 权限),否则可能会导致采集数据失败。

数据后处理脚本 gil_trace_convert.py 无特殊权限要求,可在普通用户权限下运行。