diff --git a/profiler/cluster_analyse/README.md b/profiler/cluster_analyse/README.md index 8981ac45304149f5b19d47665064952555be28c1..f10ecb97d26c78e9e4b7833351377df8da9c74b2 100644 --- a/profiler/cluster_analyse/README.md +++ b/profiler/cluster_analyse/README.md @@ -1,7 +1,7 @@ -# 功能介绍 -集群场景下,通过此工具来进行集群数据的分析,当前主要对基于通信域的迭代内耗时分析、通信时间分析以及通信矩阵分析为主, 从而定位慢卡、慢节点以及慢链路问题。 +# 集群分析工具 +cluster_analyse(集群分析工具)是在集群场景下,通过此工具来进行集群数据的分析,当前主要对基于通信域的迭代内耗时分析、通信时间分析以及通信矩阵分析为主, 从而定位慢卡、慢节点以及慢链路问题。 -# 数据采集 +## 性能数据采集 当前集群调优工具主要支持Ascend Pytorch Profiler采集方式下的集群数据。 我们要求至少是L1级别的数据。 @@ -23,9 +23,9 @@ experimental_config = torch_npu.profiler._ExperimentalConfig( 确认这几个文件生成后,继续下面的集群分析。 -# 数据汇聚与集群解析 +## 数据汇聚与集群解析 -将所有卡的数据汇集到一个目录下,在本目录下运行以下命令即可生 cluster_analysis_output文件夹。 +将所有卡的数据拷贝并汇集到一个目录下,在本目录下运行以下命令即可生成cluster_analysis_output文件夹。 ```shell python3 cluster_analysis.py -d {cluster profiling data path} @@ -34,11 +34,11 @@ python3 cluster_analysis.py -d {cluster profiling data path} | 参数名 | 说明 | | ---------------------- | --------------------------------------- | -| --collection_path (-d) | profiling数据汇集目录,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据 | +| --collection_path (-d) | profiling数据汇集目录,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据。 | -# 交付件 +## 交付件 -### 首先需要看 cluster_step_trace_time.csv +### cluster_step_trace_time.csv A列: Step数,是采集profiling是设置的,一般来说集群profiling采集一个step足够,如果采集多个step,需要先筛选一下。 @@ -48,13 +48,13 @@ C列:Index,与type相关,表示卡号。 D列:Computing, 此列统计计算时间。 -E列:Communication(Not Overlapped): 此列统计未被掩盖的通信耗时。 +E列:Communication(Not Overlapped),此列统计未被掩盖的通信耗时。 -F列:Overlapped: 统计计算与通信重叠的耗时。 +F列:Overlapped,统计计算与通信重叠的耗时。 -G列:Communication: 通信时间的全部耗时。 +G列:Communication,通信时间的全部耗时。 -H列:Free: 空闲时间,只device侧既不在通信也不在计算的耗时,可能在做sdma拷贝或者空等。 +H列:Free,空闲时间,只device侧既不在通信也不在计算的耗时,可能在做sdma拷贝或者空等。 I列:Stage时间,I、J、K列属于pp并行时有效的数值,stage时间代表除recieve算子时间外的时间。 @@ -62,7 +62,7 @@ J列:Bubble时间,指receive时间的总和。 K列:Communication(Not Overlapped and Exclude Receive)指剔除recieve算子外的并且不被掩盖的通信时间。 -**Tips**: +**Tips**: 先筛选B列type为stage, 看stage间是否有问题,再筛选B列type为rank吗,看rank是否有问题,根据以下几点排查。 * 根据Computing的时间差异判断是否有慢卡,或者有负载不均衡的现象。 @@ -75,12 +75,9 @@ K列:Communication(Not Overlapped and Exclude Receive)指剔除recieve算 ### cluster_communication_matrix.json -直接打开json(vscode或json查看器), +直接打开json(vscode或json查看器), 搜索"Total", 会有多个搜索结果,一般来说链路带宽信息的结构: -搜索"Total", 会有多个搜索结果, - -一般来说链路带宽信息的结构: -``` +```bash {src_rank}-{dst_rank}: { "Transport Type": "LOCAL", "Transit Time(ms)": 0.02462, @@ -88,7 +85,7 @@ K列:Communication(Not Overlapped and Exclude Receive)指剔除recieve算 "Bandwidth(GB/s)": 681.4466 } ``` -**Tips**: 可以根据rank互联的带宽以及链路类型,判断是否有慢链路的问题。 +**Tips**:可以根据rank互联的带宽以及链路类型,判断是否有慢链路的问题。 - "LOCAL"是片内拷贝,速率非常快,不需要考虑。 - “HCCS”或“PCIE”是节点内片间拷贝,速度在18GB左右或以上比较正常。 diff --git a/profiler/compare_tools/README.md b/profiler/compare_tools/README.md index df0622da647322374688991b97f77cf5e6599eda..0c971842cf470fdba6764fd778153fd959e7513a 100644 --- a/profiler/compare_tools/README.md +++ b/profiler/compare_tools/README.md @@ -1,9 +1,9 @@ # 性能比对工具 -## 简介 -性能比对工具支持比较GPU与NPU之间、NPU与NPU之间的性能差异,通过对训练耗时和内存占用的比对分析,定位到具体劣化的算子,帮助用户提升性能调优的效率。工具将训练耗时拆分为算子、通信、调度三大维度,并针对算子和通信分别进行算子级别的比对;将训练占用的总内存,拆分成算子级别的内存占用进行比对。 +compare_tools(性能比对工具)支持比较GPU与NPU之间、NPU与NPU之间的性能差异,通过对训练耗时和内存占用的比对分析,定位到具体劣化的算子,帮助用户提升性能调优的效率。工具将训练耗时拆分为计算、通信、调度三大维度,并针对计算和通信分别进行算子级别的比对;将训练占用的总内存,拆分成算子级别的内存占用进行比对。 ## 使用场景 + 场景一:PyTorch训练工程从GPU迁移至NPU后出现性能劣化,通过工具分析出劣化点。 场景二:PyTorch训练工程在NPU上,不同版本之间存在性能差距,通过工具定位具体差异。 @@ -12,35 +12,42 @@ ### 环境依赖 -使用本工具前需要安装openpyxl: +使用本工具前需要安装的依赖包:prettytable、xlsxwriter、pandas、numpy ```bash -pip3 install openpyxl +pip3 install prettytable +pip3 install xlsxwriter +pip3 install pandas +pip3 install numpy ``` ### 性能数据采集 #### GPU性能数据采集 + 通过PyTorch Profiler工具采集GPU的性能数据,参考链接:https://pytorch.org/docs/stable/profiler.html 采集样例代码参考1: + ```Python with torch.profiler.profile( - profile_memory=True, # 内存数据采集的开关 - record_shapes=True, # 算子input shape信息采集的开关 - schedule=torch.profiler.schedule(wait=10, warmup=0, active=1, repeat=1), - on_trace_ready=torch.profiler.tensorboard_trace_handler("./result_dir") + profile_memory=True, # 内存数据采集的开关 + record_shapes=True, # 算子input shape信息采集的开关 + schedule=torch.profiler.schedule(wait=10, warmup=0, active=1, repeat=1), + on_trace_ready=torch.profiler.tensorboard_trace_handler("./result_dir") ) as prof: for step in ranges(step_number): train_one_step() prof.step() ``` + 采集样例代码参考2: + ```Python prof = torch.profiler.profile( - profile_memory=True, # 内存数据采集的开关 - record_shapes=True, # 算子input shape信息采集的开关 - on_trace_ready=torch.profiler.tensorboard_trace_handler("./result_dir")) + profile_memory=True, # 内存数据采集的开关 + record_shapes=True, # 算子input shape信息采集的开关 + on_trace_ready=torch.profiler.tensorboard_trace_handler("./result_dir")) for step in range(step_number): if step == 11: prof.start() @@ -51,7 +58,7 @@ for step in range(step_number): pytorch profiler数据目录结构如下: -```Python +``` |- pytorch_profiling |- *.pt.trace.json ``` @@ -59,16 +66,18 @@ pytorch profiler数据目录结构如下: #### NPU性能数据采集 通过Ascend PyTorch Profiler工具采集NPU的性能数据,采集参数配置跟GPU一致,参考链接:https://www.hiascend.com/document/detail/zh/canncommercial/63RC2/modeldevpt/ptmigr/ptmigr_0066.html +将GPU的性能数据采集代码中torch.profiler替换成torch_npu.profiler + ascend pytorch profiler数据目录结构如下: -```Python +``` |- ascend_pytorch_profiling - |- *_ascend_pt + |- * _ascend_pt |- ASCEND_PROFILER_OUTPUT |- trace_view.json |- FRAMEWORK |- PROF_XXX - |- *_ascend_pt + |- * _ascend_pt ``` ### 性能数据比对 @@ -81,22 +90,26 @@ cd att/profiler/compare_tools # 执行最简比对命令 python performance_compare.py [基准性能数据文件] [比对性能数据文件] --output_path=./result_dir ``` -- 基准性能数据文件(必选):若以GPU为基准,指定到以".pt.trace"结尾的json文件;若以NPU不同版本为基准,指定文件参考**比对性能数据文件**。 + +- 基准性能数据文件(必选):若以GPU为基准,指定到以".pt.trace"结尾的json文件;若以NPU不同版本为基准,指定文件参考**比对性能数据文件 + **。 - 比对性能数据文件(必选):可以指定以“ascend_pt”结尾的目录、ASCEND_PROFILER_OUTPUT目录或trace_view.json文件,指定trace_view.json无法显示算子的内存占用。 - --output_path(可选):性能比对结果存放的路径,默认保存在当前目录。 -工具将总体性能拆解为训练耗时和内存占用,其中训练耗时可拆分为算子、通信、调度三个维度,以打屏的形式输出总体指标,帮助用户定界劣化的方向。与此同时,工具还会生成performance_comparison_result_*.xlsl,展示每个算子在执行耗时、通信耗时、内存占用的优劣,可通过DIFF列大于0筛选出劣化算子。详细介绍请参见“**比对结果说明**”。 +工具将总体性能拆解为训练耗时和内存占用,其中训练耗时可拆分为算子、通信、调度三个维度,以打屏的形式输出总体指标,帮助用户定界劣化的方向。与此同时,工具还会生成performance_comparison_result_* +.xlsl,展示每个算子在执行耗时、通信耗时、内存占用的优劣,可通过DIFF列大于0筛选出劣化算子。详细介绍请参见“**比对结果说明**”。 #### 通用参数说明 -| 参数名 | 说明 | 是否必选 | -| ------------------------------ | ------------------ | -------- | -| --enable_profiling_compare | 开启总体性能比对。 | 否 | -| --enable_operator_compare | 开启算子性能比对。 | 否 | -| --enable_communication_compare | 开启通信性能比对。 | 否 | -| --enable_memory_compare | 开启算子内存比对。 | 否 | +| 参数名 | 说明 | 是否必选 | +|--------------------------------|-----------|------| +| --enable_profiling_compare | 开启总体性能比对。 | 否 | +| --enable_operator_compare | 开启算子性能比对。 | 否 | +| --enable_communication_compare | 开启通信性能比对。 | 否 | +| --enable_memory_compare | 开启算子内存比对。 | 否 | 说明:以上4个开关均不设置的情况下,**工具默认开启所有的性能比对**,当用户设置了以上开关,则按照用户设置的开关进行性能比对,示例如下: + ```bash python performance_compare.py [基准性能数据文件] [比对性能数据文件] --output_path=./result_dir --enable_profiling_compare ``` @@ -105,17 +118,18 @@ python performance_compare.py [基准性能数据文件] [比对性能数据文 #### 算子性能比对特有参数说明 -| 参数名 | 说明 | 是否必选 | -| ----------------- | ------------------------------------------------------------ | -------- | -| --gpu_flow_cat | 配置GPU trace中cpu侧算子与device kernel的连线标识,当GPU的kernel均为空时设置。根据timeline的json文件在chrome://tracing上的Flow events的选项配置。使用示例:--gpu_flow_cat=async_gpu | 否 | -| --use_input_shape | 开启算子精准匹配,默认关闭。使用示例:--use_input_shape | 否 | -| --max_kernel_num | 设置CPU侧算子下发的最大kernel数量,当超过设定值时工具会自动往下找子算子,直至满足条件,默认仅比对最上层算子。使用示例:--max_kernel_num=10 | 否 | -| --op_name_map | 设置GPU与NPU等价的算子名称的映射关系,以字典形式存入。使用示例:--op_name_map='{"Optimizer.step#SGD.step":"Optimizer.step#NpuFusedSGD.step"}' | 否 | +| 参数名 | 说明 | 是否必选 | +|-------------------|--------------------------------------------------------------------------------------------------------------------------------------------|------| +| --gpu_flow_cat | 配置GPU trace中cpu侧算子与device kernel的连线标识,当GPU的kernel均为空时设置。根据timeline的json文件在chrome://tracing上的Flow events的选项配置。使用示例:--gpu_flow_cat=async_gpu | 否 | +| --use_input_shape | 开启算子精准匹配,默认关闭。使用示例:--use_input_shape | 否 | +| --max_kernel_num | 设置CPU侧算子下发的最大kernel数量,当超过设定值时工具会自动往下找子算子,直至满足条件,默认仅比对最上层算子。使用示例:--max_kernel_num=10 | 否 | +| --op_name_map | 设置GPU与NPU等价的算子名称的映射关系,以字典形式存入。使用示例:--op_name_map='{"Optimizer.step#SGD.step":"Optimizer.step#NpuFusedSGD.step"}' | 否 | ## 比对结果说明 + ### 总体性能 -总体性能比对结果以打屏的形式呈现。详细比对信息如下: +总体性能比对结果以打屏的形式呈现。 | 字段 | 说明 | | ------------------------------- | ------------------------------------------------------------ | @@ -148,48 +162,42 @@ activities配置仅采集NPU数据,不配置experimental_config参数以及其 ### 算子性能 -算子性能比对结果在performance_comparison_result_*.xlsl中OperatorCompare的sheet页呈现。 - -- 淡蓝色背景的记录行:算子的summary信息,包括算子名称、算子的Input Shape、算子的Input Type、算子在device上的总耗时(单位:us) - -- 无背景色的记录行:算子的detail信息,包含了这个算子下发到device侧的所有kernel的明细,包括kernel名称、kernel的信息(针对NPU)、device上的耗时(单位:us) - -- DIFF列 = (比较算子在device上执行总耗时 - 基准算子在device上执行总耗时) / 基准算子在device上执行总耗时 +算子性能比对结果在performance_comparison_result_*.xlsl中OperatorCompare和OperatorCompare(TOP)的sheet页呈现。 -- DIFF Filter列:红色代表劣化 +- OperatorCompare(TOP):算子为粒度的统计呈现,按照算子在device上的总耗时与基准算子的差距值(Diff Duration(ms)列)进行逆序 +- OperatorCompare:算子比对的明细展示,可以查看每一个算子对应的kernel详情 +Diff Ratio: 比较算子在device上执行总耗时 / 基准算子在device上执行总耗时,红色代表劣化。 #### Device Duration(us) + ``` 该算子下发到device上执行的所有kernel耗时的总和 ``` + ### 通信性能 通信性能比对结果在performance_comparison_result_*.xlsl中CommunicationCompare的sheet页呈现。 - 淡蓝色背景的记录行:通信算子的summary信息,包括通信算子名称、调用总次数、通信算子总耗时(单位:us)、通信算子平均耗时(单位:us)、通信算子最大耗时(单位:us)、通信算子最小耗时(单位:us) -- 无背景色的记录行:通信算子的detail信息,仅支持NPU,包含了该通信算子下的所有Task信息,包括Task名称、Task调用次数、Task总耗时(单位:us)、Task平均耗时(单位:us)、Task最大耗时(单位:us)、Task最小耗时(单位:us) - -- DIFF列 = (比较通信算子的总耗时 - 基准通信算子的总耗时) / 基准通信算子的总耗时 - -- DIFF Filter列:红色代表劣化 +- +无背景色的记录行:通信算子的detail信息,仅支持NPU,包含了该通信算子下的所有Task信息,包括Task名称、Task调用次数、Task总耗时(单位:us)、Task平均耗时(单位:us)、Task最大耗时(单位:us)、Task最小耗时(单位:us) +- Diff Ratio: 比较通信算子的总耗时 / 基准通信算子的总耗时,红色代表劣化。 ### 算子内存 -算子内存比对结果在performance_comparison_result_**.xlsl中MemoryCompare的sheet页呈现。 - -- 淡蓝色背景的记录行:算子的summary信息,包括算子名称、算子的Input Shape、算子的Input Type、算子占用的总内存(单位:KB) +算子内存比对结果在performance_comparison_result_**.xlsl中MemoryCompare和MemoryCompare(TOP)的sheet页呈现。 -- 无背景色的记录行:算子的detail信息,包含了这个算子下发到device侧执行的所有算子的内存占用,包括算子名称、内存持有时间(单位:us)、内存占用大小(单位:KB) +- MemoryCompare(TOP):算子为粒度的统计呈现,按照算子占用的总内存与基准算子的差距值(Diff Memory(MB))进行逆序 -- DIFF列 = (比较算子占用的总内存 - 基准算子占用的总内存) / 基准算子占用的总内存 +- MemoryCompare:算子内存比对的明细展示,可以查看每一个算子申请内存的详情 -- DIFF Filter列:红色代表劣化 +Diff Ratio: 比较算子占用的总内存 / 基准算子占用的总内存,红色代表劣化 +#### Size(KB) -#### 内存占用大小 ``` 该算子占用的device内存大小,单位KB ``` \ No newline at end of file diff --git a/profiler/distribute_tools/README.md b/profiler/distribute_tools/README.md index efc91d94cb200e25a6f6965608ba2c02ae0b6bbc..e8ae6f2a5c30b21b8613bd3470069a28ab536730 100644 --- a/profiler/distribute_tools/README.md +++ b/profiler/distribute_tools/README.md @@ -1,45 +1,37 @@ -# 功能介绍 -集群场景下,通过此工具来进行集群数据的拷贝,将多个机器上的profiling数据拷贝到同一台机器上 +# 集群场景脚本集合工具 +distribute_tools(集群场景脚本集合工具)是在集群场景下,通过此工具来进行集群数据的拷贝,将多个节点上的性能数据拷贝到同一个节点上。 -# 操作指导 -当前拷贝工具支持多台环境的数据拷贝到一台机器上,主要操作步骤如下: +## 操作指导 +当前拷贝工具支持多台环境的数据拷贝到同一节点上,主要操作步骤如下: ### 配置config.json文件 ```json { "cluster": { - "10.xxx.xxx.1": { - "user": "root", - "passwd": "xxx", - "dir": "/home/data/test" + "10.xxx.xxx.1": { // 待拷贝的节点IP + "user": "root", // 访问节点的用户名 + "passwd": "xxx", // 用户密码 + "dir": "/home/data/test" // 指定性能数据所在路径 }, "10.xxx.xxx.2": { "user": "root", "passwd": "xxx", "dir": "/home/data/test" + ... // 有多少个节点就要配置多少个IP } } } ``` -用来配置各个环境的ip地址以及用户名和密码,有多少台机器需要拷贝就配置多少个ip -dir表示profiling所在的路径 -### 调用 cluster_profiling_data_copy.sh 脚本 -```shell -bash cluster_profiling_data_copy.sh config_path target_dir -``` -#### 参数说明 -config_path:配置文件相对于 cluster_profiling_data_copy.sh 的路径,比如: ./config.json -target_dir: 要存储在本机上的路径 +### 调用cluster_profiling_data_copy.sh脚本 -#### 参数说明 -| 参数名 | 说明 | -| ---------------------- | --------------------------------------- | -| config_path | 配置文件相对于 cluster_profiling_data_copy.sh 的路径,比如: ./config.json | -| target_dir | 要存储在本机上的路径 | +```bash +bash cluster_profiling_data_copy.sh config_path target_dir +``` +- 请确保config.json文件配置正确的IP地址、用户名、性能数据路径信息并对配置的节点有适当的访问权限。 +- 请确保命令指定的目录下无同名文件,以免造成同名覆盖。 -``` -**Tips**: 注意config的配置 -- shell文件使用的是scp命令,确保在使用该命令时使用正确的用户名、主机名以及路径信息。 -- 确保你有适当的权限来访问远程服务器 -- 注意提供正确的路径和目标地址,以免意外覆盖和删除文件 +| 参数名 | 说明 | +| ----------- | ------------------------------------------------------------ | +| config_path | config.json配置文件相对于cluster_profiling_data_copy.sh的路径,例如:./config.json。 | +| target_dir | 拷贝后的性能数据存储在本节点上的路径。 | diff --git a/profiler/merge_profiling_timeline/README.md b/profiler/merge_profiling_timeline/README.md index 0a47f18810c5417822bd654efcde7fbce5b9a0c7..546e6c55a5e11eef82c75f5c4875ad55d28d9feb 100644 --- a/profiler/merge_profiling_timeline/README.md +++ b/profiler/merge_profiling_timeline/README.md @@ -1,15 +1,13 @@ -# Profiling merge timeline tool +# 合并大json工具 -## 简介 - -本工具支持合并Profiling的timeline数据,支持合并指定rank的timline、合并指定timeline中的item。 +merge_profiling_timeline(合并大json工具)支持合并Profiling的timeline数据,支持合并指定rank的timline、合并指定timeline中的item。 ## 多timeline融合 -### 数据采集 +### 性能数据采集 -使用msprof采集数据,将采集到的所有节点的Profiling数据拷贝到当前环境同一目录下,以下假设数据在/home/test/cann_profiling下。 +使用msprof采集性能数据,将采集到的所有节点的性能数据拷贝到当前环境同一目录下,以下假设数据在/home/test/cann_profiling下。 E2E Profiling数据目录结构示例如下: