单算子Profiling
您可以执行Profiling脚本工具,采集算子运行过程性能数据,通过命令行窗口展示性能分析结果数据。借助数据分析结果,您可以发现算子运行过程中耗时、耗性能的阶段,通过分析代码,从而进行改进、提升算子运行性能。
本章以HwHiAiUser普通用户安装,且默认安装路径/home/HwHiAiUser/Ascend/ascend-toolkit/latest为例,介绍Profiling的操作方法。请实际操作时根据您自己的环境进行替换。
在进行Profiling前,请完成算子工程编译和正常运行,生成工程可执行文件。
采集性能数据
执行以下示例命令采集数据:
- 以安装时创建的HwHiAiUser普通用户登录系统。
- 执行以下命令,copy算子工程可执行文件、模型文件(out目录下的所有文件)到运行环境上,确保可执行文件、模型文件copy到运行环境后的属主用户为HwHiAiUser。
scp -r /home/HwHiAiUser/AscendProjects/MyOperator/out HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/MyOperator
本节所列命令行中的路径、文件名等均为举例,请在实际操作时根据实际环境替换。
- /home/HwHiAiUser/AscendProjects/MyOperator/out: 表示算子工程文件编译后的可执行文件路径。建议copy整个算子工程文件夹,预防有引用的文件遗漏。
- /home/HwHiAiUser/HIAI_PROJECTS/MyOperator: 表示工程可执行文件在运行环境上的存放路径,MyOperator需替换为实际工程名。
- x.x.x.x:Ascend EP环境,表示Host侧IP地址;Ascend RC环境,表示板端环境IP地址。
- 切换至“hiprof.pyc”脚本所在目录/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command。
- 在开发环境中设置hiprof命令环境变量。
export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/lib64:${LD_LIBRARY_PATH}
- 执行以下命令,采集软件、硬件模块数据。关于配置参数的详细解释请参见表7-2。
- 执行不带输入参数的单算子示例(带app_dir参数)
python3.7.5 hiprof.pyc --ip_address=x.x.x.x:port --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=op_trace --app_dir=/home/HwHiAiUser/HIAI_PROJECTS/MyOperator/out --app=main
- 执行不带输入参数的app工程示例(不带app_dir参数)
python3.7.5 hiprof.pyc --ip_address=x.x.x.x:port --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=op_trace --app=/home/HwHiAiUser/HIAI_PROJECTS/MyAppname/out/main
- 执行带输入参数的单算子示例
在此场景下,单算子可执行文件名称以及该执行文件输入参数需要包含在英文双引号内。如下面例子所示:benchmark为单算子可执行名称,--om、--dataDir为需要输入的参数。输入的参数格式请保持与该单算子可执行文件自带参数格式要求一致。
python3.7.5 hiprof.pyc --ip_address=x.x.x.x:port --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=op_trace --app_dir=/home/HwHiAiUser/HIAI_PROJECTS/MyOperator/out --app="benchmark --om model/resnet50_aipp_b8_fp16_output_FP32.om --dataDir datasets/ImageNet2012-1024/"
- Profiling命令行工具支持联想模糊匹配,对于任意命令行参数选项,若用户输入正确且无二义性的前缀,则可正确执行。例如:
对于--profiling_options选项,用户也可通过--profiling_option调用。
- 命令行必须在英文输入法下输入,确保空格符号格式正确,否则会导致命令执行失败。
- 命令行中各参数必须赋值,不允许只输入参数项但又不赋值,否则会有异常报出。该现象为python原生问题。
- --app参数指定的参数值,双引号内不能包含以下特殊字符:[';*?`!#$%^&+=<>{}]|"。
如果自定义参数包括了上述特殊字符,可以通过该方法规避:把相应的执行语句写入可执行文件中,通过可执行文件拉起应用工程;以该可执行文件的名称和所在路径作为--app和--app_dir的值。
- 如果在执行Profiling命令后,中途执行Ctrl+C停止Profiling,此时需要等待10秒后才能再次执行Profiling命令,否则可能会执行失败。
- 如果执行命令报“Data folder is locked”错误信息,可能原因是上次执行Profiling命令异常退出。请删除result_dir参数指定的输出结果文件夹下的文件后再次执行。
- 小技巧:为方便执行hiprof.pyc脚本,您可以使用HwHiAiUser用户执行命令alias hiprof='python3.7.5 /home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command/hiprof.pyc'设置别名,后续就可以不用进入/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command目录,在任意地方输入hiprof执行profiling命令。
表7-2 关键参数说明参数
说明
--result_dir
必选。表示采集结果文件存储地址,如果不存在则自动创建,若存在则将以前文件夹改为.old。此处路径应输入绝对路径。
在“result_dir”处配置的路径需确保应用程序的运行用户对此路径有可读可写权限,将该路径需配置在运行用户家目录下,如“/home/HwHiAiUser/tools/out”目录。
注意:该路径不能设置为其他应用程序已占用的文件夹路径,否则会更改文件夹名称,导致应用程序不能使用。
--ip_address
必选。表示运行环境IP地址和通信端口号。端口号可选,默认为22118。
Ascend EP环境,表示Host侧IP地址;Atlas 200 DK环境,表示板端环境IP地址。
--profiling_options
必选。Profiling采集类型,参数值:op_trace。
--app
必选。配置为运行环境上app可执行文件名或app可执行文件所在目录+文件名。例如:
- 配置为文件名:“--app=main”。
- 配置为目录+文件名:“--app=/home/HwHiAiUser/HIAI_PROJECTS/MyApp2019/out/main”。
如果“app”带参数输入,此时需要使用英文双引号将“app”的参数值括起来,例如--app="main parameters1 parameters2 parameters3"。
如果配置“app”的参数值为app可执行文件名,则需要配置“app_dir”参数。
--app_dir
可选。配置为app可执行文件在运行环境上的存放路径。
例如“--app_dir=/home/HwHiAiUser/HIAI_PROJECTS/MyApp2019/out ”。
说明:- 如果您修改了ADA模块ide_daemon.cfg配置文件的“WORK_PATH”参数默认值,此时不可以使用“~”符号表示运行环境上的ADA运行用户的家目录,只能完整写出app可执行文件存放的绝对路径。
- 运行环境上的ADA运行用户需要有app可执行文件存放路径的读写权限。
--devices
可选。表示设备ID,支持输入多个设备ID,此时需要用英文逗号隔开。默认取0。
--app_location
可选。应用工程或单算子运行的位置,取值包括host或device。默认值为host。
说明:如果取值为device,则--devices参数必选配置,且只能设置为1个存放应用工程或单算子的设备ID号。
--ai_core_profiling
可选。AI Core采集开关。可选on或off,默认值为on。
--ai_core_profiling_mode
可选。AI Core采集类型,可选值task-based或sample-based,默认task-based。
task-based是以task为粒度进行性能数据采集,sample-based是以固定的时间周期进行性能数据采集。
如要采集该数据,需要--ai_core_profiling设置为on。
--aicore_sampling_interval
可选。AI Core采集周期,范围10~1000,默认值为10,单位ms。
--ai_core_metrics
可选。AI Core性能指标采集项,包括:aicoreArithmeticThroughput、aicorePipeline、aicoreSynchronization、aicoreMemoryBandwidth、 aicoreInternalMemoryBandwidth、aicorePipelineStall、aicoreMetricsAll。各采集项的详细指标说明参见AI Core性能指标采集项说明。
- aicoreArithmeticThroughput:各种计算类指标占比统计。
- aicorePipeline:计算单元和搬运单元耗时占比。该项为默认值。
- aicoreSynchronization:同步类指令占比。
- aicoreMemoryBandwidth:外部内存读写类指令占比。
- aicoreInternalMemoryBandwidth:内部内存读写类指令占比。
- aicorePipelineStall:流水线队列类指令占比。
- aicoreMetricsAll:表示采集所有项目,相当于分别下发6次采集任务:aicoreArithmeticThroughput、aicorePipeline、aicoreSynchronization、aicoreMemoryBandwidth、 aicoreInternalMemoryBandwidth、aicorePipelineStall。仅当--profiling_options取值为op_trace时可选。
--app_env
可选。执行Profiling时运行环境上需要的自定义环境变量。
使用英文双引号将参数值括起来,如果涉及多个环境变量需要用英文分号隔开。
例如:--app_env="LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/acllib/lib64"。
- 执行不带输入参数的单算子示例(带app_dir参数)
性能分析结果展示
- Runtime API调用信息。
图中展示信息说明如下:
- Name:调用的API名称。
- Stream ID:API运行的stream ID。
- Time(%):API耗时占用比例。
- Time(ns):API总耗时。
- Calls:API被调用的次数。
- Avg、Min、Max:API调用的平均耗时、最小耗时和最大耗时。
- Task Scheduler的任务调度信息。图7-28 Task Scheduler任务调度信息
图中部分展示信息说明如下:
- Time(%):总耗时占比。
- Time(ns):总耗时。
- Count:对应的Task被执行的次数。
- Avg/Min/Max:平均执行时间、最短耗时、最长耗时。
- Waiting:对应Task总计waiting时间。
- Running:对应Task总计running时间。表示Task的实际运行时间,过长的Task运行时间可能意味着算子实现存在问题。
- Pending:对应Task总计pending时间。
- Type:对应Task 的类型。
- API:对应的API名称。
- Task ID:对应的Task ID。
- OP Name:对应算子名称。
- Stream ID:对应的stream ID。
- AI Core性能数据信息(图7-29以AI Core采集类型和性能指标采集项取默认值为例)。
AI Core Metrics采集的事件详细描述如下:
- Task ID:Task ID。
- Stream ID:Stream ID。
- Op Name:算子名称。
- aicore_time:该Task所有指令的总耗时。
- total_cycles:该Task的所有指令的cycle总数。
- vec_time:代表vec类型指令(向量类运算指令)耗时。
- vec_ratio:代表vec类型指令(向量类运算指令)的cycle数在所有指令的cycle数中的占用比。
- mac_time:代表cube类型指令(矩阵类运算指令)耗时。
- mac_ratio:代表cube类型指令(矩阵类运算指令)的cycle数在所有指令的cycle数中的占用比。
- scalar_time:代表scalar类型指令(标量类运算指令)耗时。
- scalar_ratio:代表scalar类型指令(标量类运算指令)的cycle数在所有指令的cycle数中的占用比。
- mte1_time:代表mte1类型指令(L1->L0A/L0B搬运类指令)耗时。
- mte1_ratio:代表mte1类型指令(L1->L0A/L0B搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- mte2_time:代表mte2类型指令(DDR->AICORE搬运类指令)耗时。
- mte2_ratio:代表mte2类型指令(DDR->AICORE搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- mte3_time:代表mte3类型指令(AICORE->DDR搬运类指令)耗时。
- mte3_ratio:代表mte3类型指令(AICORE->DDR搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- icache_miss_rate:代表icache缺失率,即未命中icache,数值越小越好。
- memory_bound:用于识别AICore执行算子计算过程是否存在Memory瓶颈,由mte2_ratio/max(mac_ratio, vec_ratio)计算得出。计算结果小于1,表示没有Memory瓶颈;计算结果大于1 则表示有Memory瓶颈,且数值越大越瓶颈严重。
- AscendCL输出模型、算子、Runtime API等性能数据。图7-30 AscendCL Module性能数据
- Name:API名称。
- Type:API类型。
- Start Time:API执行开始时间。
- Duration:API运行耗时。
- Process ID:AscendCL API所在进程ID。
- Thread ID:AscendCL API所在线程ID。
- 按推理流程分模块统计耗时信息。图7-31 Top Down信息
Top Down信息说明:
- Infer ID:推理的轮数。
- Module:模块名称。
- API:API名称。
- Start Time:开始时间。
- Durations:总耗时。
性能分析数据应用建议
Profiling采集并解析的性能分析结果数据较多,一般情况下,可以重点关注以下几项的性能数据结果:
aicorePipeline组性能结果:
- mac_ratio:代表cube类型指令(矩阵类运算指令)的cycle数在所有指令的cycle数中的占用比。
- vec_ratio:代表vec类型指令(向量类运算指令)的cycle数在所有指令的cycle数中的占用比。
- scalar_ratio:代表scalar类型指令(标量类运算指令)的cycle数在所有指令的cycle数中的占用比。
- mte1_ratio:代表mte1类型指令(L1->L0A/L0B搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- mte2_ratio:代表mte2类型指令(DDR->AICORE搬运类指令)的cycle数在所有指令的cycle数中的占用比。
- mte3_ratio:代表mte3类型指令(AICORE->DDR搬运类指令)的cycle数在所有指令的cycle数中的占用比。
aicoreMemoryBandwidth组性能结果:
- main_mem_read_bw:代表主存储器读带宽速率,单位GB/s。
- main_mem_write_bw:代表主存储器写带宽速率,单位GB/s。
针对上述几项数据分析,结合其他使用者经验反馈,给出性能优化建议方向供参考: