diff --git a/README.md b/README.md index 06aaa0f6bf93d8822c266cfcb927c4e166973550..205540536756407638abd977426d260e18918df4 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ mstt包括精度工具(msprobe)和性能工具(msprof-analyze),分析 ## [性能工具](./profiler) -[msprof-analzye(MindStudio Profiler Analyze 性能分析工具)](./profiler/msprof_analzye) +[msprof-analyze(MindStudio Profiler Analyze 性能分析工具)](./profiler/msprof_analyze/) 基于采集的性能数据进行分析,识别AI作业中的性能瓶颈。 diff --git a/profiler/msprof_analyze/README.md b/profiler/msprof_analyze/README.md index bacec50fdafb112727bba6076a945604eef87be9..61187815c8cdb5399ed18e3774991743df613d6a 100644 --- a/profiler/msprof_analyze/README.md +++ b/profiler/msprof_analyze/README.md @@ -108,18 +108,18 @@ pip3 install ./msprof_analyze-{version}-py3-none-any.whl ## 🧰 使用方法 ### 数据准备 -msprof-analzye需要传入采集的性能数据文件夹,如何采集性能数据请参见[采集profiling性能数据指导](#采集profiling性能数据指导)章节。 +msprof-analyze需要传入采集的性能数据文件夹,如何采集性能数据请参见[采集profiling性能数据指导](#采集profiling性能数据指导)章节。 ### 命令格式 -msprof-analzye性能分析工具通过命令行方式启动性能分析。命名格式如下: +msprof-analyze性能分析工具通过命令行方式启动性能分析。命名格式如下: ``` msprof-analyze -m [feature_option] -d [global_option] [analyze_option] ``` -`-m`指定分析能力,`[feature_option]`可指定对应特性,详见[分析特性介绍](#分析特性介绍)章节,必选。 -``为profiling性能数据文件夹,必选。 -`[global_option]`为全局参数,详见[全局参数说明](#全局参数)章节,可选。 -`[analyze_option]`为分析能力参数,详见[分析能力参数说明](#分析能力参数)章节,可选。 +* `-m`指定分析能力,`[feature_option]`可指定对应特性,详见[分析特性介绍](#分析特性介绍)章节,必选。 +* ``为profiling性能数据文件夹,必选。 +* `[global_option]`为全局参数,详见[全局参数说明](#全局参数)章节,可选。 +* `[analyze_option]`为分析能力参数,详见[分析能力参数说明](#分析能力参数)章节,可选。 详细使用样例请参考[使用样例](#使用样例)章节。 @@ -164,8 +164,8 @@ msprof-analyze -m [feature_option] -d [global_option] [analyze_ | 分析能力 | 介绍 | 介绍链接 | |---------|----------------------------------------|-----| -| cluster_time_summary | 性能数据细粒度拆解,替换step_trace_time.csv内容。 | [link](./docs/cluster_time_summary.md) | -| cluster_time_compare_summary | 性能数据细粒度对比。 | [link](./docs/cluster_time_compare_summary.md) | +| 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) | #### 计算类特性 @@ -186,7 +186,7 @@ msprof-analyze -m [feature_option] -d [global_option] [analyze_ | communication_time_sum | 集群场景通信时间和带宽汇总分析。 | - | | communication_matrix_sum | 集群场景通信时间和带宽汇总分析。 | - | | hccl_sum | 通信类算子信息汇总。 | - | -| pp_chart | pp流水图,针对pp并行下各个阶段的耗时分析与可视化能力。| [link](./docs/pp_chart.md) | +| pp_chart | pp流水图,针对pp并行下各个阶段的耗时分析与可视化能力。| [link](./docs/features/pp_chart.md) | | slow_rank | 根据当前的快慢卡统计算法,展示各个rank得出的快慢卡影响次数,识别慢卡出现的原因。 | - | #### Host下发类特性 @@ -307,4 +307,4 @@ msprof-analyze advisor all -d ./prof_data -o ./advisor_output - 昇腾计算生态使能部 - 2012网络实验室 -感谢来自社区的每一个PR,欢迎贡献 msprof-analzye! \ No newline at end of file +感谢来自社区的每一个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 9fd9b19571e7e6c4c87045ae54317d2e36cda5ca..e63cb11c869b744df7bdb6c486f0947da7a37455 100644 --- a/profiler/msprof_analyze/cli/cluster_cli.py +++ b/profiler/msprof_analyze/cli/cluster_cli.py @@ -24,7 +24,7 @@ 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') @@ -41,4 +41,11 @@ context_settings['ignore_unknown_options'] = True 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 466d7cf0bfa66c6c8bc332262d0bd09c38bd42ec..92b24bb0db93735c70403de5e21e6005c9494d16 100644 --- a/profiler/msprof_analyze/cli/entrance.py +++ b/profiler/msprof_analyze/cli/entrance.py @@ -63,7 +63,7 @@ class SpecialHelpOrder(click.Group): args = ['cluster'] + args # 如果没有子命令也没有参数,执行--help elif not has_subcommand and not args: - args = ['--help'] + args = ['cluster', '--help'] return super(SpecialHelpOrder, self).parse_args(ctx, args) diff --git a/profiler/msprof_analyze/cluster_analyse/README.md b/profiler/msprof_analyze/cluster_analyse/README.md index 184421e8ea90ab4e69fd23a681305b656c5c23b0..cdf8a8c10457e2f8313f18feaaba112649509178 100644 --- a/profiler/msprof_analyze/cluster_analyse/README.md +++ b/profiler/msprof_analyze/cluster_analyse/README.md @@ -1,2 +1,2 @@ -# msprof-analzye集群分析能力 -本能力已经整合到msprof-analzye性能分析工具中.详细介绍请参照[msprof-analzye](../README.md)说明文档使用. \ No newline at end of file +# msprof-analyze集群分析能力 +本能力已经整合到msprof-analyze性能分析工具中.详细介绍请参照[msprof-analyze](../README.md)说明文档使用. \ No newline at end of file diff --git a/profiler/msprof_analyze/docs/cluster_time_compare_summary.md b/profiler/msprof_analyze/docs/features/cluster_time_compare_summary.md similarity index 94% rename from profiler/msprof_analyze/docs/cluster_time_compare_summary.md rename to profiler/msprof_analyze/docs/features/cluster_time_compare_summary.md index 48abb91217f951ccdcf121a8744256525990622f..0ce970d068d540987cdaec514506f2f738b65783 100644 --- a/profiler/msprof_analyze/docs/cluster_time_compare_summary.md +++ b/profiler/msprof_analyze/docs/features/cluster_time_compare_summary.md @@ -22,7 +22,7 @@ msprof-analyze -m cluster_time_compare_summary -d ./cluster_data --bp ./base_clu * `-m`cluster_time_compare_summary 使能集群耗时细粒度对比能力 * `-d`集群性能数据文件夹路径 * `-bp`标杆集群数据路径 -* 其余参数:与msprof-analzye参数一致 +* 其余参数:参考msprof-analyze调用参数指导,详见[参数说明](../../README.md#参数说明) **输出数据:** * 存储位置:cluster_analysis_output/cluster_analysis.db diff --git a/profiler/msprof_analyze/docs/cluster_time_summary.md b/profiler/msprof_analyze/docs/features/cluster_time_summary.md similarity index 92% rename from profiler/msprof_analyze/docs/cluster_time_summary.md rename to profiler/msprof_analyze/docs/features/cluster_time_summary.md index f3ed99868a98250c157d5075011a5e8966980e7d..ff25b6eb75e168e8385181205a8fe241ee1cd045 100644 --- a/profiler/msprof_analyze/docs/cluster_time_summary.md +++ b/profiler/msprof_analyze/docs/features/cluster_time_summary.md @@ -1,48 +1,48 @@ -# 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-analzye参数一致 - -**输出数据:** -* 存储位置:cluster_analysis_output/cluster_analysis。db -* 数据表名:ClusterTimeSummary -![输出结果展示](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_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/pp_chart.md b/profiler/msprof_analyze/docs/features/pp_chart.md similarity index 95% rename from profiler/msprof_analyze/docs/pp_chart.md rename to profiler/msprof_analyze/docs/features/pp_chart.md index cf450c356a4483311aba1554cf011f4bfac860c9..31ccf5f2f09f7180d323fa32fa548adf04a0a49d 100644 --- a/profiler/msprof_analyze/docs/pp_chart.md +++ b/profiler/msprof_analyze/docs/features/pp_chart.md @@ -5,8 +5,8 @@ pp流水图指的是将实际pp域内的流水排布进行可视化呈现,可 下面是1F1B和DualPipeV的理论效果图 -![1F1B](img/1F1B.png) -![DualPipeV](img/DualPipeV.png) +![1F1B](../source/img/1F1B.png) +![DualPipeV](../source/img/DualPipeV.png) ## 操作指导 @@ -110,7 +110,7 @@ msprof-analyze cluster -m pp_chart -d ./cluster_data ``` **参数说明:** * `-d` 第一步打点后采集到的集群数据路径 -* 其余参数:与cluster集群分析功能支持的参数一致,详见[参数列表](../cluster_analyse/README.md) +* 其余参数:参考msprof-analyze调用参数指导,详见[参数说明](../../README.md#参数说明) **输出数据:** * 存储位置:每个rank的数据ASCEND_PROFILER_OUTPUT/ascend_pytorch_profiler_{rank_id}.db里面新增一张表StepTaskInfo @@ -132,8 +132,8 @@ MindStudio Insight工具的详细安装和操作请参见[《MindStudio Insight 在MindStudio Insight工具导入mstt工具分析后的性能数据,在Summary页面点击Generate后按照如下截图配置: -![操作步骤](img/pp_chart_operation_steps.png) +![操作步骤](../source/img/pp_chart_operation_steps.png) 如下为pp_chart完成pp流水图分析后的呈现效果: -![操作步骤](img/pp_chart_effect.png) \ No newline at end of file +![操作步骤](../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 new file mode 100644 index 0000000000000000000000000000000000000000..4497228223f3e0cc128dafe711bc30249a9d8145 --- /dev/null +++ b/profiler/msprof_analyze/docs/recipe_output_format.md @@ -0,0 +1,686 @@ +## recipe结果和cluster_analysis.db交付件表结构说明 + +说明: + +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时,会生成以下表。 + +#### ComputeOpAllRankStats + +说明: + +基于db格式的集群性能数据,针对全部rank的数据,以OpType和TaskType分组,对计算算子的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| OpType | TEXT | 计算算子类型 | +| TaskType | TEXT | 算子执行的加速器类型 | +| Count | INTEGER | 以OpType和TaskType分组进行统计的算子数量 | +| MeanNs | REAL | 耗时的平均值 | +| StdNs | REAL | 耗时的标准差 | +| MinNs | REAL | 耗时的最小值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| MedianNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| MaxNs | REAL | 耗时的最大值 | +| SumNs | REAL | 耗时的总和 | + +#### ComputeOpPerRankStatsByOpType + +说明: + +基于db格式的集群性能数据,针对每个rank的数据,以OpType和TaskType分组,对计算算子的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| OpType | TEXT | 计算算子类型 | +| TaskType | TEXT | 算子执行的加速器类型 | +| Count | INTEGER | 以OpType和TaskType分组进行统计的算子数量 | +| MeanNs | REAL | 耗时的平均值 | +| StdNs | REAL | 耗时的标准差 | +| MinNs | REAL | 耗时的最小值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| MedianNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| MaxNs | REAL | 耗时的最大值 | +| SumNs | REAL | 耗时的总和 | +| Rank | INTEGER | rank_id | + +#### ComputeOpPerRankStatsByOpName + +说明: + +配置--exclude_op_name参数时不会生成该表; +基于db格式的集群性能数据,针对每个rank的数据,以OpName、OpType、TaskType和InputShapes分组,对计算算子的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| OpName | TEXT | 计算算子名字 | +| OpType | TEXT | 计算算子类型 | +| TaskType | TEXT | 算子执行的加速器类型 | +| InputShapes | TEXT | 算子的输入维度 | +| Count | INTEGER | 这个分组的算子数量 | +| MeanNs | REAL | 耗时的平均值 | +| StdNs | REAL | 耗时的标准差 | +| MinNs | REAL | 耗时的最小值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| MedianNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| MaxNs | REAL | 耗时的最大值 | +| SumNs | REAL | 耗时的总和 | +| Rank | INTEGER | rank_id | + +### cann_api_sum + +设置-m cann_api_sum时,会生成以下表。 + +#### CannApiSum + +说明: + +基于db格式的集群性能数据,针对全部rank的数据,对每一种api(名字不同)的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| name | TEXT | API名字 | +| timeRatio | REAL | API的耗时占所有API总耗时的百分比 | +| totalTimeNs | INTEGER | API的总耗时 | +| totalCount | INTEGER | API的数量 | +| averageNs | REAL | 耗时的平均值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| medNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| minNs | REAL | 耗时的最小值 | +| maxNs | REAL | 耗时的最大值 | +| stdev | REAL | 耗时的标准差 | +| minRank | TEXT | minNs对应的rank的集合 | +| maxRank | TEXT | maxNs对应的rank的集合 | + +#### CannApiSumRank + +说明: + +基于db格式的集群性能数据,针对每个rank的数据,对每一种api(名字不同)的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| name | TEXT | API名字 | +| durationRatio | REAL | API的耗时占卡内所有API总耗时的百分比 | +| totalTimeNs | INTEGER | API的总耗时 | +| totalCount | INTEGER | API的数量 | +| averageNs | REAL | 耗时的平均值 | +| minNs | REAL | 耗时的最小值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| medNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| maxNs | REAL | 耗时的最大值 | +| stdev | REAL | 耗时的标准差 | +| rank | INTEGER | rank_id | + +### hccl_sum + +设置-m hccl_sum时,会生成以下表。 + +#### HcclAllRankStats + +说明: + +基于db格式的集群性能数据,针对全部rank的数据,对每一种通信算子类型(例如hcom_broadcast_)的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| OpType | TEXT | 通信算子类型 | +| Count | INTEGER | 数量 | +| MeanNs | REAL | 耗时的平均值 | +| StdNs | REAL | 耗时的标准差 | +| MinNs | REAL | 耗时的最小值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| MedianNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| MaxNs | REAL | 耗时的最大值 | +| SumNs | REAL | 耗时的总和 | + +#### HcclPerRankStats + +说明: + +基于db格式的集群性能数据,针对每个rank的数据,对每一种通信算子类型(例如hcom_broadcast_)的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| OpType | TEXT | 通信算子类型 | +| Count | INTEGER | 数量 | +| MeanNs | REAL | 耗时的平均值 | +| StdNs | REAL | 耗时的标准差 | +| MinNs | REAL | 耗时的最小值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| MedianNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| MaxNs | REAL | 耗时的最大值 | +| SumNs | REAL | 耗时的总和 | +| Rank | INTEGER | rank_id | + +#### HcclGroupNameMap + +说明: + +通信域内包含的rank。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| GroupName | TEXT | 通信域,例如:10.170.22.98%enp67s0f5_60000_0_1708156014257149 | +| GroupId | TEXT | 通信域的hash值的后三位 | +| Ranks | TEXT | 该通信域的所有rank | + +#### HcclTopOpStats + +说明: + +基于db格式的集群性能数据,对所有rank的通信算子的耗时进行分析,展示耗时平均值排名TOP N(默认为 15)的通信算子的数据。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| OpName | TEXT | 通信算子名,例如hcom_allReduce__606_0_1 | +| Count | INTEGER | 数量 | +| MeanNs | REAL | 耗时的平均值 | +| StdNs | REAL | 耗时的标准差 | +| MinNs | REAL | 耗时的最小值 | +| Q1Ns | REAL | 耗时的25%分位数 | +| MedianNs | REAL | 耗时的50%分位数 | +| Q3Ns | REAL | 耗时的75%分位数 | +| MaxNs | REAL | 耗时的最大值 | +| SumNs | REAL | 耗时的总和 | +| MinRank | INTEGER | 该通信算子耗时最小的rank | +| MaxRank | INTEGER | 该通信算子耗时最大的rank | + +### mstx_sum + +设置-m mstx_sum时,会生成以下表。 + +#### MSTXAllFrameworkStats + +说明: + +基于db格式的集群性能数据,分析mstx打点数据的框架侧耗时(不区分rank)。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| Name | TEXT | mstx打点数据携带信息 | +| Count | INTEGER | 该迭代内以Name为分组的打点的次数 | +| MeanNs | REAL | 平均值 | +| StdNs | REAL | 标准差 | +| MinNs | REAL | 最小值 | +| Q1Ns | REAL | 25%分位数 | +| MedianNs | REAL | 50%分位数 | +| Q3Ns | REAL | 75%分位数 | +| MaxNs | REAL | 最大值 | +| SumNs | REAL | 总和 | +| StepId | INTEGER | 迭代id | + +#### MSTXAllCannStats + +说明: + +基于db格式的集群性能数据,分析mstx打点数据的cann层耗时(不区分rank)。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| Name | TEXT | mstx打点数据携带信息 | +| Count | INTEGER | 该迭代内以Name为分组的打点的次数 | +| MeanNs | REAL | 平均值 | +| StdNs | REAL | 标准差 | +| MinNs | REAL | 最小值 | +| Q1Ns | REAL | 25%分位数 | +| MedianNs | REAL | 50%分位数 | +| Q3Ns | REAL | 75%分位数 | +| MaxNs | REAL | 最大值 | +| SumNs | REAL | 总和 | +| StepId | INTEGER | 迭代id | + +#### MSTXAllDeviceStats + +说明: + +基于db格式的集群性能数据,分析mstx打点数据的device侧耗时(不区分rank)。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| Name | TEXT | mstx打点数据携带信息 | +| Count | INTEGER | 该迭代内以Name为分组的打点的次数 | +| MeanNs | REAL | 平均值 | +| StdNs | REAL | 标准差 | +| MinNs | REAL | 最小值 | +| Q1Ns | REAL | 25%分位数 | +| MedianNs | REAL | 50%分位数 | +| Q3Ns | REAL | 75%分位数 | +| MaxNs | REAL | 最大值 | +| SumNs | REAL | 总和 | +| StepId | INTEGER | 迭代id | + +#### MSTXMarkStats + +说明: + +基于db格式的集群性能数据,针对每个rank的打点数据,以Rank,StepId分组,对mstx打点的耗时进行统计分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| Name | TEXT | mstx打点数据携带信息 | +| FrameworkDurationNs | REAL | 框架侧耗时 | +| CannDurationNs | REAL | CANN层耗时 | +| DeviceDurationNs | REAL | device侧耗时 | +| Rank | INTEGER | global rank | +| StepId | INTEGER | 迭代id | + +### communication_group_map + +设置-m communication_group_map,会生成以下表。 + +#### CommunicationGroupMapping + +说明: + +基于db格式的集群性能数据,生成通信域与并行策略的对应关系。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| type | TEXT | 算子类型,包含collective和p2p, 其中算子名包含"send","recv","receive"的算子被认为是p2p | +| rank_set | TEXT | 通信域内包含的rank(global rank)| +| group_name | TEXT | 通信域的hash值,可映射成group_id | +| group_id | TEXT | hccl内部定义的通信域名字,例如:10.170.22.98%enp67s0f5_60000_0_1708156014257149 | +| pg_name | TEXT | 业务定义的通信域名字,例如:"dp","dp_cp","mp"等等 | + +### cluster_time_summary + +设置-m cluster_time_summary时,会生成以下表。 + +说明:和cluster_step_trace_time.csv相似,之后考虑替代它。 + +#### ClusterTimeSummary + +说明: + +基于db格式的集群性能数据,针对全部rank的数据,对集群的一些耗时进行统计分析,可以用来定位性能问题。 + +格式: +**下表的时间单位都是us** + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| rank | INTEGER | global rank | +| step | INTEGER | 迭代id | +| stepTime | REAL | 整个迭代耗时 | +| computation | REAL | 计算时间的全部耗时 | +| communicationNotOverlapComputation | REAL | 未被计算掩盖的通信耗时 | +| communicationOverlapComputation | REAL | 计算与通信重叠的耗时 | +| communication | REAL | 通信时间的全部耗时 | +| free | REAL | 空闲时间,指device侧既不在通信也不在计算、并且不包含异步拷贝的总耗时 | +| communicationWaitStageTime | REAL | 通信等待总耗时 | +| communicationTransmitStageTime | REAL | 通信传输总耗时 | +| memory | REAL | 异步拷贝的总耗时 | +| memoryNotOverlapComputationCommunication | REAL | 不被计算和通信掩盖的异步拷贝的总耗时 | +| taskLaunchDelayAvgTime | REAL | 下发耗时,指所有task从host侧api的开始时间到device侧task的开始时间的平均耗时 | + +### cluster_time_compare_summary + +设置-m cluster_time_compare_summary时,会生成以下表。 + +说明:该分析能力需要基于cluster_time_summary的结果,集群数据和标杆集群数据都要有cluster_analysis.db,db里面要有ClusterTimeSummary这个表。 + +#### ClusterTimeCompareSummary + +说明:结果表示当前集群与标杆集群的比较结果,比如computationDiff表示当前集群与标杆集群的计算时间的差值,如果当前集群的计算时间比标杆集群多,则computationDiff为正数,反之为负数。 + +格式: +**下表的时间单位都是us** + +| 字段名 | 类型 | 含义 | +|--------------| ---- | ---- | +| rank | INTEGER | global rank | +| step | INTEGER | 迭代id | +| stepTime | REAL | 当前集群数据的迭代耗时 | +| stepTimeBase | REAL | 标杆集群数据的计算时间 | +| stepTimeDiff | REAL | 迭代耗时的差值 | +…… +| taskLaunchDelayAvgTime | REAL | 当前集群数据的下发耗时 | +| taskLaunchDelayAvgTimeBase | REAL | 标杆集群数据的下发耗时 | +| taskLaunchDelayAvgTimeDiff | REAL | 下发耗时的差值 | + +由于列过多,就不展示全部列了,对于ClusterTimeSummary的每一列,在这个表里面都会展示当前集群数据、标杆集群数据以及他们的差值。 + + +### freq_analysis + +说明: + +基于db格式的集群性能数据,分析aicore frequency,提供npu降频一键检测能力。频率分为三种情况: +* 正常情况下,应当稳定在1800MHz; +* 当npu空闲时间较长时,设备会自动降频,会掉到800MHz; +* 当npu因为各种原因,出现降频现象时,除了1800MHz,800MHz,还有出现其他异常频率。 + +设置-m freq_analysis时,如果发生降频,会生成以下表。 + +#### FreeFrequencyRanks + +说明: + +对应第二种情况。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| rankId | INTEGER | global rank | +| aicoreFrequency | TEXT | [800, 1800] | + +#### AbnormalFrequencyRanks + +说明: + +对应第三种情况。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| rankId | INTEGER | global rank | +| aicoreFrequency | TEXT | 异常频率列表;例如:[800, 1150, 1450, 1800] | + +### ep_load_balance + +说明: + +集群训练场景下,MOE负载不均指的是,在分布式环境下,不同的专家模型处理的任务量不均衡,导致某些专家过载(处理过多任务),而其他专家闲置。这种负载不均会降低系统的整体效率,甚至可能导致性能瓶颈。 + +设置-m ep_load_balance时,会生成以下表。 + +#### EPTokensSummary + +说明: + +基于db格式的集群性能数据,分析GroupedMatmul算子的shape信息。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| rank | INTEGER | global rank | +| epRanks | TEXT | 同一个ep(Expert Parallelism)的rank集合,例如0,1 | +| inputShapesSummary | INTEGER | 该rank的GroupedMatmul算子的inputshapes的第一个维度的总和 | + +#### TopEPTokensInfo + +说明: + +负载不均的ep。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| epRanks | TEXT | 负载不均的ep(Expert Parallelism)的rank集合,例如0,1 | +| tokensDiff | INTEGER | 同一个ep内最大值与最小值之间的差值 | + + +### filter_db + +设置-m filter_db时,不会生成cluster_analysis.db,会将原始db进行过滤,使得集群数据变小,有时候甚至能减少90%,将TB级数据过滤至GB级。过滤后的数据依旧可以在MindStudio Insight中呈现。 + +**说明:最好指定-o 参数,指定提取后的集群数据的目录。** + +示例:msprof-analyze cluster -d {cluster_profiling_data_path} -m filter_db -o {output_dir} + +结果示例: +``` +output_dir +├── cluster_analysis_output +├── ├── filter_db +├── ├── ├── xxx_ascend_pt +├── ├── ├── ├── ASCEND_PROFILER_OUTPUT +├── ├── ├── ├── ├── ascend_pytorch_profiler_x.db +├── ├── ├── xxx_ascend_pt +├── ├── ├── …… +``` + +过滤逻辑: + +1. 删除COMMUNICATION_TASK_INFO和TASK_PMU_INFO +2. 获取所有的COMMUNICATION_OP全保留,获取全部的connectionId集合 +3. 根据opType(TOP算子FA、MatMul、GroupedMatmul)筛选COMPUTE_TASK_INFO和TASK(通过globalTaskId进行关联)数据,同时获取筛选出来的connectionId集合。 +4. 逻辑2和逻辑3的connectionId集合取并集,CANN_API、Pytorch_API的connectionId相同的数据保留,其他去掉。 + +### mstx2commop + +设置-m mstx2commop时,不会生成cluster_analysis.db,会将通信内置打点数据转换成通信算子。 + +**说明:强烈建议在levelNone的情况下使用,会新生成COMMUNICATION_OP,否则会破坏原来的表结构。** + +结果: + +设置levelNone时,统一db里面没有COMMUNICATION_OP,该分析能力会将通信内置打点数据转换成通信算子,并且可以在MindStudio Insight中呈现。 + +### slow_rank + +设置-m slow_rank时,会生成以下表。 + +#### SlowRank + +说明: + +基于db格式的集群性能数据,进行慢卡分析。 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| rankId | INTEGER | 慢卡 | +| slowAffectCount | INTEGER | 该rank影响了多少次通信 | + +### p2p_pairing + +设置-m p2p_pairing时,不会生成cluster_analysis.db。 + +说明:该分析能力主要是为了显示P2P算子的连线,让用户看到发送和接收的src_rank和dst_rank。**目前MindStudio Insight暂时没有做这一块的适配。** + +结果: + +会在集群数据的ascend_pytorch_profiler_{rank_id}.db的Communication_OP表中新增一列opConnectionId。 根据这个opConnectionId可以把不同rank的P2P算子连线。 + + +### pp_chart + +说明: 这个能力需要首先要使用轻量化打点在前反向前后打点,然后使用mstt进行处理,最后用MindStudio Insight进行显示。 + +#### 打点 + +以DualpipeV2为例,找到前反向代码,在dualpipev_schedules.py里面添加如下代码(仅为示例,需要注意这段代码添加的位置): +``` +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") +``` + +同时,采集profiling数据时,需要添加metadata: + +``` +prof.add_metadata('pp_info', json.dumps( + { + 'pp_type': 'dualpipev', + 'microbatch_num': 10, + } +)) +# microbatch_num需要替换成实际的值 +``` + +#### StepTaskInfo + +说明: + +基于上一章节打点后的db格式的集群性能数据,进行处理,生成表格,供可视化显示 + +格式: + +| 字段名 | 类型 | 含义 | +| ------ | ---- | ---- | +| name | TEXT | 前反向信息 | +| startNs | INTEGER | 在device上开始时间 | +| endNs | INTEGER | 在device上结束时间 | +| type | INTEGER | 类型,不同类型显示不同颜色 | + +#### 通信 + +当profiler_level设为Level_none时,COMMUNICATION_OP这个表不存在,需要使用mstx2commop这个分析能力将通信内置打点转换为通信算子,这样就会生成这个表。pp流水图也可以显示send和recv。 + +有了COMMUNICATION_OP这个表,需要使用分析能力p2p_pairing。这样pp流水图也可以显示send和recv的连线,但是这个能力需要level1及以上。 + +#### communication_group.json + +记录通信域信息,解析analysis.db生成的交付件,collective表示集合通信域,P2P表示点对点通信,用户无须关注该文件。 + +#### stats.ipynb + +- 数据解析模式为cann_api_sum时生成,保存在cluster_analysis_output/CannApiSum目录下。 + + 可使用jupyter notebook工具或MindStudio Insight工具打开,主要展示集群API耗时信息。 + +- 数据解析模式为compute_op_sum时生成,保存在cluster_analysis_output/ComputeOpSum目录下。 + + 可使用jupyter notebook工具或MindStudio Insight工具打开,主要展示集群计算算子耗时分析(将集群所有计算算子进行汇总并以图表展示),集群Rank计算算子耗时分析(将每个Rank的计算算子进行各自汇总)。 + +- 数据解析模式为hccl_sum时生成,保存在cluster_analysis_output/HcclSum目录下。 + + 可使用jupyter notebook工具或MindStudio Insight工具打开,主要展示集群通信算子耗时分析(将集群所有通信算子进行汇总并以图表展示),集群Rank通信算子耗时分析(将每个Rank的通信算子进行各自汇总)、Top通信算子信息展示。 + +- 数据解析模式为mstx_sum时生成,保存在cluster_analysis_output/MstxSum目录下。 + + 可使用jupyter notebook工具或MindStudio Insight工具打开,主要展示集群场景mstx打点信息,分为框架侧、CANN侧和Device侧三部分的打点信息。 + +- 数据解析模式为slow_link时生成,保存在cluster_analysis_output/SlowLink目录下。 + + 可使用jupyter notebook工具或MindStudio Insight工具打开,主要展示集群场景异常慢链路数据分析(将集群所有链路进行汇总并以图表展示),集群慢链路汇总耗时分析(展示检测到可能存在慢链路的数据)。 diff --git a/profiler/msprof_analyze/docs/img/1F1B.png b/profiler/msprof_analyze/docs/source/img/1F1B.png similarity index 100% rename from profiler/msprof_analyze/docs/img/1F1B.png rename to profiler/msprof_analyze/docs/source/img/1F1B.png diff --git a/profiler/msprof_analyze/docs/img/DualPipeV.png b/profiler/msprof_analyze/docs/source/img/DualPipeV.png similarity index 100% rename from profiler/msprof_analyze/docs/img/DualPipeV.png rename to profiler/msprof_analyze/docs/source/img/DualPipeV.png diff --git a/profiler/msprof_analyze/docs/img/clutser_time_summary.png b/profiler/msprof_analyze/docs/source/img/clutser_time_summary.png similarity index 100% rename from profiler/msprof_analyze/docs/img/clutser_time_summary.png rename to profiler/msprof_analyze/docs/source/img/clutser_time_summary.png diff --git a/profiler/msprof_analyze/docs/img/pp_chart_effect.png b/profiler/msprof_analyze/docs/source/img/pp_chart_effect.png similarity index 100% rename from profiler/msprof_analyze/docs/img/pp_chart_effect.png rename to profiler/msprof_analyze/docs/source/img/pp_chart_effect.png diff --git a/profiler/msprof_analyze/docs/img/pp_chart_operation_steps.png b/profiler/msprof_analyze/docs/source/img/pp_chart_operation_steps.png similarity index 100% rename from profiler/msprof_analyze/docs/img/pp_chart_operation_steps.png rename to profiler/msprof_analyze/docs/source/img/pp_chart_operation_steps.png