更新时间:2021-03-18 GMT+08:00
分享

APP工程Profiling

使用命令行方式分析应用工程运行的性能数据,您可以普通用户登录开发环境服务器,执行脚本命令采集性能数据,采集成功后,可直接在命令行窗口查看性能分析结果。

在进行Profiling前,请参考应用软件开发指南完成应用工程开发、编译和正常运行,生成工程可执行文件。

采集性能数据

执行以下示例命令采集数据:

  1. 以安装时创建的HwHiAiUser普通用户登录到服务器。
  2. 执行以下命令,copy工程可执行文件(out目录下的所有文件)、模型文件、数据集文件、acl.json文件到运行环境,确保可执行文件、模型文件、数据集文件、acl.json文件copy到运行环境后的属主用户为HwHiAiUser。

    scp -r /home/HwHiAiUser/AscendProjects/MyAppname/run/out HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/workspace_mind_studio/MyAppname

    scp -r /home/HwHiAiUser/AscendProjects/MyAppname/run/model HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/workspace_mind_studio/MyAppname

    scp -r /home/HwHiAiUser/AscendProjects/MyAppname/run/data HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/workspace_mind_studio/MyAppname

    scp -r /home/HwHiAiUser/AscendProjects/MyAppname/src/ HwHiAiUser@x.x.x.x:/home/HwHiAiUser/HIAI_PROJECTS/workspace_mind_studio/MyAppname

    本节所列命令行中的路径、文件名等均为举例,请在实际操作时根据实际环境替换。

    • /home/HwHiAiUser/AscendProjects/MyAppname/run/out: 表示工程文件编译后的可执行文件路径。
    • /home/HwHiAiUser/AscendProjects/MyAppname/run/model:表示模型文件路径。
    • /home/HwHiAiUser/AscendProjects/MyAppname/run/data:表示数据集文件路径。
    • /home/HwHiAiUser/AscendProjects/MyAppname/src表示acl.json文件存放路径。
    • /home/HwHiAiUser/HIAI_PROJECTS/workspace_mind_studio/MyAppname: 表示工程文件在运行环境上的存放路径,MyAppname需替换为实际工程名。如果该工程名目录不存在,请新建。

      可执行文件所在的out目录、model文件所在目录、data数据集所在目录、acl.json文件所在目录拷贝后的相对位置,要与应用工程代码路径一致。

    • x.x.x.x:Ascend RC环境,表示板端环境IP地址;

  3. 切换至“hiprof.pyc”脚本所在目录,如/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command。
  4. 设置环境变量。

    export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/lib64:${LD_LIBRARY_PATH}

  5. 执行以下命令,采集软件、硬件模块数据。关于配置参数的详细解释请参见表1

    • 执行不带输入参数的app工程示例

      python3.7.5 hiprof.pyc --ip_address=x.x.x.x --adc_dir=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=task_trace --app_dir=~/HIAI_PROJECTS/workspace_mind_studio/MyAppname/out --app=main

    • 执行带输入参数的app工程示例

      在此场景下,app名称以及app的输入参数需要包含在英文双引号内。如下面例子所示:benchmark为app名称,--om、--dataDir、--batchSize、--dvppConfig、--postprocessType、--resnet50StdFile为此app需要输入的参数。输入的参数格式请保持与该app工程自带参数格式要求一致。

      python3.7.5 hiprof.pyc --ip_address=x.x.x.x --adc_dir=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin --result_dir=/home/HwHiAiUser/tools/out --profiling_options=task_trace --app_dir=~/HIAI_PROJECTS/workspace_mind_studio/Benchmark/out --app="benchmark --om model/resnet50_aipp_b8_fp16_output_FP32.om --dataDir datasets/ImageNet2012-1024/ --batchSize 8 --dvppConfig configure/dvppConfig_resnet --postprocessType resnet --resnet50StdFile configure/jpg_accuracy.csv"

    • 执行带System Profiling的命令示例

      python3.7.5 hiprof.pyc --ip_address=x.x.x.x --adc_dir=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin --result_dir=/home/HwHiAiUser/tools/out/ --profiling_options=task_trace,system_trace --ai_core_profiling_mode=sample-based --app_dir=~/HIAI_PROJECTS/workspace_mind_studio/MyAppname/out --app=main

    • 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命令。
    表1 关键参数说明

    参数

    说明

    是否必选

    --result_dir

    表示采集结果文件存储地址,如果不存在则创建,若存在则将以前文件夹改为.old。此处路径应输入绝对路径。

    “result_dir”处配置的路径需确保应用程序的运行用户对此路径有可读可写权限,将该路径配置为运行用户家目录下,如“/home/HwHiAiUser/tools/out”目录。

    注意:该路径不能设置为其他应用程序已占用的文件夹路径,否则会更改文件夹名称,导致应用程序不能使用。

    --ip_address

    Ascend RC环境,表示板端环境IP地址;

    --profiling_options

    Profiling采集类型,可选值包括:

    • task_trace:应用工程Profiling。
    • op_trace:单算子Profiling。
    • system_trace:System Profiling。

    仅支持三种类型分别独立配置,以及task_trace与system_trace组合,采用组合时需用英文逗号隔开。

    --app

    配置为app可执行文件名,例如--app=main。

    如果app带参数输入,此时需要使用英文双引号将app名和输出参数括起来,例如--app="main parameters1 parameters2 parameters3"。

    --app_dir

    配置为app可执行文件在运行环境上的存放路径,固定格式:~/HIAI_PROJECTS/{MyAppname_out}

    • ~/HIAI_PROJECTS:固定路径,系统对该字段进行校验。
    • {MyAppname_out}:可执行文件存放的位置。

    例如“--app_dir=~/HIAI_PROJECTS/workspace_mind_studio/MyApp2019/out ”

    说明:

    如果您修改了ADA模块ide_daemon.cfg配置文件的“WORK_PATH”参数值,此时“~”符号需要替换为该参数对应的值;默认情况下该参数值为“~”

    需要确保app可执行文件存放在本处指定的路径下。

    --adc_dir

    表示adc安装路径,固定路径:/home/HwHiAiUser/Ascend/ascend-toolkit/latest/toolkit/tools/ide_daemon/bin。

    --devices

    表示设备ID,支持输入多个设备ID,此时需要用英文逗号隔开。

    • 当profiling_options只配置为task_trace时,默认取all;profiling_options配置为其他值时,默认取0。
    • 当profiling_options配置包含system_trace时,devices参数只能配置为1个设备ID。

    --app_location

    应用工程或单算子运行的位置。默认值为host。

    --ai_core_profiling

    AI Core采集开关。可选on或off,默认值为on。

    说明:
    • --ai_core_profiling_mode设置为task-based时,该参数不生效,Profiling采集结果始终包括AI Core性能数据。
    • --ai_core_profiling_mode设置为sample-based时,该参数生效。设置off时不采集AI Core性能数据;设置为on时采集AI Core性能数据。

    --ai_core_profiling_mode

    AI Core采集类型,可选值task-based或sample-based,默认task-based。

    task-based是以task为粒度进行性能数据采集,sample-based是以固定的时间周期进行性能数据采集。

    • 如要采集该数据,需要--ai_core_profiling设置为on。
    • 如果--profiling_options配置项为system_trace,该参数项必配且只能配置为sample-based。

    --aicore_sampling_interval

    AI Core采集周期,范围10~1000,默认值为10,单位ms。

    --ai_core_metrics

    AI Core性能指标采集项,包括:aicoreArithmeticThroughput、aicorePipeline、aicoreSynchronization、aicoreMemoryBandwidth、 aicoreInternalMemoryBandwidth、aicorePipelineStall、aicoreMetricsAll 。

    • aicoreArithmeticThroughput:各种计算类指标占比统计,包括采集项mac_fp16_ratio、mac_int8_ratio、vec_fp32_ratio、vec_fp16_ratio、vec_int32_ratio、vec_misc_ratio。
    • aicorePipeline:计算单元和搬运单元耗时占比,包括采集项vec_ratio、mac_ratio、scalar_ratio、mte1_ratio、mte2_ratio、mte3_ratio、icache_miss_rate。该项为默认值。
    • aicoreSynchronization:同步类指令占比,包括采集项scalar_waitflag_ratio、cube_waitflag_ratio、vector_waitflag_ratio、mte1_waitflag_ratio、mte2_waitflag_ratio、mte3_waitflag_ratio。
    • aicoreMemoryBandwidth:外部内存读写类指令占比,包括采集项ub_read_bw、ub_write_bw、l1_read_bw、l1_write_bw、l2_read_bw、l2_write_bw、main_mem_read_bw、main_mem_write_bw。
    • aicoreInternalMemoryBandwidth:内部内存读写类指令占比,包括采集项scalar_ld_ratio、scalar_st_ratio、l0a_read_bw、l0a_write_bw、l0b_read_bw、l0b_write_bw、l0c_read_bw、l0c_write_bw。
    • aicorePipelineStall:流水线队列类指令占比,包括采集项vec_bankgroup_cflt_ratio、vec_bank_cflt_ratio、vec_resc_cflt_ratio、mte1_iq_full_ratio、mte2_iq_full_ratio、mte3_iq_full_ratio、cube_iq_full_ratio、vec_iq_full_ratio、iq_full_ratio。
    • aicoreMetricsAll:表示采集所有项目,相当于分别下发6次采集任务:aicoreArithmeticThroughput、aicorePipeline、aicoreSynchronization、aicoreMemoryBandwidth、 aicoreInternalMemoryBandwidth、aicorePipelineStall。仅当--profiling_options取值为op_trace时可选。

    --cpu_profiling

    CPU(AI CPU、Ctrl CPU、TS CPU)采集开关。可选on或off,默认值为on。

    这些硬件性能指标项,仅当profiling_options配置包含system_trace时生效。

    --cpu_sampling_interval

    CPU采集周期,范围20~1000,默认值为20,单位ms。

    说明:

    该项设置的时间如果比APP运行时间长,则有可能采集不到TS CPU的性能数据。

    --sys_profiling

    系统CPU usage及System memory采集开关。可选on或off,默认值为off。

    --sys_sampling_interval

    系统CPU usage及System memory采集周期,范围100~1000,默认值为100,单位ms。

    --pid_profiling

    进程的CPU usage及进程的memory采集开关。可选on或off,默认值为off。

    --pid_sampling_interval

    进程的CPU usage及进程的memory采集周期,范围100~1000,默认值为100,单位ms。

    --hardware_mem

    LLC、DDR采集开关。可选on或off,默认值为on。

    --llc_profiling

    LLC Profiling采集事件,可以设置为:

    • capacity:采集AI CPU和Control CPU的LLC capacity数据。
    • bandwidth:采集LLC bandwidth。

    如要采集该数据,需要--hardware_mem设置为on。

    --hardware_mem_sampling_interval

    LLC、DDR采集周期,范围1~1000,默认值为20,单位ms。

    --io_profiling

    NIC采集开关。可选on或off,默认值为on。

    --io_sampling_interval

    NIC采集周期,范围10~1000,默认值为10,单位ms。

    --dvpp_profiling

    DVPP采集开关。可选on或off,默认值为on。

    --dvpp_sampling_interval

    DVPP采集周期,范围10~1000,默认值为20,单位ms。

    --aiv_profiling

    保留参数,无需配置。

    --aiv_sampling_interval

    保留参数,无需配置。

    --aiv_metrics

    保留参数,无需配置。

    --interconnection_profiling

    保留参数,无需配置。

    --interconnection_sampling_interval

    保留参数,无需配置。

    --L2_cache_events

    保留参数,无需配置。

