性能比对拆解工具

通过指定NPU与GPU的profiling数据路径,获取两者的性能数据拆解结果。使用方法如下:

  1. 参见性能比对拆解工具获取工具。
  2. 获取数据。

    • GPU数据:参见官方文档使用PyTorch原生接口采集GPU数据。

    若采集profiling数据时没有设置profile_memory=True,内存使用数据将不会被采集。

  3. 性能比对。

    目前仅支持算子级别的性能比对。通过输入GPU与NPU、GPU与GPU或NPU与NPU的json文件,得到比对结果,命令如下。
    # 进入att代码仓目录下的compare_tools目录
    cd att/profiler/compare_tools 
    # 执行最简比对命令
    python performance_compare.py [基准性能数据文件] [比对性能数据文件] --output_path=./result_dir
    表1 参数说明

    参数名

    说明

    是否必选

    --enable_profiling_compare

    开启总体性能比对。

    --enable_operator_compare

    开启算子性能比对。

    --enable_communication_compare

    开启通信性能比对。

    --enable_memory_compare

    开启算子内存比对。

    当用户设置以上任意参数时,则只按照用户设置的参数进行性能比对。在以上四个参数均未设置的情况下,工具默认开启所有的参数。示例如下:

    python performance_compare.py [基准性能数据文件] [比对性能数据文件] --output_path=./result_dir --enable_profiling_compare
    表2 算子性能比对参数说明

    参数名

    说明

    是否必选

    --output_path

    输出文件保存目录。

    --GPU_flow_cat

    配置GPU trace中cpu侧算子与device kernel的连线标识,当GPU的kernel均为空时设置。根据timeline的json文件在chrome://tracing上的Flow events的选项配置。使用示例:--GPU_flow_cat=async_GPU

    --use_input_shape

    开启算子精准匹配,默认关闭。使用示例:--use_input_shape

    --max_kernel_num

    设置CPU侧算子下发的最大kernel数量,当超过设定值时工具会自动往下找子算子,直至满足条件,默认仅比对最上层算子。使用示例:

    --max_kernel_num=10

    --op_name_map

    设置GPU与NPU等价的算子名称的映射关系,以字典形式存入。使用示例:--op_name_map='{"Optimizer.step#SGD.step":"Optimizer.step#NpuFusedSGD.step"}'

    本工具不仅支持GPU与NPU Trace文件的比较,也支持NPU与NPU或者GPU与GPU Trace文件的比较,传入的第一个Trace文件会作为基准数据。

    对比拆解数值计算解释如表3所示。

    表3 参数说明

    性能拆解维度

    GPU

    NPU

    算子耗时

    包含cube算子耗时和vector算子耗时

    包含cube算子耗时和vector算子耗时

    计算流耗时

    GPU计算流所有event耗时总和

    NPU计算流所有event耗时总和

    算子总量

    GPU计算流上cube、vector以及总的算子量

    NPU计算流上cube、vector以及总的算子量

    通信耗时

    GPU通信未掩盖耗时

    NPU通信未掩盖耗时

    调度占比

    • 调度耗时 = 单步打屏时间 - 算子耗时 - 通信不可掩盖耗时,其中单步打屏时间需要用户输入,当用户不输入时,采用e2e耗时代替单步打屏时间
    • 获得调度耗时后,使用调度占比 = 调度耗时/E2E耗时获取调度占比
    • 调度耗时 = 单步打屏时间 - 算子耗时 - 通信不可掩盖耗时,其中单步打屏时间需要用户输入,当用户不输入时,采用e2e耗时代替单步打屏时间
    • 获得调度耗时后,使用调度占比 = 调度耗时/E2E耗时 获取调度占比

    内存分析

    • GPU的内存使用可以使用nvidia-smi查看
    • profiling信息采集时打开profile_memory=True开关,即可从json文件中读出运行稳定后的memory信息
    • NPU的内存使用可以使用npu-smi info查看
    • profiling信息采集时打开profile_memory=True开关,即可从csv文件中读出运行稳定后的memory信息

    计算流e2e耗时

    GPU计算流端到端耗时

    NPU计算流端到端耗时

    性能比对结果文件说明可参见开源社区