深入排查的思路核心在于抓住优化的对象和重点。
首先,我们要能定界当前性能问题所出现的位置,如工具分析中提及的,可以分为计算、通信和下发(调度)三大板块。需要注意的是,这三大板块是相互交织的,要结合观察的性能问题现象和对应的实验来准确判断问题。本章节介绍深入排查的通用方法。首先获取性能数据,通过MindStudio Insight工具打开数据,以下操作以8卡的性能数据为例。
从图中可以看出,需要对比的种子选手4卡和5卡,每张卡从上至下(在标准L1模式的性能采集的情况下),可以分为Python(CPU)、CANN(CPU)、Ascend Hardware(NPU)、AI Core Freq、HCCL和Overlap Analysis几个栏目。其中我们将Python(CPU)、CANN(CPU)称为一级流水和二级流水(当然,在其内部,依然可以采用流水线并行的方法继续产生新的流水,这里以组件的维度简化描述),代表着模型PyTorch侧的操作和在CANN侧的操作,一般将这两级流水称为下发。在这里,介绍下host bound和device bound两个概念,如下图所示:
图中的连线是host侧api和device侧执行算子之间的连线,异构算力之间时钟差异可以忽略时(一般在100us量级,绝大多数场景均无需考虑)。当连线为竖直线时,代表此时api下发算子无需等待device,下发即计算,代表着device在空转等着host下发,性能的瓶颈在host,即host bound,反之,连线为斜线,代表为device bound。
发现两者差距在8ms,波动在10%以内,比较合理。继续水平向左,慢慢地,我们发现,两张卡的耗时差距越来越小,因此,对于这个案例,可以说问题出在这个算子耗时的差距(当然,这个可以从op statistics中也可以看到,这里只是教授如何寻找性能问题的方法)。如果发现Ascend Hardware上的差距来源于下发,即有张卡迟迟没有下发该算子,那则竖直向上,从CANN侧寻找问题,如此类推,通过竖直向上和水平向左,基本可以找到大部分问题点。