Qualcomm® AI Engine Direct 使用手册(28)

150 篇文章 13 订阅
50 篇文章 2 订阅


9 标杆管理

9.1 概述

Qualcomm® AI Engine Direct SDK 中提供的基准测试由一组 Python 脚本组成,这些脚本在目标设备上运行网络并收集性能指标。它使用 SDK 包中的可执行文件和库在目标上运行已编译的 model.so 文件,使用一组网络输入以及指向该组输入的文件。

基准测试脚本的输入是 JSON 格式的配置文件。SDK 附带一个用于运行 InceptionV3 模型的配置文件,该文件是按照 SDK 文档中的说明创建的。鼓励 SDK 用户创建自己的配置文件并使用基准脚本在目标设备上运行以收集时序测量结果。

  • 配置文件允许用户指定:

  • 基准测试的名称(即 InceptionV3)

  • 用于存储结果的主机路径

  • 要使用的设备路径(将运行基准测试所需的文件推送到的位置)

  • 运行基准测试的设备(每次运行仅支持一台设备)

  • 设备连接到的远程计算机的主机名/IP

  • 重复运行的次数

  • 模型细节(名称、model.so 的位置、输入的位置)

  • 要使用的 QNN 后端配置(CPU、GPU 和 DSP 的组合)

  • 采取哪些测量(“时机”)

  • 测量的分析级别(“基本”或“详细”)

9.2 命令行参数

要查看所有命令行参数,请在运行时使用“-h”选项qnn_bench.py。

usage: qnn_bench.py [-h] -c CONFIG_FILE [-o OUTPUT_BASE_DIR_OVERRIDE]
                    [-v DEVICE_ID_OVERRIDE] [-r HOST_NAME]
                    [-t DEVICE_OS_TYPE_OVERRIDE] [-d] [-s SLEEP]
                    [-n ITERATIONS] [-p PERFPROFILE]
                    [--backend_config BACKEND_CONFIG] [-l PROFILINGLEVEL]
                    [-json] [-be BACKEND [BACKEND ...]] [--htp_serialized]
                    [--dsp_type {v65,v66,v68,v69,v73,v75}]
                    [--arm_prepare] [--use_signed_skel] [--discard_output]
                    [--test_duration TEST_DURATION] [--enable_cache]
                    [--shared_buffer] [--clean_artifacts] [--cdsp_id {0,1}]

Run the qnn_bench

required arguments:
  -c CONFIG_FILE, --config_file CONFIG_FILE
                        Path to a valid config file
                        Refer to sample config file config_help.json present at <SDK_ROOT>/benchmarks/QNN/
                        to know details on how to fill parameters in config file

optional arguments:
  -o OUTPUT_BASE_DIR_OVERRIDE, --output_base_dir_override OUTPUT_BASE_DIR_OVERRIDE
                        Sets the output base directory.
  -v DEVICE_ID_OVERRIDE, --device_id_override DEVICE_ID_OVERRIDE
                        Use this device ID instead of the one supplied in config file.
  -r HOST_NAME, --host_name HOST_NAME
                        Hostname/IP of remote machine to which devices are connected.
  -t DEVICE_OS_TYPE_OVERRIDE, --device_os_type_override DEVICE_OS_TYPE_OVERRIDE
                        Specify the target OS type, valid options are
                        ['aarch64-android', 'aarch64-windows-msvc', 'aarch64-qnx',
                        'aarch64-oe-linux-gcc9.3', 'aarch64-oe-linux-gcc8.2', 'aarch64-ubuntu-gcc7.5']
  -d, --debug           Set to turn on debug log
  -s SLEEP, --sleep SLEEP
                        Set number of seconds to sleep between runs e.g. 20 seconds
  -n ITERATIONS, --iterations ITERATIONS
                        Set the number of iterations to execute for calculating metrics
  -p PERFPROFILE, --perfprofile PERFPROFILE
                        Specify the perf profile to set. Valid settings are
                        low_balanced, balanced, default, high_performance,
                        sustained_high_performance, burst, low_power_saver,
                        power_saver, high_power_saver, system_settings
  --backend_config BACKEND_CONFIG
                        config file to specify context priority or provide backend extensions related parameters or enable htp specific linting profile
  -l PROFILINGLEVEL, --profilinglevel PROFILINGLEVEL
                        Set the profiling level mode (basic, detailed, backend). Default is basic.
  -json, --generate_json
                        Set to produce json output.
  -be BACKEND [BACKEND ...], --backend BACKEND [BACKEND ...]
                        The backend to use
  --htp_serialized      qnn graph prepare is done on x86 and execute is run on target
  --dsp_type {v65,v66,v68,v69,v73,v75}
                        Specify DSP variant for QNN BM run
  --arm_prepare         qnn graph prepare is done on ARM and execute is run on target
  --use_signed_skel     use signed skels for HTP runs
  --discard_output      To discard writing output tensors after test execution.
  --test_duration TEST_DURATION
                        Specify duration for test execution in seconds
                        Loops over the input_list until this amount of time has transpired
  --enable_cache        To prepare graph on device first using qnn-context-binary-generator and
                         and then execute graph using qnn-net-run to accelerate the execution. Defaults to disable.
  --shared_buffer       Enables usage of shared buffer between application and backend for graph I/O
  --clean_artifacts     Clean the model specific artifacts after inference
  --cdsp_id {0,1}       To specify cdsp core to use when a SOC has multiple cdsp cores. By Default is 0.

