diff --git a/profiler/README.md b/profiler/README.md index e010c2c3cf81246795d620aedf82ac8475c6a481..e297e1e12814277225f569a752a8c40521b1f475 100644 --- a/profiler/README.md +++ b/profiler/README.md @@ -1,14 +1,14 @@ # 性能工具 -ATT工具针对训练&大模型场景,提供端到端调优工具:用户采集到性能数据后,由ATT工具提供统计、分析以及相关的调优建议。 +ATT工具针对训练&大模型场景,提供端到端性能调优工具:用户采集到性能数据后,由ATT性能工具提供统计、分析以及相关的调优建议。 -### NPU Profiling数据采集 +## NPU性能数据采集 -目前ATT工具主要支持Ascend PyTorch Profiler接口的性能数据采集,请参考官方文档:[Ascend PyTorch Profiler数据采集与分析](https://www.hiascend.com/document/detail/zh/canncommercial/70RC1/modeldevpt/ptmigr/AImpug_0067.html)。 +目前ATT工具主要支持Ascend PyTorch Profiler接口的性能数据采集,请参考官方文档:[Ascend PyTorch Profiler数据采集与分析](https://www.hiascend.com/document/detail/zh/canncommercial/80RC1/devaids/auxiliarydevtool/atlasprofiling_16_0006.html)。 -Ascend PyTorch Profiler接口支持AscendPyTorch 5.0.RC2或更高版本,支持的PyThon和CANN软件版本配套关系请参见《CANN软件安装指南》中的“[安装PyTorch](https://www.hiascend.com/document/detail/zh/canncommercial/63RC2/envdeployment/instg/instg_000041.html)”。 +Ascend PyTorch Profiler接口支持AscendPyTorch 5.0.RC2或更高版本,支持的PyThon和CANN软件版本配套关系请参见“[安装PyTorch框架](https://www.hiascend.com/document/detail/zh/Pytorch/60RC1/configandinstg/instg/insg_0006.html)”。 -#### 采集方式一:通过with语句进行采集 +### 采集方式一:通过with语句进行采集 ```python import torch_npu @@ -35,7 +35,7 @@ with torch_npu.profiler.profile( prof.step() ``` -#### 采集方式二:start,stop方式进行采集 +### 采集方式二:start,stop方式进行采集 ```python import torch_npu @@ -64,7 +64,7 @@ for epoch, data in enumerate(dataloader): prof.stop() ``` -#### NPU性能数据目录结构 +### NPU性能数据目录结构 ascend pytorch profiler数据目录结构如下: @@ -79,7 +79,97 @@ ascend pytorch profiler数据目录结构如下: |- * _ascend_pt ``` -### 子功能介绍 +## 工具安装 + +性能工具的安装方式包括:**下载whl包安装**和**源代码编译安装**。 + +#### 下载whl包安装 + +1. whl包获取。 + + 请通过下表链接下载profiler工具whl包。 + + | profiler版本 | 发布日期 | 下载链接 | 校验码 | + | ------------ | ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ | + | 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) | bcded626f639cea32ba814f88cbc563b48609d2c832a9f9b12c455c0626137ed | + + + +2. whl包校验。 + + 1. 根据以上下载链接下载whl包到Linux安装环境。 + + 2. 进入whl包所在目录,执行如下命令。 + + ``` + sha256sum {name}.whl + ``` + + {name}为whl包名称。 + + 若回显呈现对应版本whl包一致的**校验码**,则表示下载了正确的性能工具whl安装包。示例如下: + + ``` + sha256sum msprof_analyze-1.0-py3-none-any.whl + xx *msprof_analyze-1.0-py3-none-any.whl + ``` + +3. whl包安装。 + + 执行如下命令进行安装。 + + ``` + pip3 install ./msprof_analyze-{version}-py3-none-any.whl + ``` + + 若为覆盖安装,请在命令行末尾增加“--force-reinstall”参数强制安装,例如: + + ``` + pip3 install ./msprof_analyze-{version}-py3-none-any.whl --force-reinstall + ``` + + 提示如下信息则表示安装成功。 + + ``` + Successfully installed msprof_analyze-{version} + ``` + +#### 源代码编译安装 + +1. 安装依赖。 + + 编译前需要安装wheel。 + + ```bash + pip3 install wheel + ``` + +2. 下载源码。 + + ```bash + git clone https://gitee.com/ascend/att.git + ``` + +3. 编译whl包。 + + ```bash + cd att/profiler + python3 setup.py bdist_wheel + ``` + + 以上命令执行完成后在att/profiler/dist目录下生成性能工具whl安装包`msprof_analyze-{version}-py3-none-any.whl`。 + +4. 安装。 + + 执行如下命令进行性能工具安装。 + + ```bash + cd dist + pip3 install ./msprof_analyze-{version}-py3-none-any.whl --force-reinstall + ``` + +## 工具使用 + | 工具名称 | 说明 | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [compare_tools(性能比对工具)](https://gitee.com/ascend/att/tree/master/profiler/compare_tools) | 提供NPU与GPU性能拆解功能以及算子、通信、内存性能的比对功能。 | diff --git a/profiler/advisor/README.md b/profiler/advisor/README.md index 722243cdc263433431ead52ef67a7257f6dfeb22..1898c1d3775b58154ab3f7695075b7cafc634276 100644 --- a/profiler/advisor/README.md +++ b/profiler/advisor/README.md @@ -1,6 +1,6 @@ # 性能分析工具 -性能分析工具是将Ascend PyTorch Profiler采集的性能数据进行分析,并输出性能调优建议的工具 。使用方式如下: +性能分析工具是将Ascend PyTorch Profiler采集的性能数据进行分析,并输出性能调优建议的工具 。 下列以Windows环境下执行为例介绍。 @@ -14,7 +14,7 @@ 2. 在环境下安装ATT工具。 - ``` + ```bash git clone https://gitee.com/ascend/att.git ``` diff --git a/profiler/cluster_analyse/README.md b/profiler/cluster_analyse/README.md index f7646f67c40c53d1f82aecb4ae9dc0bfa810a77f..8983bd65fbaff66556d26b5eff1aa2d447704e2a 100644 --- a/profiler/cluster_analyse/README.md +++ b/profiler/cluster_analyse/README.md @@ -29,23 +29,57 @@ experimental_config = torch_npu.profiler._ExperimentalConfig( 确认这几个文件生成后,继续下面的集群分析。 -## 数据汇聚与集群解析 - -将所有卡的数据拷贝并汇集到一个目录下,在本目录下运行以下命令即可生成cluster_analysis_output文件夹。 - -```shell -python3 cluster_analysis.py -d {cluster profiling data path} -m {mode} -``` -### 参数说明 - -| 参数名 | 说明 | 是否必选 | -| ---------------------- | --------------------------------------- | --------------------------------------- | -| --collection_path或-d | 性能数据汇集目录,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据。 | 是 | -| --mode或-m | 数据解析模式。取值为:communication_matrix(解析通信矩阵数据)、communication_time(解析通信耗时数据)、all(同时解析通信矩阵和通信耗时数据),默认值为all。 | 否 | +## 数据汇聚与解析 + +### 操作步骤 + +1. 参见《[性能工具](../README.md)》完成工具安装。 + +2. 将所有卡的数据拷贝并汇集到一个目录下,在本目录下运行以下命令即可生成cluster_analysis_output文件夹。 + + ```bash + msprof-analyze cluster -d {cluster profiling data path} -m {mode} + ``` + + 或 + + ```bash + python3 cluster_analysis.py -d {cluster profiling data path} -m {mode} + ``` + + 参数说明: + + | 参数名 | 说明 | 是否必选 | + | --------------------- | ------------------------------------------------------------ | -------- | + | --collection_path或-d | 性能数据汇集目录,运行分析脚本之后会在该目录下自动创建cluster_analysis_output文件夹,保存分析数据。 | 是 | + | --mode或-m | 数据解析模式,取值详见“**--mode参数说明**”表。 | 否 | + | --parallel_mode | 设置收集多卡、多节点db数据时的并发方式。取值为concurrent(使用concurrent.feature进程池实现并发)。
**只有-m配置cann_api_sum时可配置此参数。** | 否 | + + --mode参数说明: + + | 参数名 | 说明 | 是否必选 | + | -------------------- | ------------------------------------------------------------ | -------- | + | communication_matrix | 解析通信矩阵数据。 | 否 | + | communication_time | 解析通信耗时数据。 | 否 | + | all | 同时解析通信矩阵communication_matrix和通信耗时数据communication_time,--mode参数默认值为all。 | 否 | + | cann_api_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 + ``` + ### 交付件 -集群分析工具的交付件通过Ascend Insight工具展示,详见《MindStudio 可视化调优工具指南(Ascend Insight)》。 +集群分析工具的交付件通过Ascend Insight工具展示,详见《[MindStudio Ascend Insight用户指南](https://www.hiascend.com/document/detail/zh/mindstudio/70RC1/GUI-baseddevelopmenttool/msascendinsightug/AscendInsight_0002.html)》。 #### cluster_step_trace_time.csv @@ -73,6 +107,8 @@ J列:Bubble时间,指receive时间的总和。 K列:Communication(Not Overlapped and Exclude Receive)指剔除recieve算子外的并且不被掩盖的通信时间。 +L列:Preparing,指迭代开始到首个计算或通信算子运行的时间。 + **Tips**:先筛选B列type为stage, 看stage间是否有问题,再筛选B列type为rank,看rank是否有问题,根据以下几点排查。 * 根据Computing的时间差异判断是否有慢卡,或者有负载不均衡的现象。 @@ -121,5 +157,27 @@ K列:Communication(Not Overlapped and Exclude Receive)指剔除recieve算 - CommunicationGroup:通信组信息。 - ClusterStepTraceTime:集群迭代轨迹数据。 +#### cann_api_stats + +--output_type=db时cluster_analysis_output目录下生成cann_api_stats.db文件,--output_type=notebook时cluster_analysis_output目录下生成cann_api_stats.ipynb文件。文件内容如下: + +| 字段 | 说明 | +| ---------- | -------------- | +| Name | API名称 | +| Time | 耗时占比 | +| Total Time | 总耗时 | +| Num Calls | AIP调用次数 | +| Avg | 平均耗时 | +| Q1 | Q1分位数 | +| Med | 中位数 | +| Q3 | Q3分位数 | +| Min | 最小耗时 | +| Max | 最大耗时 | +| StdDcv | 标准差 | +| Min Rank | 耗时最小的Rank | +| Max Rank | 耗时最大的Rank | + + + diff --git a/profiler/compare_tools/README.md b/profiler/compare_tools/README.md index 0283be8f27ea6bb726d2cb7b343229813abf7989..16eaeaccd7f8fc6fd01271ec6ad88d4443482770 100644 --- a/profiler/compare_tools/README.md +++ b/profiler/compare_tools/README.md @@ -12,7 +12,7 @@ compare_tools(性能比对工具)支持比较GPU与NPU之间、NPU与NPU之 ### 环境依赖 -使用本工具前需要安装的依赖包:prettytable、xlsxwriter、pandas、numpy +使用本工具前需要安装的依赖包: ```bash pip3 install prettytable @@ -84,21 +84,39 @@ ascend pytorch profiler数据目录结构如下: ### 性能数据比对 -将att代码仓下载到本地,执行以下命令: +性能比对工具将总体性能拆解为训练耗时和内存占用,其中训练耗时可拆分为算子(包括算子和nn.Module)、通信、调度三个维度,以打屏的形式输出总体指标,帮助用户定界劣化的方向。与此同时,工具还会生成performance_comparison_result_*.xlsx,展示每个算子在执行耗时、通信耗时、内存占用的优劣,可通过DIFF列大于0筛选出劣化算子。详细介绍请参见“**比对结果说明**”。 + +性能比对工具支持使用**命令行**和**脚本**两种方式执行性能数据比对操作,这两种方式均支持**通用参数**和**算子性能比对特有参数**。 + +#### 命令行方式 + +1. 参见《[性能工具](../README.md)》完成工具安装。 + +2. 执行如下命令进行性能数据比对: + + ``` + msprof-analyze compare -d [比对性能数据文件所在路径] -bp [基准性能数据文件所在路径] --output_path=[比对结果文件存放路径] + ``` + + - -d(必选):比对性能数据文件所在路径。可以指定以“ascend_pt”结尾的目录、ASCEND_PROFILER_OUTPUT目录或trace_view.json文件,指定trace_view.json无法显示算子的内存占用。 + - -bp(必选):基准性能数据文件所在路径。基准性能数据文件若以GPU为基准,指定到以".pt.trace"结尾的json文件;若以NPU不同版本为基准,指定文件与-d一致。 + - --output_path(可选):性能比对结果存放的路径,默认保存在当前目录。 + +#### 脚本方式 + +将att代码仓下载到本地,执行如下命令: ```bash # 进入att代码仓目录下的compare_tools目录 cd att/profiler/compare_tools # 执行最简比对命令 -python performance_compare.py [基准性能数据文件] [比对性能数据文件] --output_path=./result_dir +python performance_compare.py [基准性能数据文件所在路径] [比对性能数据文件所在路径] --output_path=[比对结果文件存放路径] ``` -- 基准性能数据文件(必选):若以GPU为基准,指定到以".pt.trace"结尾的json文件;若以NPU不同版本为基准,指定文件参考**比对性能数据文件**。 -- 比对性能数据文件(必选):可以指定以“ascend_pt”结尾的目录、ASCEND_PROFILER_OUTPUT目录或trace_view.json文件,指定trace_view.json无法显示算子的内存占用。 +- 基准性能数据文件所在路径(必选):若以GPU为基准,指定到以".pt.trace"结尾的json文件;若以NPU不同版本为基准,指定文件参考**比对性能数据文件所在路径**。 +- 比对性能数据文件所在路径(必选):可以指定以“ascend_pt”结尾的目录、ASCEND_PROFILER_OUTPUT目录或trace_view.json文件,指定trace_view.json无法显示算子的内存占用。 - --output_path(可选):性能比对结果存放的路径,默认保存在当前目录。 -工具将总体性能拆解为训练耗时和内存占用,其中训练耗时可拆分为算子(包括算子和nn.Module)、通信、调度三个维度,以打屏的形式输出总体指标,帮助用户定界劣化的方向。与此同时,工具还会生成performance_comparison_result_*.xlsx,展示每个算子在执行耗时、通信耗时、内存占用的优劣,可通过DIFF列大于0筛选出劣化算子。详细介绍请参见“**比对结果说明**”。 - #### 通用参数说明 | 参数名 | 说明 | 是否必选 | @@ -110,6 +128,12 @@ python performance_compare.py [基准性能数据文件] [比对性能数据文 说明:以上4个开关均不设置的情况下,**工具默认开启所有的性能比对**,当用户设置了以上开关,则按照用户设置的开关进行性能比对,示例如下: +```bash +msprof-analyze compare -d [比对性能数据文件所在路径] -bp [基准性能数据文件所在路径] --output_path=./result_dir --enable_profiling_compare +``` + +或 + ```bash python performance_compare.py [基准性能数据文件] [比对性能数据文件] --output_path=./result_dir --enable_profiling_compare ``` @@ -135,9 +159,10 @@ python performance_compare.py [基准性能数据文件] [比对性能数据文 | --------------------------------------- | ------------------------------------------------------------ | | Cube Time(Num) | Cube算子总耗时,Num表示计算的次数。 | | Vector Time(Num) | Vector算子总耗时,Num表示计算的次数。 | -| Other Time | AI CPU、DSA等其他非cube vector算子耗时。 | -| Flash Attention Time(Forward) | Flash Attention算子前向耗时。 | -| Flash Attention Time(Backward) | Flash Attention算子反向耗时。 | +| Corv Time(Forward)(Num) | conv前向算子耗时,Num表示计算的次数。 | +| Corv Time(Backward)(Num) | conv反向算子耗时,Num表示计算的次数。 | +| Flash Attention Time(Forward)(Num) | Flash Attention算子前向耗时。 | +| Flash Attention Time(Backward)(Num) | Flash Attention算子反向耗时。 | | Computing Time | 计算流耗时,计算流所有event耗时总和。如果有多条并发计算,计算流耗时对重叠部分只会计算一次。 | | Mem Usage | 内存使用。GPU上的内存使用可以使用nvidia-smi查看,NPU上的内存使用可以使用npu-smi查看,Profiling信息采集时打开profile_memory=True开关,mem usage显示的是memory_record里面的最大resevered值,一般来说是进程级内存。 | | Uncovered Communication Time(Wait Time) | 通信未掩盖耗时,包含Wait Time(只有采集性能数据的Level等级为L1以上并且采集NPU数据时才会存在)为同步时间。 | @@ -167,6 +192,8 @@ activities配置仅采集NPU数据,不配置experimental_config参数以及其 ### 算子性能 +#### 比对数据无Python Function + 算子性能比对结果在performance_comparison_result_*.xlsx中OperatorCompare和OperatorCompareStatistic的sheet页呈现。 - OperatorCompareStatistic:算子为粒度的统计呈现,按照算子在device上的总耗时与基准算子的差距值(Diff Duration(ms)列)进行逆序。 @@ -177,14 +204,12 @@ activities配置仅采集NPU数据,不配置experimental_config参数以及其 步骤1:查看OperatorCompareStatistic页,找出耗时差距TOP的算子。 步骤2:查看OperatorCompare页,搜索耗时差距TOP的算子,查看具体执行的kernel耗时,寻找可优化点。 -### nn.Module性能 +#### 比对数据有Python Function -nn.Module是所有神经网络模块的基类,使用PyTorch构建神经网络需要继承nn.Module类来实现,性能比对工具支持模块级的比对(包含优化器和nn.Module),帮助优化模型结构。 +算子性能比对结果在performance_comparison_result_*.xlsx中ModuleCompareStatistic、ModuleCompare的sheet页呈现。 当用户采集时开启with_stack开关,会上报python function事件,当比对的双方数据都存在python function的事件时,可进行模块级别的比对。 -nn.Module性能比对结果在performance_comparison_result_*.xlsx中ModuleCompareStatistic的sheet页呈现。 - - Module Class:Module名,如nn.Module: Linear。 - Module Level:Module的层级。 - Module Name:Module唯一标识名,如/ DynamicNet_0/ Linear_0。 @@ -199,6 +224,31 @@ nn.Module性能比对结果在performance_comparison_result_*.xlsx中ModuleCompa - Base Call Stack:基准文件模块的调用栈。 - Comparison Call Stack:比较文件模块的调用栈。 +ModuleCompare:模块及模块下算子比对的明细展示,可以查看每一个算子对应的kernel详情。 + +- Module Class:Module名,如nn.Module: Linear。 +- Module Level:Module的层级。 +- Module Name:Module唯一标识名,如/ DynamicNet_0/ Linear_0。 +- Operator Name:框架侧算子名,如aten::add。字段为[ TOTAL ]代表该module的总体情况。 +- Kernel Detail:算子详细信息。 +- Device Self Time(us):该模块调用的算子(排除子模块)在device侧执行的总耗时,单位us。 +- Device Total Time(us):该模块调用的算子(包含子模块)在device侧执行的总耗时,单位us。 +- Device Total Time Diff(us):GPU与NPU的Device Total Time(us)差值。 +- Device Self Time Diff(us):GPU与NPU的Device Self Time(us)差值。 +- Total Time Ratio:GPU与NPU的Device Total Time(us)比值。 +- Base Call Stack:有劣化的模块或算子,基准文件模块的调用栈。 +- Comparison Call Stack:有劣化的模块或算子,比较文件模块的调用栈。 + +步骤1:查看ModuleCompareStatistic页,找出耗时差距TOP的模块。 + +​ 筛选Operator Name字段为[ TOTAL ],将模块总体情况按照Device Self Time(ms)字段逆序,可识别出耗时差距TOP的模块。 + +​ 恢复数据,可按照Order Id字段升序。 + +步骤2:查看ModuleCompare页,查找耗时差距TOP模块下的劣化算子。 + +步骤3:通过调用栈找到对应的代码行。 + ### 通信性能 通信性能比对结果在performance_comparison_result_*.xlsx中CommunicationCompare的sheet页呈现。