diff --git a/README.md b/README.md index 400cb2673be8f40077b79b7af0d388f91535aa85..cb3b8bc27998eb600e248efee0c09f678ab335df 100644 --- a/README.md +++ b/README.md @@ -23,20 +23,19 @@ mstt包括精度工具(msprobe)和性能工具(msprof-analyze),分析 [MindStudio Probe(msprobe,MindStudio 精度调试工具)](./debug/accuracy_tools/msprobe)。 +## [性能工具](./profiler) -### [性能工具](https://gitee.com/ascend/mstt/tree/master/profiler) +[msprof-analyze(MindStudio Profiler Analyze 性能分析工具)](./profiler/msprof_analyze/) -1. [compare_tools(性能比对工具)](https://gitee.com/ascend/mstt/tree/master/profiler/compare_tools) +基于采集的性能数据进行分析,识别AI作业中的性能瓶颈。 - 提供NPU与GPU性能拆解功能以及算子、通信、内存性能的比对功能。 + [affinity_cpu_bind (亲和性cpu绑核工具) ](./profiler/affinity_cpu_bind) -2. [cluster_analyse(集群分析工具)](https://gitee.com/ascend/mstt/tree/master/profiler/cluster_analyse) - - 提供多机多卡的集群分析能力(基于通信域的通信分析和迭代耗时分析), 当前需要配合MindStudio Insight的集群分析功能使用。 + 提供亲和性CPU绑核能力,改善host_bound调度问题。 -3. [affinity_cpu_bind (亲和性cpu绑核工具) ](https://gitee.com/ascend/mstt/tree/master/profiler/affinity_cpu_bind) +[msMonitor](./msmonitor) - 提供亲和性CPU绑核能力,改善host_bound调度问题。 + MindStudio一站式在线监控工具。 ### [Tensorboard](https://gitee.com/ascend/mstt/tree/master/plugins/tensorboard-plugins/tb_plugin) diff --git a/profiler/msprof_analyze/README.md b/profiler/msprof_analyze/README.md index c3be2acd6ef1a33c629a07cba10be953036cfefd..6541310ee47c373b437fef7a89bc7728c1cd011a 100644 --- a/profiler/msprof_analyze/README.md +++ b/profiler/msprof_analyze/README.md @@ -1,97 +1,12 @@ -# 性能工具 - -MindStudio Training Tools工具针对训练&大模型场景,提供端到端性能调优工具msprof-analyze:用户采集到性能数据后,由MindStudio Training Tools的性能工具msprof-analyze提供统计、分析以及相关的调优建议。 - -## NPU性能数据采集 - -目前MindStudio Training Tools工具主要支持对Ascend PyTorch Profiler接口采集的性能数据进行分析,请参考官方文档:[Ascend PyTorch Profiler数据采集与分析](https://www.hiascend.com/document/detail/zh/canncommercial/80RC1/devaids/auxiliarydevtool/atlasprofiling_16_0006.html)。 - -### 环境和依赖 - -- 硬件环境请参见《[昇腾产品形态说明](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fdocument%2Fdetail%2Fzh%2Fcanncommercial%2F80RC22%2Fquickstart%2Fquickstart%2Fquickstart_18_0002.html)》。 -- 软件环境请参见《[CANN 软件安装指南](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fdocument%2Fdetail%2Fzh%2Fcanncommercial%2F80RC22%2Fsoftwareinst%2Finstg%2Finstg_0000.html%3FMode%3DPmIns%26OS%3DUbuntu%26Software%3DcannToolKit)》安装昇腾设备开发或运行环境,即toolkit软件包。 - -以上环境依赖请根据实际环境选择适配的版本。 - -### 版本配套说明 - -- Ascend PyTorch Profiler接口支持AscendPyTorch 1.11.0或更高版本,支持的PyTorch和CANN以及PyTorch和Python软件版本配套关系请参见《[Ascend Extension for PyTorch插件](https://gitee.com/ascend/pytorch)》。 -- Ascend PyTorch Profiler接口支持的固件驱动版本与配套CANN软件支持的固件驱动版本相同,开发者可通过“[昇腾社区-固件与驱动](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fhardware%2Ffirmware-drivers%2Fcommunity%3Fproduct%3D2%26model%3D28%26cann%3D8.0.RC3.alpha003%26driver%3D1.0.25.alpha)”页面根据产品型号与CANN软件版本获取配套的固件与驱动。 - -### 采集方式一:通过with语句进行采集 - -```python -import torch_npu -experimental_config = torch_npu.profiler._ExperimentalConfig( - aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization, - profiler_level=torch_npu.profiler.ProfilerLevel.Level1, - l2_cache=False -) -with torch_npu.profiler.profile( - activities=[ - torch_npu.profiler.ProfilerActivity.CPU, - torch_npu.profiler.ProfilerActivity.NPU - ], - record_shapes=True, - profile_memory=True, - with_stack=True, - experimental_config=experimental_config, - schedule=torch_npu.profiler.schedule(wait=10, warmup=0, active=1, repeat=1), - on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./profiling_data") -) as prof: - # 模型训练代码 - for epoch, data in enumerate(dataloader): - train_model_one_step(model, data) - prof.step() -``` - -### 采集方式二:start,stop方式进行采集 - -```python -import torch_npu -experimental_config = torch_npu.profiler._ExperimentalConfig( - aic_metrics=torch_npu.profiler.AiCMetrics.PipeUtilization, - profiler_level=torch_npu.profiler.ProfilerLevel.Level1, - l2_cache=False -) -prof = torch_npu.profiler.profile( - activities=[ - torch_npu.profiler.ProfilerActivity.CPU, - torch_npu.profiler.ProfilerActivity.NPU - ], - record_shapes=True, - profile_memory=True, - with_stack=True, - experimental_config=experimental_config, - on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./profiling_data")) -# 模型训练代码 -for epoch, data in enumerate(dataloader): - if epoch == 11: - prof.start() - train_model_one_step(model, data) - prof.step() - if epoch == 11: - prof.stop() -``` - -### NPU性能数据目录结构 +# msprof-analyze -ascend pytorch profiler数据目录结构如下: - -``` -|- ascend_pytorch_profiling - |- * _ascend_pt - |- ASCEND_PROFILER_OUTPUT - |- trace_view.json - |- FRAMEWORK - |- PROF_XXX - |- profiler_info.json - |- * _ascend_pt -``` +## 📌 简介 +msprof-analyze(MindStudio Profiler Analyze)是MindStudio全流程工具链推出的性能分析工具,基于采集的性能数据进行分析,识别AI作业中的性能瓶颈。 -## 安装 +## 🔧 安装 -性能工具的安装方式包括:**pip安装**、**下载whl包安装**和**源代码编译安装**。 +msprof-analyze的安装方式包括:**pip安装**、**下载whl包安装**和**源代码编译安装**。 +本分支建议源代码编译安装方式。 ### pip安装 @@ -99,7 +14,8 @@ ascend pytorch profiler数据目录结构如下: pip install msprof-analyze ``` -使用`pip install msprof-analyze==版本号`可安装指定版本的包,支持1.2.1及之后版本,版本号参见“**下载whl包安装**”。 +使用`pip install msprof-analyze==版本号`可安装指定版本的包,使用采集性能数据对应的CANN版本号即可。 +如不清楚版本号可不指定,使用最新程序包。 pip命令会自动安装最新的包及其配套依赖。 @@ -112,28 +28,8 @@ Successfully installed msprof-analyze-{version} ### 下载whl包安装 1. whl包获取。 + 请通过[发布程序包下载链接](#发布程序包下载链接)下载whl包。 - 请通过下表链接下载profiler工具whl包。 - -| profiler版本 | 发布日期 | 下载链接 | 校验码 | -|------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------ | -| 2.0.0 | 2025-02-08 | [msprof_analyze-2.0.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/2.0.0/msprof_analyze-2.0.0-py3-none-any.whl) | 8e44e5f3e7681c377bb2657a600ad9841d3bed11061ddd7844c30e8a97242101 | -| 1.3.4 | 2025-01-20 | [msprof_analyze-1.3.4-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.4/msprof_analyze-1.3.4-py3-none-any.whl) | 8de92188d1a97105fb14cadcb0875ccd5f66629ee3bb25f37178da1906f4cce2 | -| 1.3.3 | 2024-12-26 | [msprof_analyze-1.3.3-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.3/msprof_analyze-1.3.3-py3-none-any.whl) | 27676f2eee636bd0c65243f81e292c7f9d30d7f985c772ac9cbaf10b54d3584e | -| 1.3.2 | 2024-12-20 | [msprof_analyze-1.3.2-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.2/msprof_analyze-1.3.2-py3-none-any.whl) | ceb227e751ec3a204135be13801f1deee6a66c347f1bb3cdaef596872874df06 | -| 1.3.1 | 2024-12-04 | [msprof_analyze-1.3.1-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.1/msprof_analyze-1.3.1-py3-none-any.whl) | eae5548804314110a649caae537f2c63320fc70ec41ce1167f67c1d674d8798e | -| 1.3.0 | 2024-10-12 | [msprof_analyze-1.3.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.0/msprof_analyze-1.3.0-py3-none-any.whl) | 8b09758c6b5181bb656a95857c32852f898c370e7f1041e5a08e4f10d5004d48 | -| 1.2.5 | 2024-09-25 | [msprof_analyze-1.2.5-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.5/msprof_analyze-1.2.5-py3-none-any.whl) | aea8ae8deac07b5b4980bd2240da27d0eec93b9ace9ea9eb2e3a05ae9072018b | -| 1.2.4 | 2024-09-19 | [msprof_analyze-1.2.4-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.4/msprof_analyze-1.2.4-py3-none-any.whl) | 7c392e72c3347c4034fd3fdfcccb1f7936c24d9c3eb217e2cc05bae1347e5ab7 | -| 1.2.3 | 2024-08-29 | [msprof_analyze-1.2.3-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.3/msprof_analyze-1.2.3-py3-none-any.whl) | 354a55747f64ba1ec6ee6fe0f05a53e84e1b403ee0341ec40cc216dd25fda14c | -| 1.2.2 | 2024-08-23 | [msprof_analyze-1.2.2-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.2/msprof_analyze-1.2.2-py3-none-any.whl) | ed92a8e4eaf5ada8a2b4079072ec0cc42501b1b1f2eb00c8fdcb077fecb4ae02 | -| 1.2.1 | 2024-08-14 | [msprof_analyze-1.2.1-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.1/msprof_analyze-1.2.1-py3-none-any.whl) | 7acd477417bfb3ea29029dadf175d019ad3212403b7e11dc1f87e84c2412c078 | -| 1.2.0 | 2024-07-25 | [msprof_analyze-1.2.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.0/msprof_analyze-1.2.0-py3-none-any.whl) | 6a4366e3beca40b4a8305080e6e441d6ecafb5c05489e5905ac0265787555f37 | -| 1.1.2 | 2024-07-12 | [msprof_analyze-1.1.2-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.1.2/msprof_analyze-1.1.2-py3-none-any.whl) | af62125b1f9348bf491364e03af712fc6d0282ccee3fb07458bc9bbef82dacc6 | -| 1.1.1 | 2024-06-20 | [msprof_analyze-1.1.1-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.1.1/msprof_analyze-1.1.1-py3-none-any.whl) | 76aad967a3823151421153d368d4d2f8e5cfbcb356033575e0b8ec5acea8e5e4 | -| 1.1.0 | 2024-05-28 | [msprof_analyze-1.1.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.1.0/msprof_analyze-1.1.0-py3-none-any.whl) | b339f70e7d1e45e81f289332ca64990a744d0e7ce6fdd84a8d82e814fa400698 | -| 1.0 | 2024-05-10 | [msprof_analyze-1.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.0/msprof_analyze-1.0-py3-none-any.whl) | 95b2f41c8c8e8afe4887b738c8cababcb4f412e1874483b6adae4a025fcbb7d4 | - 2. whl包校验。 1. 根据以上下载链接下载whl包到Linux安装环境。 @@ -201,50 +97,220 @@ Successfully installed msprof-analyze-{version} pip3 install ./msprof_analyze-{version}-py3-none-any.whl ``` -## 卸载和更新 +### 卸载和更新 -若需要更新工具,请先卸载旧版本后再重新安装新版本,如下操作: +若需要更新工具,请先卸载旧版本后再重新安装新版本,操作如下: +```bash +# 卸载旧版本 +pip3 uninstall msprof-analyze +# 安装新版本 +pip3 install ./msprof_analyze-{version}-py3-none-any.whl +``` -1. 卸载 +## 🧰 使用方法 +### 数据准备 +msprof-analyze需要传入采集的性能数据文件夹,如何采集性能数据请参见[采集profiling性能数据指导](#采集profiling性能数据指导)章节。 - ```bash - pip3 uninstall msprof-analyze - ``` - -2. 更新 - - ```bash - pip3 install ./msprof_analyze-{version}-py3-none-any.whl - ``` - -## 工具使用 +### 命令格式 +msprof-analyze性能分析工具通过命令行方式启动性能分析。命名格式如下: +``` +msprof-analyze -m [feature_option] -d [global_option] [analyze_option] +``` +* `-m`指定分析能力,`[feature_option]`可指定对应特性,详见[分析特性介绍](#分析特性介绍)章节,必选。 +* ``为profiling性能数据文件夹,必选。 +* `[global_option]`为全局参数,详见[全局参数说明](#全局参数)章节,可选。 +* `[analyze_option]`为分析能力参数,详见[分析能力参数说明](#分析能力参数)章节,可选。 + +详细使用样例请参考[使用样例](#使用样例)章节。 + +### 参数说明 +#### 全局参数 +主要包括输入输出与格式参数、执行参数以及帮助信息等。 + + | 参数名 | 说明 | 是否必选 | + | --------------------- | ------------------------------------------------------------ | -------- | + | --profiling_path或-d | 性能数据汇集目录。未配置-o参数时,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据。 | 是 | + | --output_path或-o | 自定义输出路径,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据。 | 否 | + | --mode或-m | 分析能力选项,取值详见[分析能力特性说明](#分析特性介绍)表。 默认参数为all,all会执行step_trace_time和communication_matrix通信矩阵和communication_time通信耗时分析能力 | 否 | + | --export_type | 设置导出的数据形式。取值为db(.db格式文件)和notebook(Jupyter Notebook文件),默认值为db。 | 否 | + | --force | 强制执行,配置后可强制跳过如下情况:
指定的目录、文件的用户属主不属于当前用户,忽略属主判断直接执行。
csv文件大于5G、json文件大于10G、db文件大于8G,忽略文件过大判断直接执行。
配置该参数表示开启强制执行,默认未配置表示关闭。 | 否 | + | --parallel_mode | 设置收集多卡、多节点db数据时的并发方式。取值为concurrent(使用concurrent.feature进程池实现并发)。| 否 | + | --data_simplification | 数据精简模式。对于数据量过大的性能数据db文件,可以通过配置该参数将数据精简,并提高工具分析效率。配置该参数表示开启数据精简,默认未配置表示关闭,当前参数只针对all/communication_matrix/communication_time分析能力。 | 否 | + | -v,-V
--version | 查看版本号。 | 否 | + | -h,-H
--help | 命令行参数帮助信息。 | 否 | + +#### 分析能力参数 + + | 参数名 | 说明 | 是否必选 | + | --------------------- | ------------------------------------------------------------ | -------- | + | --rank_list | 对特定Rank上的数据进行统计,默认值为all(表示对所有Rank进行统计),须根据实际卡的Rank ID配置。应配置为大于等于0的整数,若所配置的值大于实际训练所运行的卡的Rank ID,则仅解析合法的RankID的数据,比如当前环境Rank ID为0到7,实际训练运行0到3卡,此时若配置Rank ID为0, 3, 4或不存在的10等其他值,则仅解析0和3。配置示例:--rank_list 0, 1, 2。
**需要对应分析能力适配才可使用, 当前分析能力设置cann_api_sum、compute_op_sum、hccl_sum、mstx_sum时支持。** | 否 | + | --step_id | 性能数据Step ID,配置后对该Step的性能数据进行分析。需配置性能数据中实际存在的Step ID,默认未配置,表示全量分析。配置示例:--step_id=1。
**需要对应分析能力适配才可使用, 当前只有分析能力设置cann_api_sum、compute_op_sum、hccl_sum、mstx_sum时支持。** | 否 | + | --top_num | 设置TopN耗时的通信算子的数量,默认值为15,配置示例:--top_num 20。
**只有-m配置hccl_sum时可配置此参数。** | 否 | + | --exclude_op_name | 控制compute_op_name结果是否包含op_name,示例:--exclude_op_name,后面不需要跟参数。
**只有-m配置compute_op_sum时可配置此参数。** | 否 | + | --bp | 要对比的标杆集群数据,示例:--bp {bp_cluster_profiling_path},表示profiling_path和bp_cluster_profiling_path的数据进行对比。
**只有-m配置cluster_time_compare_summary时可配置此参数。** | 否 | + +#### 子功能命令参数 +| 参数 | 说明 | +|---------------------|-------------------------------------------------------------------------------------------------------------------------| +| compare | [compare(性能比对子功能)](./compare_tools/README.md)。提供NPU与GPU性能拆解功能以及算子、通信、内存性能的比对功能。| +| advisor | [advisor(专家建议子功能)](./advisor/README.md)。基于性能数据进行分析,并输出性能调优建议。 | +| cluster | [cluster_analyse(集群分析工具)](./cluster_analyse/README.md)。提供集群分析能力,已作为默认子命令,不设置即为cluster集群分析功能 | +| auto-completion | 自动补全。配置后在当前视图下配置msprof-analyze工具所有的子参数时,可以使用Tab将所有子参数自动补全。 | + + +### 分析特性介绍 + +#### 拆解对比类 + +| 分析能力 | 介绍 | 介绍链接 | +|---------|----------------------------------------|-----| +| cluster_time_summary | 性能数据细粒度拆解,替换step_trace_time.csv内容。 | [link](./docs/features/cluster_time_summary.md) | +| cluster_time_compare_summary | 性能数据细粒度对比。 | [link](./docs/features/cluster_time_compare_summary.md) | +| module_statistic | 模型结构拆解功能。 | [link](./docs/features/module_statistic.md) | + + +#### 计算类特性 + +| 分析能力 | 介绍 | 介绍链接 | +|---------|----------------------------------------|-----| +| compute_op_sum | device侧运行的计算类算子汇总。 | - | +| freq_analysis | 识别是否aicore存在空闲(频率为800MHz)、异常(频率不为1800MHz或800MHz)的情况并给出分析结果。 | - | +| ep_load_balance | moe负载信息汇总分析。 | - | + +#### 通信类特性 + +| 分析能力 | 介绍 | 介绍链接 | +|---------|----------------------------------------|-----| +| communication_matrix | 通信矩阵分析。 | - | +| communication_time| 通信耗时分析。 | - | +| all | 默认值,会执行communication_matrix通信矩阵和communication_time通信耗时分析能力,并导出cluster_step_trace_time交付件。 | - | +| communication_group_map | 集群场景通信域与并行策略呈现。 | - | +| communication_time_sum | 集群场景通信时间和带宽汇总分析。 | - | +| communication_matrix_sum | 集群场景通信时间和带宽汇总分析。 | - | +| hccl_sum | 通信类算子信息汇总。 | - | +| pp_chart | pp流水图,针对pp并行下各个阶段的耗时分析与可视化能力。| [link](./docs/features/pp_chart.md) | +| slow_rank | 根据当前的快慢卡统计算法,展示各个rank得出的快慢卡影响次数,识别慢卡出现的原因。 | - | +| slow_link | 集群慢链路异常分析 | - | +| slow_rank_pp_stage | pp stage通信对比分析 | - | + +#### Host下发类特性 + +| 分析能力 | 介绍 | 介绍链接 | +|---------|----------------------------------------|-----| +| cann_api_sum | CANN层API的汇总。 | - | +| mstx_sum | MSTX自定义打点汇总。 | - | + +#### 其他特性 +| 分析能力 | 类别 | 介绍 | 介绍链接 | +|---------|----| ------------------------------------|-----| +| mstx2commop | 数据处理类 | 将通过MSTX内置通信打点的通信信息转换成通信算子表格式。 | - | +| p2p_pairing | 数据处理类 | P2P算子生成全局关联索引,输出的关联索引会作为一个新的字段`opConnectionId`附在`COMMUNICATION_OP`的表中。 | - | +| filter_db | 数据处理类 | 提取通信类大算子数据,计算类关键函数和框架关键函数,节约90%+ 内存,促进快速全局分析 | - | + +交付件详细内容请参见[recipe结果交付件表](./docs/recipe_output_format.md)文档。 + +### 使用样例 +#### 最简使用 ```bash -msprof-analyze advisor [-h] +# 只传入cluster_data性能数据文件夹,输入cluster_time_summary分析能力,在cluster_data输入文件夹下生成cluster_文件夹,保存分析结果信息 +msprof-analyze -m cluster_time_summary -d ./cluster_data ``` +#### 分析能力为all设置下使用 ```bash -msprof-analyze compare [-h] +# 可以输入-m参数=all 当前输出step_trace_time/通信矩阵/通信耗时交付件 +msprof-analyze -m all -d ./cluster_data ``` +#### 指定输出路径 ```bash -msprof-analyze cluster [-h] +# 设置-o参数,指定自定义输出路径 +msprof-analyze -m cluster_time_summary -d ./cluster_data -o ./cluster_output ``` +#### 设置输出格式 ```bash -msprof-analyze auto-completion [-h] +# 设置--export_type参数,设置输出格式 +msprof-analyze -m cluster_time_summary -d ./cluster_data --export_type db ``` +#### 性能对比(compare)子功能 +支持GPU与NPU之间、NPU与NPU之间两组性能数据的深度对比,通过多维度量化指标直观呈现性能差异。 + +```bash +# 基础用法:对比昇腾NPU与GPU性能数据 +msprof-analyze compare -d ./ascend_pt # 昇腾NPU性能数据目录 + -bp ./gpu_trace.json # GPU性能数据文件 + -o ./compare_output # 对比结果输出目录 ``` -msprof-analyze [-h] [-v] -``` -| 参数 | 说明 | -| -------------------- | ------------------------------------------------------------ | -| advisor | [advisor](./advisor/README.md)。将Ascend PyTorch Profiler或者msprof采集的PyThon场景性能数据进行分析,并输出性能调优建议。 | -| compare | [compare_tools(性能比对工具)](./compare_tools/README.md)。提供NPU与GPU性能拆解功能以及算子、通信、内存性能的比对功能。 | -| cluster | [cluster_analyse(集群分析工具)](./cluster_analyse/README.md)。提供多机多卡的集群分析能力(基于通信域的通信分析和迭代耗时分析), 当前需要配合Ascend Insight的集群分析功能使用。 | -| auto-completion | 自动补全。配置后在当前视图下配置msprof-analyze工具所有的子参数时,可以使用Tab将所有子参数自动补全。 | -| -v,-V
--version | 查看版本号。 | -| -h,-H
--help | 命令行参数帮助信息。 | +对比报告`performance_comparison_result_{timestamp}.xlsx`包含: +* 宏观性能拆分:按计算、通信、空闲三大维度统计耗时占比差异,快速识别性能损耗主要场景。 +* 细粒度对比:按算子(如 Conv、MatMul)、框架接口等粒度展示耗时差异,定位具体性能差距点。 + +> 对比规则维度、参数说明及报告解读,请参考 [msprof-analyze compare](./compare_tools/README.md)子功能介绍文档。 + +#### 专家建议(advisor)子功能 +自动分析性能数据,识别算子执行效率、下发调度、集群通信等潜在瓶颈,并生成分级优化建议,助力快速定位问题。 + +```bash +# 基础用法 +msprof-analyze advisor all -d ./prof_data -o ./advisor_output +``` +分析完成后,在执行终端打印关键问题与优化建议,并生成 +* `mstt_advisor_{timestamp}.html`按重要程度标记的优化建议 +* `mstt_advisor_{timestamp}.xlsx`问题综述与详细的分析信息 + +> 详细分析规则、参数配置及结果解读,请参考 [msprof-analyze advisor](./advisor/README.md)子功能介绍文档。 + +## 扩展功能 +### 自定义开发指导 +用户可自定义一套性能数据的分析规则,需要详细了解性能分析的开发人员,具体开发指导请参见[自定义分析能力开发指导](./docs/custom_analysis_guide.md)。 + + +## 附录 +### 采集profiling性能数据指导 + * msprof 场景:参见“性能数据采集 > [msprof采集通用命令](https://www.hiascend.com/document/detail/zh/mindstudio/81RC1/T&ITools/Profiling/atlasprofiling_16_0008.html)”。 + * PyTorch 场景:参见“性能数据采集 > [PyTorch](https://www.hiascend.com/document/detail/zh/mindstudio/81RC1/msquickstart/atlasquick_train_0018.html)”。 + * MindSpore 场景:参见“性能数据采集 > [MindSpore](https://www.hiascend.com/document/detail/zh/mindstudio/81RC1/msquickstart/atlasquick_train_0017.html)”。 + +### 发布程序包下载链接 +| profiler版本 | 发布日期 | 下载链接 | 校验码 | +|----------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------| ------------------------------------------------------------ | +| 8.1.0 | 2025-07-30 | [msprof_analyze-8.1.0-py3-none-any.whl](https://ptdbg.obs.cn-north-4.myhuaweicloud.com/profiler/package/8.1.0/msprof_analyze-8.1.0-py3-none-any.whl) | 064f68ff22c88d91d8ec8c47045567d030d1f9774169811c618c06451ef697e4 | +| 2.0.2 | 2025-03-31 | [msprof_analyze-2.0.2-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/2.0.2/msprof_analyze-2.0.2-py3-none-any.whl) | 4227ff628187297b2f3bc14b9dd3a8765833ed25d527f750bc266a8d29f86935 | +| 2.0.1 | 2025-02-28 | [msprof_analyze-2.0.1-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/2.0.1/msprof_analyze-2.0.1-py3-none-any.whl) | 82dfe2c779dbab9015f61d36ea0c32d832b6d182454b3f7db68e6c0ed49c0423 | +| 2.0.0 | 2025-02-08 | [msprof_analyze-2.0.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/2.0.0/msprof_analyze-2.0.0-py3-none-any.whl) | 8e44e5f3e7681c377bb2657a600ad9841d3bed11061ddd7844c30e8a97242101 | +| 1.3.4 | 2025-01-20 | [msprof_analyze-1.3.4-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.4/msprof_analyze-1.3.4-py3-none-any.whl) | 8de92188d1a97105fb14cadcb0875ccd5f66629ee3bb25f37178da1906f4cce2 | +| 1.3.3 | 2024-12-26 | [msprof_analyze-1.3.3-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.3/msprof_analyze-1.3.3-py3-none-any.whl) | 27676f2eee636bd0c65243f81e292c7f9d30d7f985c772ac9cbaf10b54d3584e | +| 1.3.2 | 2024-12-20 | [msprof_analyze-1.3.2-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.2/msprof_analyze-1.3.2-py3-none-any.whl) | ceb227e751ec3a204135be13801f1deee6a66c347f1bb3cdaef596872874df06 | +| 1.3.1 | 2024-12-04 | [msprof_analyze-1.3.1-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.1/msprof_analyze-1.3.1-py3-none-any.whl) | eae5548804314110a649caae537f2c63320fc70ec41ce1167f67c1d674d8798e | +| 1.3.0 | 2024-10-12 | [msprof_analyze-1.3.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.3.0/msprof_analyze-1.3.0-py3-none-any.whl) | 8b09758c6b5181bb656a95857c32852f898c370e7f1041e5a08e4f10d5004d48 | +| 1.2.5 | 2024-09-25 | [msprof_analyze-1.2.5-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.5/msprof_analyze-1.2.5-py3-none-any.whl) | aea8ae8deac07b5b4980bd2240da27d0eec93b9ace9ea9eb2e3a05ae9072018b | +| 1.2.4 | 2024-09-19 | [msprof_analyze-1.2.4-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.4/msprof_analyze-1.2.4-py3-none-any.whl) | 7c392e72c3347c4034fd3fdfcccb1f7936c24d9c3eb217e2cc05bae1347e5ab7 | +| 1.2.3 | 2024-08-29 | [msprof_analyze-1.2.3-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.3/msprof_analyze-1.2.3-py3-none-any.whl) | 354a55747f64ba1ec6ee6fe0f05a53e84e1b403ee0341ec40cc216dd25fda14c | +| 1.2.2 | 2024-08-23 | [msprof_analyze-1.2.2-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.2/msprof_analyze-1.2.2-py3-none-any.whl) | ed92a8e4eaf5ada8a2b4079072ec0cc42501b1b1f2eb00c8fdcb077fecb4ae02 | +| 1.2.1 | 2024-08-14 | [msprof_analyze-1.2.1-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.1/msprof_analyze-1.2.1-py3-none-any.whl) | 7acd477417bfb3ea29029dadf175d019ad3212403b7e11dc1f87e84c2412c078 | +| 1.2.0 | 2024-07-25 | [msprof_analyze-1.2.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.2.0/msprof_analyze-1.2.0-py3-none-any.whl) | 6a4366e3beca40b4a8305080e6e441d6ecafb5c05489e5905ac0265787555f37 | +| 1.1.2 | 2024-07-12 | [msprof_analyze-1.1.2-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.1.2/msprof_analyze-1.1.2-py3-none-any.whl) | af62125b1f9348bf491364e03af712fc6d0282ccee3fb07458bc9bbef82dacc6 | +| 1.1.1 | 2024-06-20 | [msprof_analyze-1.1.1-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.1.1/msprof_analyze-1.1.1-py3-none-any.whl) | 76aad967a3823151421153d368d4d2f8e5cfbcb356033575e0b8ec5acea8e5e4 | +| 1.1.0 | 2024-05-28 | [msprof_analyze-1.1.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.1.0/msprof_analyze-1.1.0-py3-none-any.whl) | b339f70e7d1e45e81f289332ca64990a744d0e7ce6fdd84a8d82e814fa400698 | +| 1.0 | 2024-05-10 | [msprof_analyze-1.0-py3-none-any.whl](https://ptdbg.obs.myhuaweicloud.com/profiler/package/1.0/msprof_analyze-1.0-py3-none-any.whl) | 95b2f41c8c8e8afe4887b738c8cababcb4f412e1874483b6adae4a025fcbb7d4 | + + +## FAQ +暂无 + +## 致谢 + +🔎 msprof-analyze 由华为公司的下列部门联合贡献 : + +华为公司: + +- 昇腾计算MindStudio开发部 +- 昇腾计算生态使能部 +- 2012网络实验室 + +感谢来自社区的每一个PR,欢迎贡献 msprof-analyze! \ No newline at end of file diff --git a/profiler/msprof_analyze/cli/cluster_cli.py b/profiler/msprof_analyze/cli/cluster_cli.py index b0c9fb6ec4661bfc6432291f76eeefc07db7767d..90d1a7c23a3d48ab96079ca9f7f83c6455c864a7 100644 --- a/profiler/msprof_analyze/cli/cluster_cli.py +++ b/profiler/msprof_analyze/cli/cluster_cli.py @@ -17,13 +17,14 @@ import click from msprof_analyze.prof_common.constant import Constant from msprof_analyze.cluster_analyse.cluster_analysis import ALL_FEATURE_LIST, Interface from msprof_analyze.prof_common.path_manager import PathManager +from msprof_analyze.advisor.version import print_version_callback, cli_version context_settings = dict(Constant.CONTEXT_SETTINGS) context_settings['ignore_unknown_options'] = True @click.command(context_settings=context_settings, name="cluster", - short_help='Analyze cluster data to locate slow nodes and slow links.') + short_help='Analyze cluster data to locate performance bottleneck') @click.option('--profiling_path', '-d', type=click.Path(), required=True, callback=PathManager.expanduser_for_cli, help='path of the profiling data') @click.option('--mode', '-m', type=click.Choice(ALL_FEATURE_LIST), default='all') @@ -34,6 +35,17 @@ context_settings['ignore_unknown_options'] = True @click.option("--parallel_mode", type=str, help="context mode", default="concurrent") @click.option("--export_type", help="recipe export type", type=click.Choice(["db", "notebook", "excel"]), default="db") @click.option("--rank_list", type=str, help="Rank id list", default='all') +@click.option("--step_id", type=int, help="Step id", default=Constant.VOID_STEP) +@click.option('--version', '-V', '-v', is_flag=True, + callback=print_version_callback, expose_value=False, + is_eager=True, help=cli_version()) @click.argument('args', nargs=-1) def cluster_cli(**kwargs) -> None: + """ + subcommand:\n + compare Compare the performance diffs between GPUs and NPUs. try 'msprof-analyze compare -h' for detail\n + advisor Analyze and give performance optimization suggestion.try 'msprof-analyze advisor -h' for detail\n + cluster default run as cluster subcommand + """ Interface(kwargs).run() + diff --git a/profiler/msprof_analyze/cli/entrance.py b/profiler/msprof_analyze/cli/entrance.py index 0aa61f1b6aee2a5b6b321e8e3fb7a04ed63ff98a..5f74668681bd8cc081056925179a70685a517c6d 100644 --- a/profiler/msprof_analyze/cli/entrance.py +++ b/profiler/msprof_analyze/cli/entrance.py @@ -56,14 +56,29 @@ class SpecialHelpOrder(click.Group): self.list_commands = self.list_commands_for_help return super(SpecialHelpOrder, self).get_help(ctx) + def parse_args(self, ctx, args): + # 检查是否有已知的子命令 + has_subcommand = any(arg in self.list_commands(ctx) for arg in args if not arg.startswith('-')) -@click.group(context_settings=CONTEXT_SETTINGS, cls=SpecialHelpOrder) + # 如果没有子命令但有参数,自动添加 cluster 子命令 + if not has_subcommand and args: + args = ['cluster'] + args + # 如果没有子命令也没有参数,执行--help + elif not has_subcommand and not args: + args = ['cluster', '--help'] + + return super(SpecialHelpOrder, self).parse_args(ctx, args) + + +@click.group(context_settings=CONTEXT_SETTINGS, cls=SpecialHelpOrder, invoke_without_command=True) @click.option('--version', '-V', '-v', is_flag=True, callback=print_version_callback, expose_value=False, is_eager=True, help=cli_version()) -def msprof_analyze_cli(**kwargs): - pass - +@click.pass_context +def msprof_analyze_cli(ctx, **kwargs): + """如果没有子命令,默认执行 cluster""" + if ctx.invoked_subcommand is None: + ctx.invoke(cluster_cli) msprof_analyze_cli.add_command(analyze_cli, name="advisor") msprof_analyze_cli.add_command(compare_cli, name="compare") diff --git a/profiler/msprof_analyze/cluster_analyse/README.md b/profiler/msprof_analyze/cluster_analyse/README.md index 40515ca88ae21fc03f2cac4b79ae06a2767f68d3..02129aabadc9a857a271bcbce6ee93dcafd91af4 100644 --- a/profiler/msprof_analyze/cluster_analyse/README.md +++ b/profiler/msprof_analyze/cluster_analyse/README.md @@ -1,195 +1,2 @@ -# 集群分析工具 -cluster_analyse(集群分析工具)是在集群场景下,通过此工具来进行集群数据的分析,当前主要对基于通信域的迭代内耗时分析、通信时间分析以及通信矩阵分析为主, 从而定位慢卡、慢节点以及慢链路问题。 - -## 性能数据采集 -当前集群调优工具主要支持PyTorch场景的Ascend PyTorch Profiler采集方式和MindSpore场景的MindSpore Profiler采集方式下的集群数据。 - -此工具只需要NPU的性能数据作为输入。 - -Ascend PyTorch Profiler采集方法请参见《[NPU性能数据采集](https://gitee.com/ascend/mstt/tree/master/profiler/msprof_analyze)》,MindSpore Profiler采集方法请参见《[性能调试](https://www.mindspore.cn/mindinsight/docs/zh-CN/r2.3/performance_profiling_ascend.html)》。 - -我们要求至少是L1级别的数据。 -```python -experimental_config = torch_npu.profiler._ExperimentalConfig( - profiler_level=torch_npu.profiler.ProfilerLevel.Level1 -) -``` -### 确认数据是否可用 - -打开采集到的某张卡数据(\*ascend_pt、\*ascend_ms结尾的文件夹),可用的数据应该具备: - -- ./profiler_info_x.json, -- ./ASCEND_PROFILER_OUTPUT/step_trace_time.csv, -- ./ASCEND_PROFILER_OUTPUT/trace_view.json, -- ./ASCEND_PROFILER_OUTPUT/kernel_details.csv, -- ./ASCEND_PROFILER_OUTPUT/communication.json, -- ./ASCEND_PROFILER_OUTPUT/communication_matrix.json - -或者具备: - -- analysis.db -- ascend_pytorch_profiler_{rank_id}.db - -以上csv、json文件与db文件只能存在一类,否则集群分析工具解析异常。MindSpore场景暂不支持以上db文件。 - -确认这几个文件生成后,继续下面的集群分析。 - -## 数据汇聚与解析 - -### 操作步骤 - -1. 参见《[性能工具](../README.md)》完成工具安装。建议安装最新版本。 - - 将所有卡的数据拷贝并汇集到一个目录下,运行以下命令,在该目录下即可生成cluster_analysis_output文件夹。 - - ```bash - msprof-analyze cluster -d {cluster profiling data path} [-m mode] [-o output_path] [--data_simplification] [--force] - ``` - - 或 - - ```bash - python3 cluster_analysis.py -d {cluster profiling data path} [-m mode] [-o output_path] [--data_simplification] [--force] - ``` - - 参数说明: - - | 参数名 | 说明 | 是否必选 | - | -------------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -------- | - | --profiling_path或-d | 性能数据汇集目录。未配置-o参数时,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据。 | 是 | - | --output_path或-o | 自定义输出路径,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据。 | 否 | - | --mode或-m | 数据解析模式,取值详见“**--mode参数说明**”表。 | 否 | - | --data_simplification | 数据精简模式。对于数据量过大的性能数据db文件,可以通过配置该参数将数据精简,并提高工具分析效率。配置该参数表示开启数据精简,默认未配置表示关闭。 | 否 | - | --force | 强制执行cluster。配置后可强制跳过如下情况:
指定的目录、文件的用户属主不属于当前用户,忽略属主判断直接执行。
csv文件大于5G、json文件大于10G、db文件大于8G,忽略文件过大判断直接执行。
配置该参数表示开启强制执行,默认未配置表示关闭。 | 否 | - | --parallel_mode | 设置收集多卡、多节点db数据时的并发方式。取值为concurrent(使用concurrent.feature进程池实现并发)。
**只有-m配置cann_api_sum、compute_op_sum、hccl_sum、mstx_sum时可配置此参数。** | 否 | - | --export_type | 设置导出的数据形式。取值为db(.db格式文件)、notebook(Jupyter Notebook文件)和excel(excel格式文件),默认值为db。
**只有-m配置cann_api_sum、compute_op_sum、hccl_sum、mstx_sum时可配置此参数。** | 否 | - | --rank_list | 对特定Rank上的数据进行统计,默认值为all(表示对所有Rank进行统计),须根据实际卡的Rank ID配置。应配置为大于等于0的整数,若所配置的值大于实际训练所运行的卡的Rank ID,则仅解析合法的RankID的数据,比如当前环境Rank ID为0到7,实际训练运行0到3卡,此时若配置Rank ID为0, 3, 4或不存在的10等其他值,则仅解析0和3。配置示例:--rank_list 0, 1, 2。
**只有-m配置cann_api_sum、compute_op_sum、hccl_sum、mstx_sum时可配置此参数。** | 否 | - | --top_num | 设置TopN耗时的通信算子的数量,默认值为15,配置示例:--top_num 20。
**只有-m配置hccl_sum时可配置此参数。** | 否 | - | --exclude_op_name | 控制compute_op_name结果是否包含op_name,示例:--exclude_op_name,后面不需要跟参数。
**只有-m配置compute_op_sum时可配置此参数。** | 否 | - | --bp | 要对比的标杆集群数据,示例:--bp {bp_cluster_profiling_path},表示profiling_path和bp_cluster_profiling_path的数据进行对比。
**只有-m配置cluster_time_compare_summary时可配置此参数。** | 否 | - - - --mode参数说明: - - --mode参数设置不同的数据解析模式,可调用不同的分析能力,交付件详细内容请参见[recipe结果和cluster_analysis.db交付件表结构说明](#recipe结果和cluster_analysisdb交付件表结构说明)。 - - | 参数名 | 说明 | 是否必选 | export_type支持类型 | - |------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----|-----------------| - | communication_matrix | 解析通信矩阵数据。 | 否 | / | - | communication_time | 解析通信耗时数据。 | 否 | / | - | all | 同时解析通信矩阵communication_matrix和通信耗时数据communication_time,--mode参数默认值为all。 | 否 | / | - | cann_api_sum | 集群API性能数据汇总分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。--export_type为db时,输出交付件cluster_analysis.db;--export_type为notebook时,在cluster_analysis_output/CannApiSum目录下输出交付件stats.ipynb。 | 否 | db, nootebook | - | compute_op_sum | 集群场景性能数据的device运行算子信息汇总分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。--export_type为db时,输出交付件cluster_analysis.db;--export_type为notebook时,在cluster_analysis_output/ComputeOpSum目录下输出交付件stats.ipynb;可根据实际情况决定是否是否打开--exclude_op_name。 | 否 | db, nootebook | - | hccl_sum | 集合通信算子耗时分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。--export_type为db时,输出交付件cluster_analysis.db;--export_type为notebook时,在cluster_analysis_output/HcclSum目录下输出交付件stats.ipynb。 | 否 | db, nootebook | - | mstx_sum | 集群场景mstx打点信息汇总分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。--export_type为db时,输出交付件cluster_analysis.db;--export_type为notebook时,在cluster_analysis_output/MstxSum目录下输出交付件stats.ipynb。 | 否 | db, nootebook | - | slow_link | 集群慢链路异常分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。--export_type为db时,输出交付件cluster_analysis.db;--export_type为notebook时,在cluster_analysis_output/SlowLink目录下输出交付件stats.ipynb。 | 否 | db, nootebook | - | cluster_time_summary | 集群场景性能数据分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db和analysis.db文件。--export_type为db时,输出交付件cluster_analysis.db,db里面有ClusterTimeSummary。 | 否 | db | - | cluster_time_compare_summary | 集群场景性能数据对比分析,使用前集群数据必须先分析cluster_time_summary,需要配合--bp参数使用。输入性能数据需要基于cluster_analysis_output下的cluster_analysis.db文件。--export_type为db时,输出交付件cluster_analysis.db,db文件中有对比结果的表ClusterTimeCompareSummary。 | 否 | db | - | slow_rank_pp_stage | 集群场景性能数据pp stage通信对比分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。输入性能数据中MetaData表如果没有包含训练任务的并行策略,则需要通过--tp --pp --dp手动传入,数据类型为正整数。--export_type为db时,输出交付件cluster_analysis.db,db文件中有分析结果PPAnalysisResult和P2PAnalysisResult。 | 否 | db | - | freq_analysis | 集群场景aicore frequency信息汇总分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。打印输出是否aicore存在空闲(频率为800MHz)、异常(频率不为1800MHz或800MHz)的现象。如果有,则在输出交付件cluster_analysis.db增加对应的卡和频率信息。 | 否 | db | - | ep_load_balance | 集群场景moe负载信息汇总分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。输出交付件cluster_analysis.db增加EPTokensSummary, TopEPTokensInfo分析表格。 | 否 | db | - | mstx2commop | 基于ascend_pytorch_profiler_{rank_id}.db文件,将通信内置打点数据转换成通信算子。 | 否 | db | - | slow_rank | 集群场景通信算子快慢卡汇总分析,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。输出交付件cluster_analysis.db中展示各个rank按照当前的快慢卡统计算法得出的快慢卡影响次数。 | 否 | db | - | p2p_pairing | 集群场景P2P算子生成全局关联索引,输入性能数据需要基于ascend_pytorch_profiler_{rank_id}.db文件。输出的关联索引会作为一个新的字段`opConnectionId`附在原性能数据ascend_pytorch_profiler_{rank_id}.db文件的`COMMUNICATION_OP`的表中。 | 否 | db | - | filter_db | 基于ascend_pytorch_profiler_{rank_id}.db文件,提取通信类大算子数据,计算类关键函数和框架关键函数,节约90%+ 内存,促进快速全局分析。 | 否 | db | - | pp_chart | 基于打点后的ascend_pytorch_profiler_{rank_id}.db文件,分析打点数据,还原pp流水图 | 否 | db | - | module_statistic | 基于打点后的ascend_pytorch_profiler_{rank_id}.db文件,分析打点数据,拆解模型结构与算子关联,具体指导请参见“[模型结构拆解指南](../docs/features/module_statistic.md)” | 否 | db, excel | - | 自定义分析参数 | 与cann_api_sum、compute_op_sum、hccl_sum等参数功能类似,用户可自定义一套性能数据的分析规则,需要详细了解性能分析的开发人员,具体开发指导请参见“[自定义分析规则开发指导](#自定义分析规则开发指导)”。 | 否 | / | - - --parallel_mode参数示例如下: - - ```bash - msprof-analyze cluster -d {cluster profiling data path} -m cann_api_sum --parallel_mode concurrent - ``` - - 或 - - ```bash - python3 cluster_analysis.py -d {cluster profiling data path} -m cann_api_sum --parallel_mode concurrent - ``` - - -### 交付件 - -集群分析工具的交付件通过MindStudio Insight工具展示,详见《[MindStudio Insight用户指南](https://www.hiascend.com/document/detail/zh/mindstudio/70RC2/GUI-baseddevelopmenttool/msascendinsightug/AscendInsight_0002.html)》。 - -#### cluster_step_trace_time.csv - -数据解析模式为communication_matrix、communication_time或all时均生成。 - -A列: Step数,是采集性能数据时设置的,一般来说集群性能数据采集一个step足够,如果采集多个step,需要先筛选一下。 - -B列: Type,主要分两种,rank和stage, 和后面的index强相关,可以理解为一个是单卡rank,一个是rank group(pp 并行的stage),如果type为stage,则后面D-K列信息为rank group下的最大值。 - -C列:Index,与type相关,表示卡号。 - -D列:Computing, 此列统计计算时间。 - -E列:Communication(Not Overlapped),此列统计未被掩盖的通信耗时。 - -F列:Overlapped,统计计算与通信重叠的耗时。 - -G列:Communication,通信时间的全部耗时。 - -H列:Free,空闲时间,指device侧既不在通信也不在计算的耗时,可能在做sdma拷贝或者空等。 - -I列:Stage时间,I、J、K列属于pp并行时有效的数值,stage时间代表除receive算子时间外的时间。 - -J列:Bubble时间,指receive时间的总和。 - -K列:Communication(Not Overlapped and Exclude Receive)指剔除receive算子外的并且不被掩盖的通信时间。 - -L列:Preparing,指迭代开始到首个计算或通信算子运行的时间。 - -M列:DP Index,指集群数据按照并行策略切分后所属DP组的索引, 如果没有采集则不显示。 - -N列:PP Index,指集群数据按照并行策略切分后所属PP组的索引,如果没有采集则不显示。 - -O列:TP Index,指集群数据按照并行策略切分后所属TP组的索引,如果没有采集则不显示。 - -**Tips**:先筛选B列type为stage, 看stage间是否有问题,再筛选B列type为rank,看rank是否有问题,根据以下几点排查。 - -* 根据Computing的时间差异判断是否有慢卡,或者有负载不均衡的现象。 - -* 根据Free统计是否有host bound或者分布不均现象。 - -* 根据Communication(Not Overlapped and Exclude Receive)时间判断是否通信耗时占比过大。 - -* 根据Bubble时间的占比和理论计算公式判断bubble设置是否合理,是否stage间有不均衡现象。 - -以上时间理论上都应该处于持平状态,即最大值小于最小值5%,否则就可能出现慢卡。 - -#### cluster_communication_matrix.json - -数据解析模式为communication_matrix或all时生成。 - -直接打开json(vscode或json查看器), 搜索"Total", 会有多个搜索结果,一般来说链路带宽信息的结构: - -```bash -{src_rank}-{dst_rank}: { - "Transport Type": "LOCAL", - "Transit Time(ms)": 0.02462, - "Transit Size(MB)": 16.777216, - "Bandwidth(GB/s)": 681.4466 -} -``` -**Tips**:可以根据rank互联的带宽以及链路类型,判断是否有慢链路的问题。 - -- "LOCAL"是片内拷贝,速度最高。 -- “HCCS”或“PCIE”是节点内片间拷贝,速度居中。 -- “RDMA”是节点间拷贝,速度最低。 - -#### cluster_communication.json - -数据解析模式为communication_time或all时生成。 - -主要为通信耗时数据。 - -#### cluster_analysis.db - -解析analysis.db或ascend_pytorch_profiler_{rank_id}.db生成的交付件,根据数据解析模式不同而解析不同的数据,详情介绍请参见[recipe结果和cluster_analysis.db交付件表结构说明](https://gitee.com/ascend/mstt/tree/pre-research/profiler/msprof_analyze/docs/recipe_output_format.md) - -## 附录 - -### 自定义分析规则开发指导 -详情介绍请参见[自定义分析规则开发指导](https://gitee.com/ascend/mstt/tree/pre-research/profiler/msprof_analyze/docs/custom_analysis_guide.md) +# msprof-analyze集群分析能力 +本能力已经整合到msprof-analyze性能分析工具中.详细介绍请参照[msprof-analyze](../README.md)说明文档使用. \ No newline at end of file diff --git a/profiler/msprof_analyze/docs/custom_analysis_guide.md b/profiler/msprof_analyze/docs/custom_analysis_guide.md index 5791f5a6651245ef83a298df962b456ebb594043..893892441144caeb5a608be16f686a8d2d2760d1 100644 --- a/profiler/msprof_analyze/docs/custom_analysis_guide.md +++ b/profiler/msprof_analyze/docs/custom_analysis_guide.md @@ -1,4 +1,4 @@ -### 自定义分析规则开发指导 +# 自定义分析规则开发指导 自定义分析规则是基于对Profiling的analysis.db和ascend_pytorch_profiler_{rank_id}.db文件进行性能数据分析而开发。与cann_api_sum、compute_op_sum、hccl_sum等参数功能实现类似,可自定义一套性能数据的分析规则,方法如下: 1. 在mstt工具代码仓profiler/msprof_analyze/cluster_analyse/recipes目录下创建xxx目录和xxx.py文件。 @@ -125,7 +125,7 @@ msprof-analyze cluster -d {cluster profiling data path} --mode xxx --top_num 10 ``` -### 开发和上库流程规范 +## 开发和上库流程规范 开发要遵守以下流程规范。 diff --git a/profiler/msprof_analyze/docs/features/cluster_time_compare_summary.md b/profiler/msprof_analyze/docs/features/cluster_time_compare_summary.md new file mode 100644 index 0000000000000000000000000000000000000000..b57d9e9551a7af5ad2d0358a057366e8c7465496 --- /dev/null +++ b/profiler/msprof_analyze/docs/features/cluster_time_compare_summary.md @@ -0,0 +1,45 @@ +# cluster_time_compare_sumary 集群性能数据细粒度比对 + + +## 背景与挑战 +大集群场景涉及多个计算节点,数据量大,原有的单卡性能数据对比不能评估整体集群运行情况。 + +## 功能介绍 + + cluster_time_compare_sumary 提供了AI运行过程中集群维度的性能数据对比能力,包括计算、通信和内存拷贝等各部分的时间消耗,帮助用户找到性能瓶颈。 + +## 使用方法 + +```bash +# 首先执行cluster_time_summary分析能力,执行集群耗时细粒度拆解 +msprof-analyze -m cluster_time_summary -d ./cluster_data +msprof-analyze -m cluster_time_summary -d ./base_cluster_data + +# 执行cluster_time_compare_summary,传入两个拆解分析后的文件夹路径 +msprof-analyze -m cluster_time_compare_summary -d ./cluster_data --bp ./base_cluster_data +``` +**参数说明:** +* `-m`cluster_time_compare_summary 使能集群耗时细粒度对比能力 +* `-d`集群性能数据文件夹路径 +* `-bp`标杆集群数据路径 +* 其余参数:参考msprof-analyze调用参数指导,详见[参数说明](../../README.md#参数说明) + + +**输出数据:** +* 存储位置:cluster_analysis_output/cluster_analysis.db +* 数据表名:ClusterTimeCompareSummary + +**字段说明:** + +| 字段名称 | 类型 | 说明 | +|------------|----------|----------------------------------| +| rank | INTEGER | 卡号 | +| step | INTEGER | 迭代编号 | +| {metrics} | REAL | 当前集群耗时指标,与ClusterTimeSummary字段一致 | +| {metrics}Base | REAL | 基准集群的对应耗时 | +| {metrics}Diff | REAL | 耗时偏差值(当前集群-基准集群),正值表示当前集群更慢 | + +备注:表中时间相关字段,统一使用微秒(us) + +**输出结果分析:** +* 按*Diff字段排序找出最大差异项,找到劣化环节。 \ No newline at end of file diff --git a/profiler/msprof_analyze/docs/features/cluster_time_summary.md b/profiler/msprof_analyze/docs/features/cluster_time_summary.md new file mode 100644 index 0000000000000000000000000000000000000000..b2a7fef8425d4201d34dcc5fc217bba3958419fb --- /dev/null +++ b/profiler/msprof_analyze/docs/features/cluster_time_summary.md @@ -0,0 +1,49 @@ +# cluster_time_summary 集群性能数据细粒度拆解 + +## 背景与挑战 +1、 大集群场景涉及多个计算节点,数据量大,单卡维度的性能数据统计与分析不能评估整体集群运行情况。 +2、 原有的cluster_step_trace_time。csv交付件没有单独的执行命令,导致用户使用不直观,且不能涵盖内存拷贝等指标项,需要增强。 + +## 功能介绍 + +* cluster_time_summary 提供了集群训练过程中迭代耗时拆解,包括计算、通信和内存拷贝等各部分的时间消耗,帮助用户找到性能瓶颈。 + +**使用方法** + +``` +msprof-analyze -m cluster_time_summary -d ./cluster_data +``` +**参数说明:** +* `-m`设置为cluster_time_summary 使能集群耗时细粒度拆解能力 +* `-d`集群性能数据文件夹路径 +* 其余参数:参考msprof-analyze调用参数指导,详见[参数说明](../../README.md#参数说明) + + +**输出数据:** +* 存储位置:cluster_analysis_output/cluster_analysis.db +* 数据表名:ClusterTimeSummary +![输出结果展示](../source/img/clutser_time_summary.png) + +**字段说明:** + +| 字段名称 | 类型 | 说明 | +|-------------------------------------------|----------|------------------------| +| rank | INTEGER | 卡号 | +| step | INTEGER | 迭代编号 | +| stepTime | REAL | 迭代总耗时 | +| computation | REAL | NPU上算子的计算总时间 | +| communicationNotOverlapComputation | REAL | 未被计算掩盖的通信耗时 | +| communicationOverlapComputation | REAL | 计算和通信重叠的时间 | +| communication | REAL | NPU上算子的通信总时间 | +| free | REAL | 空闲时间,迭代总时间减去计算、通信、拷贝时间 | +| communicationWaitStageTime | REAL | 通信中的总等待耗时 | +| communicationTransmitStageTime | REAL | 通信中的总传输耗时 | +| memory | REAL | 拷贝耗时 | +| memoryNotOverlapComputationCommunication | REAL | 未被计算、通信掩盖的拷贝耗时 | + +备注:表中时间相关字段,统一使用微秒(us) + +**输出结果分析:** +* 通过分析计算、通信、内存拷贝、空闲时间占比,找到性能瓶颈。 +* 通过比较集群内各卡耗时指标差异,定界性能问题。例如,computing计算耗时波动显著,通常表明存在卡间不同步、计算卡性能不均的情况,而通信传输耗时差异过大时,则需优先排查参数面网络是否存在拥塞或配置异常。 +* 配合使用cluster_time_compare_summary功能,可有效定位集群性能劣化根因。 \ No newline at end of file diff --git a/profiler/msprof_analyze/docs/features/module_statistic.md b/profiler/msprof_analyze/docs/features/module_statistic.md index bb7965831973fca6392802f25f4876860eee40ac..9977349d64bfa3f14766dca3c8f4ddf27968f8e6 100644 --- a/profiler/msprof_analyze/docs/features/module_statistic.md +++ b/profiler/msprof_analyze/docs/features/module_statistic.md @@ -1,4 +1,4 @@ -# 模型结构拆解指南 +# module_statistic 模型结构拆解指南 ## 简介 @@ -33,12 +33,12 @@ msprof-analyze cluster -m module_statistic -d ./result --export_type excel 参数说明: * `-d`: 集群性能数据路径 * `--export_type`: 导出类型设置,可选db, excel -* 其余参数:与cluster集群分析功能支持的参数一致,详见[参数列表](../../cluster_analyse/README.md) +* 其余参数:参考msprof-analyze调用参数指导,详见[参数说明](../../README.md#参数说明) ### 输出说明 输出结果体现模型层级,算子调用顺序,NPU上执行的Kernel以及统计时间 * `export_type`设置为`excel`时,每张卡生成独立的module_statistic_{rank_id}.csv文件,如下图所示: -![vllm_module_statistic](img/vllm_module_statistic.png) +![vllm_module_statistic](../source/img/vllm_module_statistic.png) * `export_type`设置为`db`时,结果统一保存到 cluster_analysis.db 的 ModuleAnalysisStatistic,字段说明如下: diff --git a/profiler/msprof_analyze/docs/features/pp_chart.md b/profiler/msprof_analyze/docs/features/pp_chart.md new file mode 100644 index 0000000000000000000000000000000000000000..31ccf5f2f09f7180d323fa32fa548adf04a0a49d --- /dev/null +++ b/profiler/msprof_analyze/docs/features/pp_chart.md @@ -0,0 +1,139 @@ +# pp流水图采集和分析指导 + +## 简介 +pp流水图指的是将实际pp域内的流水排布进行可视化呈现,可以分析全局通信与前反向关键耗时信息。对于transformer的模型1f1b、dupipe等pp并行策略,当前无法可视化展示。本节介绍如何采集pp流水图数据、使用msprof-analyze工具分析pp流水图,以及使用MindStudio Insight工具呈现pp流水图。 + +下面是1F1B和DualPipeV的理论效果图 + +![1F1B](../source/img/1F1B.png) +![DualPipeV](../source/img/DualPipeV.png) + + +## 操作指导 + +用户想看到pp流水图,需要按照以下三个步骤操作。 + +### 1. profiling数据采集 + +前反向数据需要通过mstx接口采集,需要先找到代码里前反向相关函数的位置。最终在性能数据timeline上的Ascend HardWare层呈现。 + +tips:若用户只关注pp流水图,可以设置采集参数profiler_level为Level_none;若还关注前反向、通信以及send和recv的关联关系,设置采集参数profiler_level为Level1或更高级别。 + + +**约束** +* 采集数据时,需要将profiling数据导出格式export_type设置为db,msprof_tx开关打开。 +* 场景一和二仅为打点示例,需要根据用户实际代码,准确找到前反向函数的位置,参考下面用装饰器的方式实现打点。 + +* 若项目使用 Megatron 框架:可直接按照场景一的方法进行打点操作;若项目使用 Mindspeed 框架:需先确认是否开启 DualPipeV 功能,若已开启,则按照场景二的方法进行打点操作;若无法明确区分,如果能找到对应项目中与打点相关的两个核心文件,在这两个文件的打点代码位置处,添加对应的打点逻辑,确保覆盖所有可能场景。 + +**场景一:** + +1. 传统pipeline(不开dualpipe),在```megatron/core/pipeline_parallel/schedules.py```里面添加如下代码(添加在```backward_step```函数定义的后面): +```python +import torch_npu +def step_wrapper(func, msg: str): + def wrapper(*args, **kwargs): + new_msg = {"name": msg} + mstx_state_step_range_id = torch_npu.npu.mstx.range_start(str(new_msg), torch_npu.npu.current_stream()) + out = func(*args, **kwargs) + if mstx_state_step_range_id is not None: + torch_npu.npu.mstx.range_end(mstx_state_step_range_id) + mstx_state_step_range_id = None + return out + return wrapper + +forward_step = step_wrapper(forward_step, "forward_step") +backward_step = step_wrapper(backward_step, "backward_step") +``` + +2. 保存上述脚本文件后,执行训练。训练完成后,在设置的输出路径下生成性能数据文件,用于后续mstt工具分析。 + +**场景二:** + +1. DualPipeV,找到前反向代码,在```mindspeed/core/pipeline_parallel/dualpipev/dualpipev_schedules.py```里面添加如下代码(添加在```forward_backward_pipelining_with_cutinhalf```函数定义的前面): +```python +import torch_npu +def step_wrapper(func, msg: str): + def wrapper(*args, **kwargs): + new_msg = {"name": msg} + if msg == "forward_step_with_model_graph" and kwargs.get("extra_block_kwargs") is not None: + new_msg["name"] = "forward_backward_overlaping" + if "current_microbatch" in kwargs: + new_msg["current_microbatch"] = kwargs["current_microbatch"] + if msg == "WeightGradStore_pop" and len(WeightGradStore.cache) == 0: + mstx_state_step_range_id = None + else: + mstx_state_step_range_id = torch_npu.npu.mstx.range_start(str(new_msg), torch_npu.npu.current_stream()) + out = func(*args, **kwargs) + if mstx_state_step_range_id is not None: + torch_npu.npu.mstx.range_end(mstx_state_step_range_id) + mstx_state_step_range_id = None + return out + return wrapper + +forward_step_with_model_graph = step_wrapper(forward_step_with_model_graph, "forward_step_with_model_graph") +forward_step_no_model_graph = step_wrapper(forward_step_no_model_graph, "forward_step_no_model_graph") +backward_step_with_model_graph = step_wrapper(backward_step_with_model_graph, "backward_step_with_model_graph") +backward_step = step_wrapper(backward_step, "backward_step") +WeightGradStore.pop = step_wrapper(WeightGradStore.pop, "WeightGradStore.pop") +``` + +若 DualPipeV 未开启 dw 分离,添加以下代码后,可完整呈现模型运行前反向的各个阶段([理论效果图](#简介));若未添加,则仅呈现当前阶段是否为前向或反向。 + +采集profiling数据时,如果使用的是MindSpeed,未使用MindSpeed-LLM,可以在prof定义(```prof = torch_npu.profiler.profile(...)```)的后面添加metadata代码: +``` +prof.add_metadata_json('pp_info', json.dumps( + { + 'pp_type': 'dualpipev', + 'microbatch_num': 10, + } +)) +# microbatch_num根据公式计算实际的值:microbatch_num = global_batch_size // micro_batch_size // data_parallel_size +``` +如果使用MindSpeed-LLM,在```mindspeed-llm/training/training.py```中```prof.add_metadata_json('distributed_args'...)```的后面添加metadata代码: +``` +prof.add_metadata_json('pp_info', json.dumps( + { + 'pp_type': args.schedules_method, + 'microbatch_num': args.global_batch_size // args.micro_batch_size // args.data_parallel_size + } +)) +``` + +2. 保存上述脚本文件后,执行训练。训练完成后,在设置的输出路径下生成性能数据文件,用于后续mstt工具分析。 + +### 2. msprof-analyze工具分析 + +**命令行使能:** +``` +msprof-analyze cluster -m pp_chart -d ./cluster_data +``` +**参数说明:** +* `-d` 第一步打点后采集到的集群数据路径 +* 其余参数:参考msprof-analyze调用参数指导,详见[参数说明](../../README.md#参数说明) + +**输出数据:** +* 存储位置:每个rank的数据ASCEND_PROFILER_OUTPUT/ascend_pytorch_profiler_{rank_id}.db里面新增一张表StepTaskInfo +* 数据表名:StepTaskInfo + +用户无需关注该表字段的具体含义,可以直接使用MindStudio Insight呈现。 + +**字段说明:** + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| name | TEXT | 前反向信息,对应pp流水图色块显示的名称 | +| startNs | INTEGER | 前反向task在device上开始时间 | +| endNs | INTEGER | 前反向task在device上结束时间 | +| type | INTEGER | 类型,不同类型显示不同颜色 | + +### 3. MindStudio Insight呈现 +MindStudio Insight工具的详细安装和操作请参见[《MindStudio Insight工具用户指南》](https://www.hiascend.com/document/detail/zh/mindstudio/81RC1/GUI_baseddevelopmenttool/msascendinsightug/Insight_userguide_0002.html)。 + +在MindStudio Insight工具导入mstt工具分析后的性能数据,在Summary页面点击Generate后按照如下截图配置: + +![操作步骤](../source/img/pp_chart_operation_steps.png) + +如下为pp_chart完成pp流水图分析后的呈现效果: + +![操作步骤](../source/img/pp_chart_effect.png) \ No newline at end of file diff --git a/profiler/msprof_analyze/docs/recipe_output_format.md b/profiler/msprof_analyze/docs/recipe_output_format.md index 089287a112670556afb02aa444042fe38fea419e..4497228223f3e0cc128dafe711bc30249a9d8145 100644 --- a/profiler/msprof_analyze/docs/recipe_output_format.md +++ b/profiler/msprof_analyze/docs/recipe_output_format.md @@ -6,6 +6,78 @@ msprof-analyze配置--mode参数时可分析并输出cluster_analysis.db交付 注意:部分分析能力不会生成cluster_analysis.db。 + +### cluster_step_trace_time.csv + +数据解析模式为communication_matrix、communication_time或all时均生成。 + +A列: Step数,是采集性能数据时设置的,一般来说集群性能数据采集一个step足够,如果采集多个step,需要先筛选一下。 + +B列: Type,主要分两种,rank和stage, 和后面的index强相关,可以理解为一个是单卡rank,一个是rank group(pp 并行的stage),如果type为stage,则后面D-K列信息为rank group下的最大值。 + +C列:Index,与type相关,表示卡号。 + +D列:Computing, 此列统计计算时间。 + +E列:Communication(Not Overlapped),此列统计未被掩盖的通信耗时。 + +F列:Overlapped,统计计算与通信重叠的耗时。 + +G列:Communication,通信时间的全部耗时。 + +H列:Free,空闲时间,指device侧既不在通信也不在计算的耗时,可能在做sdma拷贝或者空等。 + +I列:Stage时间,I、J、K列属于pp并行时有效的数值,stage时间代表除receive算子时间外的时间。 + +J列:Bubble时间,指receive时间的总和。 + +K列:Communication(Not Overlapped and Exclude Receive)指剔除receive算子外的并且不被掩盖的通信时间。 + +L列:Preparing,指迭代开始到首个计算或通信算子运行的时间。 + +M列:DP Index,指集群数据按照并行策略切分后所属DP组的索引, 如果没有采集则不显示。 + +N列:PP Index,指集群数据按照并行策略切分后所属PP组的索引,如果没有采集则不显示。 + +O列:TP Index,指集群数据按照并行策略切分后所属TP组的索引,如果没有采集则不显示。 + +**Tips**:先筛选B列type为stage, 看stage间是否有问题,再筛选B列type为rank,看rank是否有问题,根据以下几点排查。 + +* 根据Computing的时间差异判断是否有慢卡,或者有负载不均衡的现象。 + +* 根据Free统计是否有host bound或者分布不均现象。 + +* 根据Communication(Not Overlapped and Exclude Receive)时间判断是否通信耗时占比过大。 + +* 根据Bubble时间的占比和理论计算公式判断bubble设置是否合理,是否stage间有不均衡现象。 + +以上时间理论上都应该处于持平状态,即最大值小于最小值5%,否则就可能出现慢卡。 + +### cluster_communication_matrix.json + +数据解析模式为communication_matrix或all时生成。 + +直接打开json(vscode或json查看器), 搜索"Total", 会有多个搜索结果,一般来说链路带宽信息的结构: + +```bash +{src_rank}-{dst_rank}: { + "Transport Type": "LOCAL", + "Transit Time(ms)": 0.02462, + "Transit Size(MB)": 16.777216, + "Bandwidth(GB/s)": 681.4466 +} +``` +**Tips**:可以根据rank互联的带宽以及链路类型,判断是否有慢链路的问题。 + +- "LOCAL"是片内拷贝,速度最高。 +- “HCCS”或“PCIE”是节点内片间拷贝,速度居中。 +- “RDMA”是节点间拷贝,速度最低。 + +### cluster_communication.json + +数据解析模式为communication_time或all时生成。 +主要为通信耗时数据。 + ### compute_op_sum 设置-m compute_op_sum时,会生成以下表。 diff --git a/profiler/msprof_analyze/docs/source/img/1F1B.png b/profiler/msprof_analyze/docs/source/img/1F1B.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3849a328cee32ae19c811ad4a8acd7a0ca3288 Binary files /dev/null and b/profiler/msprof_analyze/docs/source/img/1F1B.png differ diff --git a/profiler/msprof_analyze/docs/source/img/DualPipeV.png b/profiler/msprof_analyze/docs/source/img/DualPipeV.png new file mode 100644 index 0000000000000000000000000000000000000000..7c33ee843bc9971b9ad8d5e8c7c766800ac320d2 Binary files /dev/null and b/profiler/msprof_analyze/docs/source/img/DualPipeV.png differ diff --git a/profiler/msprof_analyze/docs/source/img/clutser_time_summary.png b/profiler/msprof_analyze/docs/source/img/clutser_time_summary.png new file mode 100644 index 0000000000000000000000000000000000000000..47fb0551be067c15415a129f18cdfc3236428d37 Binary files /dev/null and b/profiler/msprof_analyze/docs/source/img/clutser_time_summary.png differ diff --git a/profiler/msprof_analyze/docs/source/img/pp_chart_effect.png b/profiler/msprof_analyze/docs/source/img/pp_chart_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..fed613f39a8d5a3f6fc226501b7e4114273ad9be Binary files /dev/null and b/profiler/msprof_analyze/docs/source/img/pp_chart_effect.png differ diff --git a/profiler/msprof_analyze/docs/source/img/pp_chart_operation_steps.png b/profiler/msprof_analyze/docs/source/img/pp_chart_operation_steps.png new file mode 100644 index 0000000000000000000000000000000000000000..57185dadf0ac7dfcc842483476822a97ea6e309d Binary files /dev/null and b/profiler/msprof_analyze/docs/source/img/pp_chart_operation_steps.png differ diff --git a/profiler/msprof_analyze/docs/features/img/vllm_module_statistic.png b/profiler/msprof_analyze/docs/source/img/vllm_module_statistic.png similarity index 100% rename from profiler/msprof_analyze/docs/features/img/vllm_module_statistic.png rename to profiler/msprof_analyze/docs/source/img/vllm_module_statistic.png