9.3 运行基准测试

先决条件

  • QNN SDK 已按照设置章节进行设置。

  • 使用 QNN 转换和执行 CNN 模型的“教程设置”和“模型转换和构建”部分

  • 可选:如果设备连接到远程计算机,则远程 adb 服务器设置需要由用户完成。

运行 SDK 附带的 InceptionV3

# Running inceptionV3_sample.json (CPU backend)
cd $QNN_SDK_ROOT/benchmarks/QNN
python3.6 qnn_bench.py -c inceptionV3_sample.json

# Running inceptionV3_quantized_sample.json (HTP backend by generating context binary on X86)
cd $QNN_SDK_ROOT/benchmarks/QNN
python3.6 qnn_bench.py -c inceptionV3_quantized_sample.json --dsp_type v68 --htp_serialized

查看结果(csv 文件或 json 文件)
所有结果都存储在配置 json 文件中指定的“HostResultDir”中。基准测试为每次基准测试运行创建带时间戳的目录。所有计时结果均以微秒为单位存储。

为了方便起见,latest_results创建了一个始终指向最近运行的链接。

# In inceptionV3_sample.json, "HostResultDir" is set to "inception_v3.repo/results"
cd $QNN_SDK_ROOT/benchmarks/QNN/inception_v3.repo/results
# Notice the time stamped directories and the "latest_results" link.
cd $QNN_SDK_ROOT/benchmarks/QNN/inception_v3.repo/results/latest_results
# Notice the .csv file, open this file in a csv viewer (Excel, LibreOffice Calc)
# Notice the .json file, open the file with any text editor

CSV 基准结果文件
CSV 文件包含类似于以下示例的结果。某些测量值在 CSV 文件中可能不明显。要获取所有计时信息,需要将分析级别设置为详细。默认情况下,分析级别是基本的。

笔记
为了清晰起见,添加了彩色标题。

请添加图片描述
第 1 部分:执行信息
本节包含以下信息:

  • 用于生成基准运行的 SDK 版本

  • 模型名称和编译模型文件的路径

  • 为基准选择的后端

  • ETC。

第 2 部分:绩效指标
本节包含有关模型初始化和执行的测量。分析级别影响收集的测量值的数量。

  • Init Stats [NetRun] 测量构建和配置 QNN 所需的时间。

  • Finalize Stats [NetRun] 测量 QNN 完成图形所花费的时间。

  • De-Init Stats [NetRun] 测量取消初始化 QNN 所需的时间。

  • 总推理时间 [NetRun] 测量一次推理过程的整个执行时间。这包括任何输入和输出处理、数据复制等。这是在执行调用的开始和结束时测量的。

第 3 部分:每层详细性能统计数据
本节包含神经网络模型每一层的执行统计信息。

笔记
仅当分析级别设置为详细时,才会显示此信息。

JSON 基准结果文件
以 CSV 文件形式发布的基准测试结果也可以以 JSON 格式提供。内容与 CSV 文件中的内容相同,结构为键值对,有助于以简单高效的方式解析结果。JSON 文件包含类似于以下示例的结果。

请添加图片描述
第 4 部分:Linting 配置文件统计信息
Linting 分析模式是 HTP 独有的配置,提供主线程上的每个操作周期计数以及后台执行信息。有关详细信息,请参阅此处的QNN HTP 分析。

9.4 使用您自己的网络和输入运行基准测试

准备输入
在运行基准测试之前,需要准备一组输入:

  • 你的模型.so。有关 model.so 创建工作流程,请参阅QNN 集成工作流程。

  • 列出所有输入数据的文本文件。有关示例,请参阅:$QNN_SDK_ROOT/examples/Models/InceptionV3/data/target_raw_list.txt

  • 上述文本文件中列出的所有输入数据。有关示例,请参阅目录$QNN_SDK_ROOT/examples/Models/InceptionV3/data/cropped。

笔记
target_raw_list.txt必须与输入目录的结构完全匹配。

9.5 创建运行配置

配置结构
配置文件是具有预定义结构的 JSON 文件。请参考$QNN_SDK_ROOT/benchmarks/QNN/inceptionV3_sample.json示例。

