recipe结果和cluster_analysis.db交付件表结构说明

Note

  • 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",会有多个搜索结果,一般来说链路带宽信息的结构:

{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 通信域,例如:{ip_address}%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内部定义的通信域名字,例如:{ip_address}%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 迭代耗时的差值
…… - 此处省略部分字段,对于ClusterTimeSummary表,均展示当前集群数据、标杆集群数据以及二者的差值
taskLaunchDelayAvgTime REAL 当前集群数据的下发耗时
taskLaunchDelayAvgTimeBase REAL 标杆集群数据的下发耗时
taskLaunchDelayAvgTimeDiff REAL 下发耗时的差值

freq_analysis

说明:

基于db格式的集群性能数据,分析aicore frequency,提供npu降频一键检测能力。频率分为三种情况:

  • 正常情况下,应当稳定在1800MHz;
  • 当npu空闲时间较长时,设备会自动降频,会掉到800MHz;
  • 当npu因为各种原因,出现降频现象时,除了1800MHz,800MHz,还会出现其他异常频率。

设置-m freq_analysis时,如果发生降频,会生成以下表。

FreeFrequencyRanks

说明:

对应第二种情况:当npu空闲时间较长时,设备会自动降频,会掉到800MHz。

格式:

字段名 类型 含义
rankId INTEGER global rank
aicoreFrequency TEXT [800, 1800]

AbnormalFrequencyRanks

说明:

对应第三种情况:当npu因为各种原因,出现降频现象时,除了1800MHz,800MHz,还会出现其他异常频率。

格式:

字段名 类型 含义
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内最大值与最小值之间的差值

mstx2commop

设置-m mstx2commop时,不会生成cluster_analysis.db,会将通信内置打点数据转换成通信算子。

说明:强烈建议在Level_none的情况下使用,会新生成COMMUNICATION_OP,否则会破坏原来的表结构。

结果:

设置Level_none时,统一db里面没有COMMUNICATION_OP,该分析能力会将通信内置打点数据转换成通信算子,并且可以在MindStudio Insight中呈现。

slow_rank

设置-m slow_rank时,会生成以下表。

SlowRank

说明:

基于db格式的集群性能数据,进行慢卡分析。

格式:

字段名 类型 含义
rankId INTEGER 慢卡
slowAffectCount INTEGER 该rank影响了多少次通信

SlowOpStats

说明:

基于db格式的集群性能数据,慢卡瓶颈位置对应的通信算子统计信息。

格式:

字段名 类型 含义
SlowRank TEXT 慢卡rankId
OpName TEXT 通信算子名
GroupName TEXT 通信域名称
Timestamp TEXT 通信算子时间戳
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

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

说明: 这个能力需要首先要使用轻量化打点在前反向前后打点,然后使用msprof-analyze进行处理,最后用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_overlapping"
        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工具打开,主要展示集群场景异常慢链路数据分析(将集群所有链路进行汇总并以图表展示),集群慢链路汇总耗时分析(展示检测到可能存在慢链路的数据)。

export_summary

设置-m export_summary时,会在各卡的ASCEND_PROFILER_OUTPUT目录下生成以下文件。

api_statistic.csv

说明:

基于db格式的集群性能数据,导出各卡的API统计信息。

格式:

字段名 类型 含义
API Name TEXT API名称
Count INTEGER 调用次数
Total Time(us) REAL 总耗时(微秒)
Avg Time(us) REAL 平均耗时(微秒)
Min Time(us) REAL 最小耗时(微秒)
Max Time(us) REAL 最大耗时(微秒)

kernel_details.csv

说明:

基于db格式的集群性能数据,导出各卡的Kernel详情信息。

格式:

字段名 类型 含义
op_name TEXT 算子名称
op_type TEXT 算子类型
task_type TEXT 任务类型
task_duration REAL 任务耗时(微秒)
input_shapes TEXT 输入形状
output_shapes TEXT 输出形状
block_dim TEXT Block维度
input_data_types TEXT 输入数据类型
output_data_types TEXT 输出数据类型