零、性能指标
昇腾模型性能调试中的基本性能指标,包括吞吐率、线性度和算力利用率等。
在计算性能指标中,优先级排序为:吞吐率 > 单步迭代时间 > 线性度 > 内存占用 > 带宽占比 > 训练效率 > 浮点计算次数每秒 > 算力利用率[1]。下面介绍几种常见的性能指标。
0.1 吞吐率
吞吐率是衡量模型处理数据能力的一个重要指标,通常以每秒处理的数据量来表示,单位可以是samples/s或tokens/s。吞吐率的高低直接影响模型的处理效率,吞吐率越高,模型的处理能力越强。[4]
例如,在图像处理任务中,吞吐率表示每秒可以处理的图像数量;在自然语言处理任务中,吞吐率表示每秒可以处理的文本词数。
0.2 线性度
线性度是指模型在多处理单元(如多GPU或NPU)并行运行时,其性能提升与处理单元数量成线性关系的程度。理想情况下,增加一个处理单元,模型的性能(如吞吐率)也会线性提升。但实际上,由于各种因素(如通信开销、负载不均衡等),线性度往往达不到100%。线性度的取值范围为0~1,数值越接近于1,其性能指标越好。
0.3 算力利用率
算力利用率是指模型在运行过程中,实际使用的计算资源占总可用计算资源的比例。这个指标反映了模型对计算资源的使用效率。算力利用率越高,说明模型对计算资源的利用越充分,性能通常也越好。[3]
算力利用率可以衡量芯片算力的发挥程度,也可以衡量对负载和芯片的亲和优化。对于昇腾或GPU等重算力芯片,我们希望尽量多的算力都在CUBE/TensorCore上,如果vector算力成为瓶颈,较少的算力花了较多的时间,此时step_time增加,算力利用率降低。所以,算力利用率可以反映实际的算力发挥情况,牵引软硬件栈的优化。同时,算力利用率和吞吐成正比关系,可以纵向反映性能问题。
0.4 通信性能指标
为了识别一些可能存在的通信算子内部瓶颈单元,需要针对同一通信算子在不同卡之间通信时间的波动进行分析。在分析过程中,主要采用以下几个指标[5]:
算子的执行时间以及内部等待耗时的变化和比例,该指标可以用来初步识别是否存在慢卡瓶颈。
通信带宽分析:DMA(Direct Memory Access)指的是直接存储访问。当CPU完成传输配置后,将不再参与传输过程,由DMA控制器将数据从一个地址空间复制到另外一个地址空间。
0.5 Pipeline并行效率指标
流水线(Pipeline)并行是将神经网络中的算子切分成多个阶段(Stage),再把阶段映射到不同的设备上,使得不同设备去计算神经网络的不同部分。但是简单地将模型切分到多设备上并不会带来性能的提升,因为模型的线性结构使得同一时刻只有一台设备在工作,而其他设备在等待,造成了资源的浪费。为了提升效率,流水线并行进一步将小批次(MiniBatch)切分成更细粒度的微批次(MicroBatch),在微批次中采用流水线式的执行序,从而达到提升效率的目的。Pipeline并行效率指标就是来衡量这种流水线式的计算效率。
一、性能调优总体思路
PyTorch在昇腾AI处理器的加速实现方式是以算子为粒度进行调用(OP-based),即通过Python与C++调用CANN层接口Ascend Computing Language(AscendCL)调用一个或几个亲和算子组合的形式,代替原有GPU的实现方式,具体逻辑模型请参考PyTorch自动迁移。
在PyTorch模型迁移后进行训练的过程中,CPU只负责算子的下发,而NPU负责算子的执行,算子下发和执行异步发生,性能瓶颈在此过程中体现。在PyTorch的动态图机制下,算子被CPU逐个下发到NPU上执行。一方面,理想情况下CPU侧算子下发会明显比NPU侧算子执行更快,此时性能瓶颈主要集中在NPU侧;另一方面,理想情况下NPU侧算子计算流水线一直执行,不会出现NPU等待CPU算子下发即NPU空转的场景,如果存在,则CPU侧算子下发存在瓶颈。
图1 Host算子下发和Device算子执行
综上所述,性能优化的总体原则为:·
减少Host算子下发时间、减少Device算子执行时间
。
训练代码迁移完成后,如存在性能不达标的问题,可参考下图所示流程进行优化。建议按照单卡、单机多卡、多机多卡的流程逐步做性能调优。
图2 性能调优总体思路
为了便于快速进行迁移调优,降低调优门槛,ModelArts提供了MA-Adivisor性能自动诊断工具。用户采集性能profiling数据后,可通过该工具自动扫描profiling数据,工具分析完数据后会给出可能的性能问题点及调优建议,用户可以根据调优建议做相应的修改适配。目前该工具对CV类模型给出的调优建议较多,LLM类建议稍少,但是总体都有性能提升,实测大约可提升10%~30%的性能,并且已经在多个迁移性能调优项目中实际应用。
二、MA-Advisor性能调优建议工具使用指导
MA-Advisor是一款迁移性能问题自动诊断工具,其集成了昇腾自动诊断工具msprof-analyze,并在ModelArts Standard的Jupyter lab平台进行了插件化,能快速分析和诊断昇腾场景下PyTorch性能劣化问题并给出相关调优建议。
在过往性能调优场景中,如果性能profiling数据在OBS上,通常需要将TB或者GB级别的profiling数据下载至本地后才能使用msprof-analyze进行分析,大量数据的下载耗时以及对本地大规格存储盘的要求容易导致分析受阻。为了能自动串联高性能挂载OBS至ModelArts环境和msprof-analyze的分析能力,ModelArts Standard 场景下对外提供一种插件化的 advisor 分析能力,详细的操作方式请参见基于advisor的昇腾训练性能自助调优指导。
对于GPU和NPU性能比对、NPU多次训练之间性能比对的场景,昇腾提供了性能比对工具compare_tools,通过对训练耗时和内存占用的比对分析,定位到具体劣化的算子,帮助用户提升性能调优的效率。工具将训练耗时拆分为计算、通信、调度三大维度,并针对计算和通信分别进行算子级别的比对;将训练占用的总内存,拆分成算子级别的内存占用进行比对。
对于集群训练场景,昇腾提供了集群分析工具cluster_analysis,当前主要对基于通信域的迭代内耗时分析、通信时间分析以及通信矩阵分析为主,从而定位慢卡、慢节点以及慢链路问题。