各个领域都需要。

  • Name : 该配置的名称,例如 InceptionV3

  • HostRootPath:主机上的顶级输出文件夹。它可以是当前工作目录的绝对路径或相对路径。

  • HostResultDir:主机上放置所有基准测试结果的文件夹。它可以是当前工作目录的绝对路径或相对路径。

  • DevicePath:设备上放置所有基准相关数据和工件的文件夹,例如 /data/local/tmp/qnnbm.repo

  • 设备:运行基准测试的设备的序列号。目前仅支持一台设备。

  • 运行次数:每个“后端”和“测量”运行组合的基准测试运行次数

  • 模型:

    • Name : DNN模型的名称,例如InceptionV3

    • qnn_model:编译后的 model.so 文件在主机上所在的文件夹。它可以是当前工作目录的绝对路径或相对路径。

    • InputList:列出所有输入数据的文本文件路径。它可以是当前工作目录的绝对路径或相对路径。

    • Data:InputList 文件中列出的数据文件或文件夹的列表。它可以是当前工作目录的绝对路径或相对路径。如果路径是文件夹,则该文件夹的所有内容将被推送到设备。

    后端:可能的值为“GPU”、“DSP”和“CPU”。您可以使用这些的任意组合。

  • 测量:可能的值为“计时”。每次运行都会单独测量测量类型。

可选字段:

  • HostName:设备连接到的远程计算机的主机名/IP。默认值为“本地主机”。

  • PerfProfile:要启用的性能模式。默认为“高性能”。

  • ProfilingLevel:要启用的分析级别。默认为“基本”。

架构支持

支持 Android AARCH 64 位。

后端和测量连接起来形成完整的运行组合名称,例如,
“GPU_timing”:GPU后端,时序测量

9.6 运行基准测试

cd $QNN_SDK_ROOT/benchmarks/QNN
python3.6 qnn_bench.py -c yourmodel.json

基准测试将对主机文件(在 JSON 配置中指定的文件)和设备文件执行 md5sum。由于 md5sum 检查,基准测试运行所需的文件必须在主机上可用。

对于主机和设备上都存在且 md5 不匹配的任何文件,基准测试会将文件从主机复制到目标,并发出警告消息,让您知道本地文件与设备文件不匹配。这样做是为了确保您从基准运行中获得的结果准确反映 JSON 文件中指定的文件。

其他选项

-v选项
允许您覆盖配置文件中指定的设备ID,以便相同的配置文件
可以跨多个设备使用。
-o 选项
仅当为 HostRootPath 指定相对路径时,结果输出基目录覆盖才适用
和 HostResultsDir。无论您从何处运行基准测试,它都允许您汇集输出。
-t 选项
操作系统类型覆盖当前支持 Android aarch64 (arm64-v8a) 设备。
-n选项
允许您指定重复运行的次数以计算性能指标。
-p 选项
允许您分析不同操作模式下的性能。
-l 选项
允许您指定性能分析的级别。
-json 选项
允许您生成 JSON 格式和默认 CSV 格式的结果。
-be 选项
允许您设置要使用的后端。
–dsp_type 选项
允许您提及设备的 dsp_type。
–htp_serialized 选项
允许您在 x86 上使用 HTP 模拟器准备图形并在目标上执行。
–shared_buffer 选项
指定将共享缓冲区用于应用程序和设备/协处理器之间的零复制用例
与后端相关
–arm_prepare 选项
允许您在手臂上准备图表并在目标上执行。
–backend_config 选项
允许您指定上下文优先级或提供后端扩展相关参数或 htp 特定的 linting 配置文件
阅读结果
打开文件夹中的结果(CSV 文件或 JSON 文件)/latest_results进行查看
你的结果。(是您在 json 配置文件中指定的内容。)

9.7 测量方法

在所有情况下,qnn-net-run可执行文件用于加载模型并通过模型运行输入。

性能(“时间”)
时序测量是使用 QNN 库内的内部时序实用程序进行的。执行时qnn-net-run,库会将计时信息记录到文件中。然后离线解析该文件以检索总推理时间和每层时间。

总推理时间包括每层计算时间加上开销(例如层之间的数据移动以及进出后端),而每层时间严格是每层的计算时间。对于较小的网络,相对于计算时间而言,开销可能相当大,特别是在将网络卸载到 GPU 或 DSP 上运行时。

此外,在神经元 conv-神经元或 fc-神经元对的情况下,GPU/DSP 上的进一步优化可能会导致层时间被错误归因。当在 GPU 上执行时,这些对的总时间将被分配给卷积神经元,而对于 DSP,它们将被分配给神经元。

笔记
详细的和 Linting 分析会造成性能影响。

基准依赖关系
基准测试脚本所依赖的二进制文件位于以下配置文件中,具体取决于目标架构、编译器和 STL 库:

  • 安卓64位

    • 铿锵-libc++:bm_utils/qnnbm_artifacts_android_aarch64.json
  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值