下载
中文
注册

PyTorch训练场景性能分析快速入门

PyTorch训练场景下,推荐通过Ascend PyTorch Profiler接口采集并解析性能数据,用户可以根据结果自行分析和识别性能瓶颈。

Ascend PyTorch Profiler接口不支持单进程多Device场景下的性能分析,推荐用户使用多进程方式执行用例,每个进程分别设置一个Device。

前提条件

  • 请确保安装Ascend-cann-toolkit包。

    参见CANN软件安装指南

    安装后检查。执行如下命令查询CANN版本信息,查询结果与安装软件包的版本一致时,则验证安装成功。
    1. 进入软件包安装信息文件目录,请用户根据实际安装路径替换。<arch>表示CPU架构(aarch64或x86_64)。
      1
      cd ${HOME}/Ascend/ascend-toolkit/latest/<arch>-linux
      
    2. 执行命令,查看version字段提供的版本信息。
      1
      cat ascend_toolkit_install.info
      
  • 准备好基于PyTorch 2.1.0或更高版本开发的训练模型以及配套的数据集,并按照PyTorch模型迁移和训练指南中的“迁移适配”完成PyTorch原始模型向昇腾AI处理器的迁移。

采集并解析性能数据

  1. 使用Ascend PyTorch Profiler接口开启PyTorch训练时的性能数据采集。

    在训练脚本(如train_*.py文件)内添加如下示例代码进行性能数据采集参数配置,之后启动训练。如下列示例代码。

    • 下列示例中的接口详细介绍请参见Ascend PyTorch Profiler接口说明
    • PyTorch场景性能数据采集详细介绍请参见使用PyTorch框架接口采集和解析性能数据
    • 性能数据会占据一定的磁盘空间,可能存在磁盘写满导致服务器不可用的风险。性能数据所需空间跟模型的参数、采集开关配置、采集的迭代数量有较大关系,须用户自行保证落盘目录下的可用磁盘空间。
    • 示例一:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      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,
      	gc_detect_threshold=None
      )
      
      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()
      
    • 示例二:
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      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,
      	gc_detect_threshold=None
      )
      
      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()
      

    以上两个示例主要使用tensorboard_trace_handler导出性能数据,也可以使用以下prof.export_chrome_trace方式导出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import torch
    import torch_npu
    
    ...
    
    with torch_npu.profiler.profile() as prof:
    	for step in range(steps):
    		train_one_step(step, steps, train_loader, model, optimizer, criterion)
    prof.export_chrome_trace("./chrome_trace_14.json")
    
  2. 查看采集到的性能数据结果文件。

    训练结束后,在torch_npu.profiler.tensorboard_trace_handler接口指定的目录下生成Ascend PyTorch Profiler接口的采集结果目录。

    • 若kernel_details.csv中出现StepID空值,用户可通过trace_view.json文件查看该算子的Step信息,或重新采集Profiling数据。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    └── localhost.localdomain_139247_20230628101435_ascend_pt    // 解析结果目录,命名格式:{worker_name}_{时间戳}_ascend_pt,默认情况下{worker_name}为{hostname}_{pid}
        ├── profiler_info.json              // 多卡或集群场景命名规则为profiler_info_{Rank_ID}.json,用于记录Profiler相关的元数据
        ├── profiler_metadata.json
        ├── ASCEND_PROFILER_OUTPUT          // Ascend PyTorch Profiler接口采集性能数据
           ├── ascend_pytorch_profiler_{rank_id}.db          // export_type为torch_npu.profiler.ExportType.Db时该目录下生成.db文件,其他.json和.csv文件不生成,使用MindStudio Insight工具展示
           ├── analysis.db                // 多卡或集群等存在通信的场景下,设置export_type为torch_npu.profiler.ExportType.Db时该目录下生成.db文件,其他.json和.csv文件不生成,使用MindStudio Insight工具展示
           ├── communication.json         // 为多卡或集群等存在通信的场景性能分析提供可视化数据基础,配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
           ├── communication_matrix.json   // 通信小算子基本信息文件,配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
           ├── data_preprocess.csv        // 配置experimental_config profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
           ├── kernel_details.csv
           ├── l2_cache.csv               // 配置experimental_config的l2_cache=True生成
           ├── memory_record.csv
           ├── npu_module_mem.csv
           ├── operator_details.csv
           ├── operator_memory.csv
           ├── step_trace_time.csv        // 迭代中计算和通信的时间统计
           ├── op_statistic.csv           // AI Core和AI CPU算子调用次数及耗时数据
           ├── api_statistic.csv          // 配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
           └── trace_view.json
        ├── FRAMEWORK                      // 框架侧的性能原始数据,无需关注,data_simplification=True时删除此目录
        └── PROF_000001_20230628101435646_FKFLNPEPPRRCFCBA  // CANN层的性能数据,命名格式:PROF_{数字}_{时间戳}_{字符串},data_simplification=True时,仅保留此目录下的原始性能数据,删除其他数据
              ├── analyze      // 配置experimental_config的profiler_level=torch_npu.profiler.ProfilerLevel.Level1或profiler_level=torch_npu.profiler.ProfilerLevel.Level2生成
              ├── device_*
              ├── host
              ├── mindstudio_profiler_log
              └── mindstudio_profiler_output
    ├── localhost.localdomain_139247_20230628101435_ascend_pt_op_args // 算子信息统计文件目录,配置experimental_config的record_op_args=True生成