diff --git a/profiler/compare_tools/README.md b/profiler/compare_tools/README.md
index e307491f36686687d7a842f990193f58cff955ac..0749c78507f686626b816e54a88ddb961764de12 100644
--- a/profiler/compare_tools/README.md
+++ b/profiler/compare_tools/README.md
@@ -1,25 +1,25 @@
# 性能比对工具
-## 1.简介
-性能比对工具支持比较GPU与NPU之间、NPU与NPU之间的性能差异,通过对训练耗时和内存占用的比对分析,定位到具体劣化的算子,帮助用户提升性能调优的效率。工具将训练耗时拆分为算子、通信、调度3大维度,并针对算子和通信分别进行算子级别的比对;将训练占用的总内存,拆分成算子级别的内存占用进行比对。
+## 简介
+性能比对工具支持比较GPU与NPU之间、NPU与NPU之间的性能差异,通过对训练耗时和内存占用的比对分析,定位到具体劣化的算子,帮助用户提升性能调优的效率。工具将训练耗时拆分为算子、通信、调度三大维度,并针对算子和通信分别进行算子级别的比对;将训练占用的总内存,拆分成算子级别的内存占用进行比对。
-## 2.使用场景
-场景一:PyTorch训练工程从GPU迁移至NPU后出现性能劣化,通过工具分析出劣化点
+## 使用场景
+场景一:PyTorch训练工程从GPU迁移至NPU后出现性能劣化,通过工具分析出劣化点。
-场景二:PyTorch训练工程在NPU上,不同版本之间存在性能差距,通过工具定位具体差异
+场景二:PyTorch训练工程在NPU上,不同版本之间存在性能差距,通过工具定位具体差异。
-## 3.使用指导
-### 性能数据采集
+## 使用指导
+### 性能数据采集
+
#### GPU性能数据采集
-通过PyTorch Profiler工具采集GPU的性能数据,参考链接:
-https://pytorch.org/docs/stable/profiler.html
+通过PyTorch Profiler工具采集GPU的性能数据,参考链接:https://pytorch.org/docs/stable/profiler.html
采集样例代码参考1:
-```
+```Python
with torch.profiler.profile(
- profile_memory=True, #内存数据采集的开关
- record_shapes=True, #算子input shape信息采集的开关
+ 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:
@@ -28,10 +28,10 @@ with torch.profiler.profile(
prof.step()
```
采集样例代码参考2:
-```
+```Python
prof = torch.profiler.profile(
- profile_memory=True, #内存数据采集的开关
- record_shapes=True, #算子input shape信息采集的开关
+ 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:
@@ -43,69 +43,71 @@ for step in range(step_number):
pytorch profiler数据目录结构如下:
-```
+```Python
|- pytorch_profiling
- |- **.pt.trace.json
+ |- *.pt.trace.json
```
#### NPU性能数据采集
-通过Ascend PyTorch Profiler工具采集NPU的性能数据,采集参数配置跟GPU一致,参考链接:
-https://www.hiascend.com/document/detail/zh/canncommercial/63RC2/modeldevpt/ptmigr/ptmigr_0066.html
+通过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_***
- |- **_ascend_pt
-```
-
-### 性能数据比对
-#### 最简执行命令
-进入att代码仓的下载目录,cd att/profiler/compare_tools,执行以下命令:
-```
-python performance_compare.py [基准性能数据的文件路径] [比较性能数据的文件路径]
+ |- PROF_XXX
+ |- *_ascend_pt
```
-工具将总体性能拆解为训练耗时和内存占用2个方面,其中训练耗时可拆分为算子、通信、调度3个维度,以打屏的形式输出总体指标,帮助用户定界劣化的方向。与此同时,工具还会生成performance_comparison_result_**.xlsl,里面具体到每个算子在执行耗时、通信耗时、内存占用的优劣,可通过DIFF列大于0筛选出劣化算子。
-#### 文件路径说明
-GPU的性能数据文件路径:指定到以".pt.trace"结尾的json文件
+### 性能数据比对
-NPU的性能数据文件路径: 支持多种路径,①以"_ascend_pt"结尾的目录;②ASCEND_PROFILER_OUTPUT目录;③trace_view.json,该路径无法显示算子的内存占用
+将att代码仓下载到本地,执行以下命令:
-#### 通用参数说明
+```bash
+# 进入进入att代码仓目录下的compare_tools目录
+cd att/profiler/compare_tools
+# 执行最简比对命令
+python performance_compare.py [基准性能数据文件] [比对性能数据文件] --output_path=./result_dir
```
---enable_profiling_compare:开启总体性能比较。使用示例:--enable_profiling_compare
+- 基准性能数据文件:若以GPU为基准,指定到以".pt.trace"结尾的json文件;若以NPU不同版本为基准,指定文件参考**比对性能数据文件**。
+- 比对性能数据文件:可以指定以“ascend_pt”结尾的目录、ASCEND_PROFILER_OUTPUT目录或trace_view.json文件,指定trace_view.json无法显示算子的内存占用。
+- --output_path:性能比对结果存放的路径,默认保存在当前目录。
---enable_operator_compare:开启算子性能比较。使用示例:--enable_operator_compare
+工具将总体性能拆解为训练耗时和内存占用,其中训练耗时可拆分为算子、通信、调度三个维度,以打屏的形式输出总体指标,帮助用户定界劣化的方向。与此同时,工具还会生成performance_comparison_result_*.xlsl,展示每个算子在执行耗时、通信耗时、内存占用的优劣,可通过DIFF列大于0筛选出劣化算子。详细介绍请参见“**比对结果说明**”。
---enable_communication_compare:开启通信性能比较。使用示例:--enable_communication_compare
+#### 通用参数说明
---enable_memory_compare:开启算子内存比较。使用示例:--enable_memory_compare
-```
-说明:以上4个开关均不设置的情况下,工具默认开启所有的性能比较,当用户设置了以上开关,则按照用户设置的开关进行性能比对
-```
---output_path:性能比对结果存放的路径。使用示例:--output_path=./result_dir
-```
+| 参数名 | 说明 | 是否必选 |
+| ------------------------------ | ------------------ | -------- |
+| --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
```
---gpu_flow_cat:配置GPU trace中cpu侧算子与device kernel的连线标识,当GPU的kernel均为空时设置。使用示例:--gpu_flow_cat=async_gpu
---use_input_shape:开启算子精准匹配。使用示例:--use_input_shape
+此时表示仅开启总体性能比对。
+
+#### 算子性能比对特有参数说明
---max_kernel_num:设置cpu侧算子下发的最大kernel数量,当超过设定值时工具会自动往下找子算子,直至满足条件。使用示例:--max_kernel_num=10
+| 参数名 | 说明 | 是否必选 |
+| ----------------- | ------------------------------------------------------------ | -------- |
+| --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"}' | 否 |
---op_name_map:设置GPU与NPU等价的算子名称的映射关系,以字典形式存入。使用示例:--op_name_map='{"Optimizer.step#SGD.step":"Optimizer.step#NpuFusedSGD.step"}'
-```
+## 比对结果说明
+### 总体性能
-## 4.比对结果说明
-### 总体性能
总体性能比对结果以打屏的形式呈现。
#### 算子耗时
```
@@ -139,42 +141,48 @@ profiling信息采集时打开profile_memory=True开关,即可从json文件中
```
计算流端到端耗时
```
-### 算子性能
-算子性能比对结果在performance_comparison_result_**.xlsl中OperatorCompare的sheet页呈现。
+### 算子性能
+
+算子性能比对结果在performance_comparison_result_*.xlsl中OperatorCompare的sheet页呈现。
-淡蓝色背景的记录行:算子的summary信息,包括算子名称、算子的Input Shape、算子的Input Type、算子在device上的总耗时(单位:us)
+- 淡蓝色背景的记录行:算子的summary信息,包括算子名称、算子的Input Shape、算子的Input Type、算子在device上的总耗时(单位:us)
-无背景色的记录行:算子的detail信息,包含了这个算子下发到device侧的所有kernel的明细,包括kernel名称、kernel的信息(针对NPU)、device上的耗时(单位:us)
+- 无背景色的记录行:算子的detail信息,包含了这个算子下发到device侧的所有kernel的明细,包括kernel名称、kernel的信息(针对NPU)、device上的耗时(单位:us)
-DIFF列 = (比较算子在device上执行总耗时 - 基准算子在device上执行总耗时) / 基准算子在device上执行总耗时
+- DIFF列 = (比较算子在device上执行总耗时 - 基准算子在device上执行总耗时) / 基准算子在device上执行总耗时
+
+- DIFF Filter列:红色代表劣化
-DIFF Filter列:红色代表劣化
#### Device Duration(us)
```
该算子下发到device上执行的所有kernel耗时的总和
```
-### 通信性能
-通信性能比对结果在performance_comparison_result_**.xlsl中CommunicationCompare的sheet页呈现。
+### 通信性能
+
+通信性能比对结果在performance_comparison_result_*.xlsl中CommunicationCompare的sheet页呈现。
+
+- 淡蓝色背景的记录行:通信算子的summary信息,包括通信算子名称、调用总次数、通信算子总耗时(单位:us)、通信算子平均耗时(单位:us)、通信算子最大耗时(单位:us)、通信算子最小耗时(单位:us)
-淡蓝色背景的记录行:通信算子的summary信息,包括通信算子名称、调用总次数、通信算子总耗时(单位:us)、通信算子平均耗时(单位:us)、通信算子最大耗时(单位:us)、通信算子最小耗时(单位:us)
+- 无背景色的记录行:通信算子的detail信息,仅支持NPU,包含了该通信算子下的所有Task信息,包括Task名称、Task调用次数、Task总耗时(单位:us)、Task平均耗时(单位:us)、Task最大耗时(单位:us)、Task最小耗时(单位:us)
-无背景色的记录行:通信算子的detail信息,仅支持NPU,包含了该通信算子下的所有Task信息,包括Task名称、Task调用次数、Task总耗时(单位:us)、Task平均耗时(单位:us)、Task最大耗时(单位:us)、Task最小耗时(单位:us)
+- DIFF列 = (比较通信算子的总耗时 - 基准通信算子的总耗时) / 基准通信算子的总耗时
-DIFF列 = (比较通信算子的总耗时 - 基准通信算子的总耗时) / 基准通信算子的总耗时
+- DIFF Filter列:红色代表劣化
-DIFF Filter列:红色代表劣化
-### 算子内存
+### 算子内存
+
算子内存比对结果在performance_comparison_result_**.xlsl中MemoryCompare的sheet页呈现。
-淡蓝色背景的记录行:算子的summary信息,包括算子名称、算子的Input Shape、算子的Input Type、算子占用的总内存(单位:KB)
+- 淡蓝色背景的记录行:算子的summary信息,包括算子名称、算子的Input Shape、算子的Input Type、算子占用的总内存(单位:KB)
+
+- 无背景色的记录行:算子的detail信息,包含了这个算子下发到device侧执行的所有算子的内存占用,包括算子名称、内存持有时间(单位:us)、内存占用大小(单位:KB)
-无背景色的记录行:算子的detail信息,包含了这个算子下发到device侧执行的所有算子的内存占用,包括算子名称、内存持有时间(单位:us)、内存占用大小(单位:KB)
+- DIFF列 = (比较算子占用的总内存 - 基准算子占用的总内存) / 基准算子占用的总内存
-DIFF列 = (比较算子占用的总内存 - 基准算子占用的总内存) / 基准算子占用的总内存
+- DIFF Filter列:红色代表劣化
-DIFF Filter列:红色代表劣化
#### 内存占用大小
```