diff --git a/docs/mindspore/source_zh_cn/model_train/optimize/images/profiler_process.png b/docs/mindspore/source_zh_cn/model_train/optimize/images/profiler_process.png new file mode 100644 index 0000000000000000000000000000000000000000..479480c298970c29d65702ccbd1f7fd19bfd3ce6 Binary files /dev/null and b/docs/mindspore/source_zh_cn/model_train/optimize/images/profiler_process.png differ diff --git a/docs/mindspore/source_zh_cn/model_train/optimize/profiler.md b/docs/mindspore/source_zh_cn/model_train/optimize/profiler.md index 3e80d82133518f5ec6978d1feceb79c87277afdc..e5f63c7219be5c82c2de09e8fef78c010e0ac8db 100644 --- a/docs/mindspore/source_zh_cn/model_train/optimize/profiler.md +++ b/docs/mindspore/source_zh_cn/model_train/optimize/profiler.md @@ -29,7 +29,6 @@ **Graph**模式下,用户可以通过Callback方式来使能Profiler。 ```python -import os import mindspore as ms from mindspore import Profiler @@ -324,6 +323,50 @@ MindSpore Profiler接口将框架侧的数据与CANN Profling的数据关联整 其他性能数据文件的具体字段与含义可以参考[昇腾官网文档](https://www.hiascend.com/document/detail/zh/mindstudio/70RC3/T&ITools/Profiling/atlasprofiling_16_0035.html)。 +## 性能调优案例 +### 一、概述 +在大模型训练过程中,由于一些不可预知的引入,导致模型出现了一些性能劣化的问题,例如算子计算时间慢、通信快慢卡等。需要定位性能劣化的根本原因,并解决问题。 + +![profiler_process.png](images%2Fprofiler_process.png) + +性能调优最重要的就是对症下药,先定界问题,再对问题进行针对性调优。 +首先使用[MindStudio Insight](https://www.mindspore.cn/mindinsight/docs/zh-CN/master/index.html)可视化工具定界性能问题,定界结果通常分为计算、调度、通信三个方向的问题。最后,用户可以根据MindStudio Insight专家建议进行性能调优, +每次调优后重跑训练,采集性能数据,并使用MindStudio Insight工具查看调优手段是否产生效果。重复这个过程,直到解决性能问题。 +### 二、性能调优 +MindStudio Insight提供了丰富的调优分析手段,可视化呈现真实软硬件运行数据,多维度分析性能数位,定位性能瓶颈点,支持百卡、千卡及以上规模的可视化集群性能分析。用户在MindStudio Insight中导入上一步采集的性能数据,根据下述流程使用可视化能力分析性能数据。 +### 1. 概览界面总览数据情况 +可以通过概览界面了解每个模块的具体内容。 +- 首先,在MindStudio Insight界面中选择'导入数据'按钮,导入采集的profiler数据,以下导入为多卡的性能数据。同时可以在时间线界面看出导入了8卡数据,如下图。 +- 接下来,可以在概览界面展示所选通信域下每张卡的计算、通信、空闲时间占比情况,并提供专家建议。 +各图例相关数据指标的含义如下: + +| 图例 | 含义 | +|--------------|---------| +| 总计算时间 | 昇腾设备上的内核时间总和 | +| 纯计算时间 | 纯计算时间 = 总计算时间 – 通信时间(被覆盖) | +| 通信时间(被覆盖) | 被覆盖的通信时长,即计算和通信同时进行的时长 | +| 通信时间(未被覆盖) | 未被覆盖的通信时长,即纯通信时长 | +| 空闲时间 | 未进行计算或通信的时长 | + +### 2. 定界问题 +不同的指标现象可以定界不同的性能问题: +- (1)计算问题:通常表现为通信域中总计算时间占比的极大值和极小值差异过大。如果某些计算卡的计算时间明显超出了正常范围,那很可能意味着这张卡承担了过于繁重的计算任务,比如要处理的数据量过大,或者模型计算的复杂程度过高,也有可能是卡本身的性能受到了限制。 +- (2)调度问题:通常表现为通信域中空闲时间占比的极大值和极小值差异过大。如果计算卡的空闲时间过长,那就说明任务分配可能不太均衡,或者是存在卡之间互相等待数据的情况,这同样会对集群的性能造成不利影响。 +- (3)通信问题:如果通信时间(未被覆盖)过长,那就表明计算和通信之间的协同出现了问题,可能对应多种情况。也许是通信协议不够优化,又或者是网络带宽不稳定,导致通信无法和计算良好配合。 +#### 2.1 计算问题 +当数据指标现象指示为计算问题时,可以直接查看异常卡的算子数据,并与正常卡进行比较。此时可以使用MindStudio Insight的卡间性能比对功能,设置两卡进入比对模式,并在算子界面查看结果。其中饼状图展示了各类算子的耗时占比,表格展示了各类算子的详细信息。 +#### 2.2 调度问题 +当数据指标现象指示为调度问题时,需要到时间线界面将异常卡和正常卡进行比较,进一步定位出现问题的算子。进入时间线界面,选择HostToDevice连线类型,HostToDevice展示了CANN层算子到AscendHardware的算子的下发执行关系和CANN层算子到HCCL通信算子的下发执行关系,用于定位调度问题。 +HostToDevice的连线通常有两种形态,倾斜和竖直。下图是一个存在调度问题的案例,如果HostToDevice连线如左侧所示,是倾斜的,说明此时间段调度任务安排合理,昇腾设备是满负荷执行计算和通信任务的。如果HostToDevice连线如右侧所示,是竖直的,说明昇腾设备此时快速执行完了CPU下发的任务,未满负荷进行计算和通信任务,这一般表示存在调度问题。 +#### 2.3 通信问题 +当数据指标现象指示为通信问题时,需要进入通信界面进一步分析。通信界面用于展示集群中全网链路性能以及所有节点的通信性能,通过集群通信与计算重叠时间的分析可以找出集群训练中的慢主机或慢节点。通常,我们会根据关键指标通信矩阵、通信时长来分析性能问题。 +- 通信矩阵 +上图是MindStudio Insight通信矩阵可视化界面,可以获取各个通信域下,卡间的带宽、传输大小、链路方式和传输时长情况等信息。 +分析时可以先查看传输大小,分析在这个集合通信中,每张卡的传输量是否存在差异,是否有分配不均的情况。其次,再查看传输时长,如果某张卡的传输时长非常短,那它极有可能是在处理其他事情,导致下游卡长时间等待。最后可以查看带宽情况,如果不同卡间的带宽数据差异过大或带宽数值异常,那都意味着通信域中存在异常卡。 + +- 通信时长 +通信时长是指计算卡之间进行一次通信所花费的时间。导致通信耗时过长的因素很多,比如通信协议配置错误、传输数据量过大等等,只有找到这些通信耗时过长的链路并妥善解决问题,才能让数据在计算卡之间更加顺畅地传输,进而提高集群的整体性能。 +用户选择具体通信域后,即可在通信时长界面中查看通信域中各个计算卡的耗时汇总情况,以及每个通信算子的时序图和通信时长的分布图,从而快速获得通信算子的相对位置关系以及详细通信数据。 ## 常见工具问题及解决办法 ### 使用step采集性能数据常见问题 diff --git a/docs/sample_code/profiler/dynamic_profiler.py b/docs/sample_code/profiler/dynamic_profiler.py index ee70a1c5fe329aaece2283b1cfe00cd128eb93a5..18d7363bead269f480b53377d2a8c1bae41a0a90 100644 --- a/docs/sample_code/profiler/dynamic_profiler.py +++ b/docs/sample_code/profiler/dynamic_profiler.py @@ -61,13 +61,13 @@ if __name__ == '__main__': cfg_json = { "start_step": 2, "stop_step": 5, - "aicore_metrics": 1, - "profiler_level": -1, - "profile_framework": 1, - "analyse_mode": 0, - "with_stack": True, - "parallel_strategy": True, - "data_simplification": False, + "aicore_metrics": -1, + "profiler_level": 0, + "activities": 0, + "analyse_mode": -1, + "with_stack": False, + "parallel_strategy": False, + "data_simplification": True, } context.set_context(mode=mindspore.PYNATIVE_MODE) mindspore.set_device("Ascend")