性能比对工具
通过指定NPU与GPU的profiling数据路径,获取两者的性能数据拆解结果。使用方法如下:
- 参见性能比对工具获取工具。
- 获取数据。
- NPU数据:通过Ascend PyTorch Profiler工具采集NPU的数据。
若采集profiling数据时没有设置profile_memory=True,内存使用数据将不会被采集。
- 性能比对。目前仅支持算子级别的性能比对。通过输入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计算流端到端耗时