昇腾 Profiling 性能调优工具 Ascend PyTorch Adaptor 使用

Mindstudio 简介

MindStudio为用户提供在AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。通过依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助用户在一个工具上就能高效便捷地完成AI应用开发。另一方面,MindStudio采用插件化扩展机制,以支持开发者通过开发插件来扩展已有功能。在本案例中所使用的cann 版本为7.0,具体安装流程可参考MindStudio安装教程(https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000002.html)。

具体的,MindStudio的功能包括:

针对安装与部署,MindStudio提供多种部署方式,支持多种主流操作系统,为开发者提供最大便利。
针对网络模型的开发,MindStudio支持TensorFlow、Pytorch、MindSpore框架的模型训练,支持多种主流框架的模型转换。集成了训练可视化、脚本转换、模型转换、精度比对等工具,提升了网络模型移植、分析和优化的效率。
针对算子开发,MindStudio提供包含UT测试、ST测试、TIK算子调试等的全套算子开发流程。支持TensorFlow、PyTorch、MindSpore等多种主流框架的TBE和AI CPU自定义算子开发。
针对应用开发,MindStudio集成了Profiling性能调优、编译器、MindX SDK的应用开发、可视化pipeline业务流编排等工具,为开发者提供了图形化的集成开发环境,通过MindStudio可以进行工程管理、编译、调试、性能分析等全流程开发,可以很大程度提高开发效率。

什么是profiling