展示性能分析结果

当通过命令行方式查看到的数据(RunTime API、TS API、AI Core Metrics)较多时,导致不便于阅读,或数据超过50条时,此时可以参考导出Profiling性能分析结果内容,将性能分析结果导出成csv格式文件。

因执行的命令行参数项不同,导致展示结果不一样,所以,本章节的结果展示仅为举例,请以实际结果为准。本处仅截取各类性能数据分析某一种结果举例,不再对所有场景一一举例。

  1. RunTime API调用信息。
    图1 RunTime数据采集结果

    图中展示信息说明如下:

    • Name:调用的API名称。
    • Stream ID:API运行的stream ID。
    • Time(%):API耗时占用比例。
    • Time(ns):API总耗时。
    • Calls:API被调用的次数。
    • Avg、Min、Max:API调用的平均耗时、最小耗时和最大耗时。

    图1中StreamID列显示的“N/A”表示该API是直接调用的接口,不属于任何Stream。

  2. Task Scheduling的任务调度信息。
    图2 Task Scheduling任务调度信息

    图中部分展示信息说明如下:

    • Time(%):总耗时占比。
    • Time(ns):总耗时。
    • Count:对应的Task被执行的次数。
    • Avg/Min/Max:平均执行时间、最短耗时、最长耗时。
    • Waiting:对应Task总计waiting时间。
    • Running:对应Task总计running时间。表示Task的实际运行时间,过长的Task运行时间可能意味着算子实现存在问题。
    • Pending:对应Task总计pending时间。
    • Type:对应Task 的类型。
    • API:对应的API名称。
    • Task:对应的Task名称。
    • OP Name:对应的算子名称。
    • Stream:对应的stream ID。
    • NPU:对应的Device ID。

    可能存在Time显示为0的Task,是因为实际芯片晶振频率和采样频率不一致,导致Profiling获取的开始时间和结束时间一样。

    也可能存在API名称为空的情况,是因为Runtime部分API不上报信息,如rtRDMASend、rtNotifyWait、rtIpcOpenNotify、rtSubscribeReport、rtCallbackLaunch、rtProcessReport、rtUnSubscribeReport、rtGetRunMode、rtRDMADBSend、rtEndGraph等接口。

  3. AI Core性能数据信息。
    AI Core采集类型选值task-based时,统计的AI Core性能数据如图3所示。
    图3 AI Core性能数据

    AI Core Metrics采集的事件详细描述如下:

    • Task:Task ID。
    • Stream:Stream ID。
    • Op Name:算子名称。
    • total_time:该Task所有指令的总耗时。
    • total_cycles:该Task的所有指令的cycle总数。
    • vec_ratio:代表vec类型指令(向量类运算指令)的cycle数在所有指令的cycle数中的占用比。
    • mac_ratio:代表cube类型指令(矩阵类运算指令)的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数中的占用比。
    • icache_miss_rate:代表icache缺失率,即未命中icache,数值越小越好。
    • memory_bound:用于识别AICore执行算子计算过程是否存在Memory瓶颈,由mte2_ratio/max(mac_ratio, vec_ratio)计算得出。计算结果小于1,表示没有Memory瓶颈;计算结果大于1 则表示有Memory瓶颈,且数值越大越瓶颈严重。
  4. GE组件提供的算子信息。
    图4 GE task and graph info信息

    图中展示信息说明如下:

    • OP Name:算子名称。
    • Op Type:算子类型。
    • Task ID:Task任务的ID号。
    • Block Dim:Task运行时所在的核。
    • Stream ID:Stream任务的ID号。
    • Input Count:该算子总共多少组输入。
    • Input Formats:input算子格式。
    • Input Shapes:算子的输入维度。
    • Input Data Types:input算子输入数据类型。
    • Output Count:该算子总共多少组输出。
    • Output Formats:output算子格式。
    • Output Shapes:算子的输出维度。
    • Output Data Types:output算子输入数据类型。
  5. GE模型加载信息及GE模型的数据输入、推理、数据输出耗时。
    1. GE模型加载信息。
      图5 GE模型加载信息

      图中展示信息说明如下:

      • Model Name:模型名称。
      • Model ID:模型ID。
      • Stream ID:融合算子所属的Stream ID。
      • Fusion Op:融合算子名称。
      • Original Ops:被融合算子名称。
      • Memory Input:输入Tensor内存大小。
      • Memory Output:输出Tensor内存大小。
      • Memory Weight:权值内存大小。
      • Memory Workspace:workspace内存大小。
      • Memory Total:总内存,Memory Input、Memory Output、Memory Weight、Memory Workspace四项之和。
      • Task IDs:Task ID号。
    2. GE模型的数据输入、推理、数据输出耗时。
      图6 GE模型的数据输入、推理、数据输出耗时

      图中展示信息说明如下:

      • Model Name:模型名称。
      • Model ID:模型ID号。
      • Data Index:Data索引。
      • Request ID:Request ID。
      • Input Start Times:输入数据处理开始时间。
      • Input End Times:输入数据处理结束时间。
      • Inference Start Times:模型执行开始时间。
      • Inference End Times:模型执行结束时间。
      • Output Start Times:输出数据处理开始时间。
      • Output End Times:输出数据处理结束时间。
  6. ACL输出模型、算子、Runtime API等性能数据。
    图7 ACL Module性能数据
    • Name:API名称。
    • Type:API类型。
    • Time:API运行耗时。
    • Process ID:ACL API所在进程ID。
    • Thread ID:ACL API所在线程ID。
  7. System Profiling信息。
    1. Control CPU/AI CPU/TS CPU PMU事件和热点函数。
      图8 Control CPU/AI CPU/TS CPU PMU事件和热点函数

      图中显示的Unknown对应的是没有符号表的函数。

    1. NIC数据。
      图9 NIC数据
      • Duration:持续时长。
      • Bandwidth:带宽。
      • Rx Bandwidth efficiency:代表接收包带宽利用率。
      • rxPacket/s:代表每秒收包速率。
      • rxError rate:代表接收包错误率。
      • rxDropped rate:代表接收包丢包率。
      • Tx Bandwidth efficiency:代表发送包带宽利用率。
      • txPacket/s:代表每秒发送包速率。
      • txError rate:代表发送包错误率。
      • txDropped rate:代表发送包丢包率。
    2. DVPP数据。
      图10 DVPP数据
      • Engine type:引擎类型。
      • Engine id:引擎ID号。
      • All Time :代表每次采样引擎使用的时间。
      • All Frame:代表每次采样引擎处理的帧数。
      • All Utilization:代表平均利用率,即累加的处理时间/运行时间。
    3. LLC数据。
      图11 LLC数据
      • 命令行采集项配置“capacity”:显示LLC的使用容量信息。
      • 命令行采集项配置“bandwidth”:显示LLC的读写带宽以及命中率。
    4. DDR带宽读写速率。
      图12 DDR数据
    5. 系统AI CPU和Control CPU利用率
      图13 Sys Cpu Usage数据

      图中展示信息说明如下:

      • User:用户态进程执行时长占比。
      • Sys:内核态进程执行时长占比。
      • IoWait:IO等待状态时长占比。
      • Irq:硬件中断时长占比。
      • Soft:软中断时长占比。
      • Idle:空闲状态时长占比。
    6. Process CPU Usage数据
      图14 Process Cpu Usage(Top50)
    7. System Memory Summary数据
      图15 System Memory Summary数据

      图中展示信息说明如下:

      • Memory Total:总内存。
      • Memory Free:空闲内存。
      • Buffers:内存缓冲大小。
      • Cached:高速缓冲存储器使用大小。
      • Share Memory:共享内存。
      • Commit Limit:虚拟内存限值。
      • Committed AS:系统已经分配的内存。
      • Huge Pages Total:分配的Huge Pages内存页面数目。
      • Huge Pages Free:剩余的Huge Pages内存页面数目。
    8. Process Memory Info
      图16 Process Memory Info(Top50)
分享:

    相关文档

    相关产品

关闭导读