在软件工程和计算机科学领域,profiling[是一种动态分析方法,用于收集程序运行时的信息,以研究程序的行为。其主要目的是定位程序中需要优化的部分,从而提高程序的性能。profiling可以提供详细的性能数据,帮助开发者理解程序在执行过程中的资源消耗情况,如CPU时间、内存使用、磁盘I/O和网络I/O等。

在华为的ICT服务领域,profiling特指一种实现Host+Device侧丰富的性能数据采集和全景Timeline交互分析的能力。它展示Host+Device侧各项性能指标,帮助用户快速发现和定位AI应用的性能瓶颈,包括资源瓶颈导致的AI算法短板,指导算法性能提升和系统资源利用率的优化。profiling支持Host+Device侧的资源利用可视化统计分析,具体包括Host侧CPU、Memory、Disk、Network利用率和Device侧APP工程的硬件和软件性能数据。

3e042ea397e243df81a17621df28a967.png

昇腾Mindstudio 调优软件栈有哪些

主要有msprof,mstt,pytorch profiler,mindspore profiler,tensorflow profiler。性能数据采集侧主要负责有6+3种采集方式,其中msprof是所有工具的基础,主要采集解析逻辑都是基于该工具实现。其次是三个主流框架测的工具采集实现,主要是将msprof的功能集成在PyTroch,Mindspore与Tensorflow框架中自带的profiler,从而实现更加便捷的性能数据采集与解析,剩下几种则是一些推理侧的性能采集方式。

90a1c8ce53cb4e90870c6630cc9f12ec.png

Ascend PyTorch profiler 简介

Ascend PyTorch Profiler是针对PyTorch框架开发的性能数据采集和解析工具,通过在PyTorch训练脚本中插入Ascend PyTorch Profiler接口,执行训练的同时采集性能数据,完成训练后直接输出可视化的性能数据文件,提升了性能分析效率。

Ascend PyTorch Profiler接口可全面采集PyTorch训练场景下的性能数据,主要包括PyTorch层算子信息、CANN层算子信息、底层NPU算子信息、以及算子内存占用信息等,可以全方位分析PyTorch训练时的性能状态。

采集方式

Ascend PyTorch Profiler完全对标PyTorch-GPU场景下的使用方式,支持采集PyTorch框架和昇腾软硬件数据。该方式提供with语句和start/stop语句两种使能方式,同时用户可以通过设置schedule参数灵活控制不同step的Profiling行为。

采集方式一:通过with语句进行采集

import torch
import torch_npu

...

experimental_config = torch_npu.profiler._ExperimentalConfig(
	export_type=torch_npu.profiler.ExportType.Text,
	profiler_level=torch_npu.profiler.ProfilerLevel.Level0,
	msprof_tx=False,
	aic_metrics=torch_npu.profiler.AiCMetrics.AiCoreNone,
	l2_cache=False,
	op_attr=False,
	data_simplification=False,
	record_op_args=False
)

with torch_npu.profiler.profile(
        activities=[
                torch_npu.profiler.ProfilerActivity.CPU,
                torch_npu.profiler.ProfilerActivity.NPU
                ],
        schedule=torch_npu.profiler.schedule(wait=0, warmup=0, active=1, repeat=1, skip_first=1),
        on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./result"),
        record_shapes=False,
        profile_memory=False,
        with_stack=False,
        with_modules=False,
        with_flops=False,
        experimental_config=experimental_config) as prof:
                for step in range(steps):
                       train_one_step(step, steps, train_loader, model, optimizer, criterion)
                       prof.step()

采集方式二:startstop方式进行采集

import torch
import torch_npu
...

experimental_config = torch_npu.profiler._ExperimentalConfig(
	export_type=torch_npu.profiler.ExportType.Text,
	profiler_level=torch_npu.profiler.ProfilerLevel.Level0,
	msprof_tx=False,
	aic_metrics=torch_npu.profiler.AiCMetrics.AiCoreNone,
	l2_cache=False,
	op_attr=False,
	data_simplification=False,
	record_op_args=False
)

prof = torch_npu.profiler.profile(
       activities=[
                torch_npu.profiler.ProfilerActivity.CPU,
                torch_npu.profiler.ProfilerActivity.NPU
                ],
       schedule=torch_npu.profiler.schedule(wait=0, warmup=0, active=1, repeat=1, skip_first=1),
       on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./result"),
        record_shapes=False,
        profile_memory=False,
        with_stack=False,
        with_modules=False,
        with_flops=False,
        experimental_config=experimental_config)
prof.start()
for step in range(steps):
         train_one_step()
         prof.step()
prof.stop()

开关控制

activities

CPU、NPU事件采集列表,Enum类型。取值为:

• torch_npu.profiler.ProfilerActivity.CPU:框架侧数据采集的开关。
• torch_npu.profiler.ProfilerActivity.NPU:CANN软件栈及NPU数据采集的开关。

默认情况下两个开关同时开启。

record_shapes

 

算子的InputShapes和InputTypes,Bool类型。取值为:

• True:开启。
• False:关闭。默认值。

开启torch_npu.profiler.ProfilerActivity.CPU时生效。

profile_memory

算子的内存占用情况,Bool类型。取值为:

• True:开启。
• False:关闭。默认值。

with_stack

算子调用栈,Bool类型。取值为:

• True:开启。
• False:关闭。默认值。

开启torch_npu.profiler.ProfilerActivity.CPU时生效。

on_trace_ready

设置采集结束时执行的操作,Callable类型。通常选择tensorboard_trace_handler,该接口用于解析采集的Profiling数据。

experimental_config

该参数用于设置NPU上的一些专有采集配置项。

•profiler_level:设置NPU采集的Level,支持:

•torch_npu.profiler.ProfilerLevel.Level0(默认)

•torch_npu.profiler.ProfilerLevel.Level1

•torch_npu.profiler.ProfilerLevel.Level2

•data_simplification:数据精简开关,默认打开;

•aic_metrics:AI Core的性能指标采集项(高阶用户);

•l2_cache:l2 cache数据采集开关(性能膨胀);

•record_op_args:记录AOE组件算子Dump数据(不建议与Profiling功能一起使用)

交付件分析

e1d6141387cc445bb5ffd8fa902e606f.png

1a94efe8b9f5479182933bbb3563a2cf.png

交付件可视化

前提条件

安装MindStudio Insight-安装和卸载操作(Windows)-安装与卸载-MindStudio Insight用户指南-MindStudio7.0.RC2开发文档-昇腾社区

安装Mindstudio insight 交付件可视化工具

已安装Python3,并完成执行环境的配置。

已获取采集到的原始集群数据,且单卡采集的数据中必须包含表1中的文件

1a94efe8b9f5479182933bbb3563a2cf.png

处理数据(千卡以上场景,32节点内场景直接导入即可)

  1. 将所有以“ascend_pt”结尾的profiling原始数据汇总至同一个目录,如图1所示。

    图1 数据汇总

    b725802eef3c248f60d71d467fc7ed94.png

  2. 在集群分析工具目录下,执行以下命令,解析数据,如图2所示。
    python3 cluster_analysis.py -d {
         
         原始数据存放路径}

    图2 解析数据

    a95a5c9300608b623d3769b9c95ae2a2.png

    命令执行成功后,会在数据存放路径下,生成一个“cluster_analysis_output”目录,如图3所示,该目录中保存着数据解析后的结果文件,结果文件如表2所示。

    图3 生成的目录

    9e9718d104576982a8a0859fd38e27c5.png

    表2 cluster_analysis_output目录文件

    数据类型

    文件名

    说明

    TEXT

    cluster_step_trace_time.csv

    数据解析模式为communication_matrix、communication_time或all时均生成。

    cluster_communication_matrix.json

    数据解析模式为communication_matrix或all时生成。

    cluster_communication.json

    数据解析模式为communication_time或all时生成,主要为通信耗时数据。

    communication_group.json

    数据解析模式为communication_matrix、communication_time或all时均生成,记录通信域分组信息。

    DB

    cluster_analysis.db

    解析analysis.db或ascend_pytorch_profiler_{rank_id}.db生成的文件。

  3. 将“cluster_analysis_output”目录导入MindStudio Insight工具进行分析。

分析数据

定位慢卡问题

  1. 在概览(Summary)界面,输入模型脚本对应的并行策略值,如图1所示。其中PP为流水线并行(‌Pipeline Parallelism),TP为‌张量并行(‌Tensor Parallelism),DP为数据并行(‌Data Parallelism)‌。

    图1 输入并行策略值

    60f5a83ea21a34bc02c291695daa73ea.png

  2. 在“计算/通信概览”区域,分别选择“迭代ID”和“通信域”,查看柱状图,观察总计算时间和未被覆盖的通信时间时长,如图2所示。

    慢卡通常表现为总计算耗时长,通信时间耗时短。

    图2 查看计算与通信耗时

    cc508b9347adee0b504faa9ab8122e38.png

  3. 在通信(Communication)界面,选择“通信耗时分析”,并选择需要查看的“迭代ID”和“通信域”,在“通信时长数据分析”区域,查看所选通信域的各卡的“总时间(ms)”耗时情况。
  4. 单击“总时间(ms)”后的

    fc3fa856223406fb9a7a4ec46fccfda6.png

    ,由大到小进行降序排序,如果发现时间差距很大的两张卡,那么耗时最短的卡即为慢卡,如图3所示。

    图3 查看慢卡

    b76aa2a696667677eb1a521c07131790.png

  5. 单击慢卡“通信算子详情”列的“查看更多”,可查看每个通信算子耗时。
  6. 单击算子“总时间(ms)”后的

    193022d661ddd08d2bbffc41fd4f2f02.png

    ,进行降序排序,可以看到耗时最长的算子,如图4所示,复制该算子名称。

    图4 查询算子

    b6c8fddebdc5befc7733965031d43ce9.png

  7. 在通信(Communication)界面,参数配置区域的“算子名称”选项中粘贴已复制的算子名称,在下拉框选择该算子。
  8. 分别在“HCCL”和“通信时长”区域图表中,可看到该算子的耗时不对等,如图5所示,可判断是由慢卡引起的。获取图表中最快卡和最慢卡的原始数据目录,导入MindStudio Insight工具,在时间线(Timeline)界面进行具体分析。

    图5 定位慢卡

    93ca7036e99e7be98581ec5f71894d4e.png

分析数据

  1. 定位慢卡问题8定位到的最快卡和最慢卡的原始数据汇总至同一目录,并导入MindStudio Insight工具。
  2. 打开通信(Communication)界面,选择“通信耗时分析”,在“算子名称”选项中输入定位到的慢卡算子名称,选择该算子。
  3. 在“HCCL”区域,分别找到该算子耗时最短和耗时最长的卡,在对应柱状图上右键单击“跳转至时间线页面”,跳转至时间线(Timeline)界面对应卡的算子上,如图6所示。

    图6 跳转时间线页面

    ff0157a5fcb47cafe5aa73861716fb6a.png

  4. 单击

    a49b11add4fa333915074a41d5d306e0.png

    ,分别将所属卡的泳道置顶,对该算子进行比较分析,如图7所示。

    图7 分析算子信息

    8b308f5c0b233c64ecd560bc338743f8.png

  5. 并对所属卡其它进程的算子信息进行比较分析,定位慢卡原因,从而找到解决办法。

猜你喜欢

转载自blog.csdn.net/aosudh/article/details/144283664
今日推荐