骁龙神经处理引擎SDK参考指南(29)
7 基准测试和准确性
7.1 基准测试概述(标杆管理)
概述
SNPE SDK 中提供的基准测试由一组 Python 脚本组成,这些脚本在目标 Android/LinuxEmbedded 设备上运行网络并收集性能指标。它使用 SDK 包中的可执行文件和库在目标上运行 DLC 文件,使用一组网络输入以及指向该组输入的文件。
基准测试脚本的输入是 JSON 格式的配置文件。SDK 附带一个配置文件,用于运行在 SNPE SDK 中创建的 AlexNet 模型。鼓励 SDK 用户创建自己的配置文件并使用基准脚本在目标上运行以收集时序和内存消耗测量结果。
配置文件允许用户指定:
- 基准测试的名称(即 AlexNet)
- 用于存储结果的主机路径
- 要使用的设备路径(将运行基准测试所需的文件推送到的位置)
- 运行基准测试的设备(每次运行仅支持一台设备)
- 设备连接到的远程计算机的主机名/IP
- 重复运行的次数
- 型号详情(名称、dlc 位置、输入位置)
- 要使用的 SNPE 运行时配置(CPU、GPU、GPU_FP16 和 DSP 的组合)
- 采取哪些测量(“mem”和/或“timing”)
- 测量的分析级别(“关闭”、“基本”、“中等”或“详细”)
命令行参数
要查看所有命令行参数,请在运行 snpe_bench.py 时使用“-h”选项
usage: snpe_bench.py [-h] -c CONFIG_FILE [-o OUTPUT_BASE_DIR_OVERRIDE]
[-v DEVICE_ID_OVERRIDE] [-r HOST_NAME] [-a]
[-t DEVICE_OS_TYPE_OVERRIDE] [-d] [-s SLEEP]
[-b USERBUFFER_MODE] [-p PERFPROFILE] [-l PROFILINGLEVEL]
[-json] [-cache]
Run the snpe_bench
required arguments:
-c CONFIG_FILE, --config_file CONFIG_FILE
Path to a valid config file
Refer to sample config file config_help.json for more
detail on how to fill params 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. Cannot be used with -a
-r HOST_NAME, --host_name HOST_NAME
Hostname/IP of remote machine to which devices are
connected.
-a, --run_on_all_connected_devices_override
Runs on all connected devices, currently only support 1.
Cannot be used with -v
-t DEVICE_OS_TYPE_OVERRIDE, --device_os_type_override DEVICE_OS_TYPE_OVERRIDE
Specify the target OS type, valid options are
['android', 'android-aarch64',
'le_oe_gcc8.2', 'le64_oe_gcc8.2']
-d, --debug Set to turn on debug log
-s SLEEP, --sleep SLEEP
Set number of seconds to sleep between runs e.g. 20
seconds
-b USERBUFFER_MODE, --userbuffer_mode USERBUFFER_MODE
[EXPERIMENTAL] Enable user buffer mode, default to
float, can be tf8exact0
-p PERFPROFILE, --perfprofile PERFPROFILE
Set the benchmark operating mode (balanced, default,
sustained_high_performance, high_performance,
power_saver, system_settings)
-l PROFILINGLEVEL, --profilinglevel PROFILINGLEVEL
Set the profiling level mode (off, basic, moderate, detailed).
Default is basic.
-json, --generate_json
Set to produce json output.
-cache, --enable_init_cache
Enable init caching mode to accelerate the network
building process. Defaults to disable.
运行基准测试
先决条件
- SNPE SDK 已按照SNPE 设置章节 进行设置。
- 教程设置已完成。
- 可选:如果设备连接到远程计算机,则远程 adb 服务器设置需要由用户完成。
运行 SDK 附带的 AlexNet
snpe_bench.py 是用于测量和报告性能统计数据的主要基准测试脚本。以下是如何将其与 AlexNet 模型和 SDK 中创建的数据一起使用。
cd $SNPE_ROOT/benchmarks
python3 snpe_bench.py -c alexnet_sample.json -a
where
-a benchmarks on the device connected
查看结果(csv 文件或 json 文件)
所有结果都存储在配置 json 文件中指定的“HostResultDir”中。基准测试为每次基准测试运行创建带时间戳的目录。所有计时结果均以微秒为单位存储。
为了您的方便,将创建一个“latest_results”链接,该链接始终指向最近的运行。
# In alexnet_sample.json, "HostResultDir" is set to "alexnet/results"
cd $SNPE_ROOT/benchmarks/alexnet/results
# Notice the time stamped directories and the "latest_results" link.
cd $SNPE_ROOT/benchmarks/alexnet/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 文件中可能不明显。要获取所有计时信息,需要将分析级别设置为详细。默认情况下,分析级别是基本的。请注意,为了清晰起见,添加了彩色标题。
CSV 1:配置
本节包含以下信息:
- 用于生成基准运行的 SDK 版本
- 型号名称和 DLC 文件路径
- 为基准测试选择的运行时
- ETC。
CSV 2:初始化指标
本节包含有关模型初始化的测量。分析级别影响收集的测量值的数量。不会收集用于分析的指标。基本和详细指标如下所示。
分析级别:基本
- 加载测量加载模型元数据所需的时间。
- 反序列化测量反序列化模型缓冲区所需的时间。
- 创建测量创建 SNPE 网络和初始化给定模型的所有层所花费的时间。可以通过将分析级别设置为详细来检索创建时间的详细细分。
- Init 测量构建和配置 SNPE 所需的时间。该时间包括测量的加载、反序列化和创建的时间。
- De-Init 测量去初始化 SNPE 所需的时间。
分析级别:中等或详细
- 加载测量加载模型元数据所需的时间。
- 反序列化测量反序列化模型缓冲区所需的时间。
- 创建测量创建 SNPE 网络和初始化给定模型的所有层所花费的时间。可以通过将分析级别设置为详细来检索创建时间的详细细分。
- Init 测量构建和配置 SNPE 所需的时间。该时间包括测量的加载、反序列化和创建的时间。
- De-Init 测量去初始化 SNPE 所需的时间。
- 创建网络测量为模型创建所有网络所需的总时间。分区的模型将导致创建多个网络。
- RPC Init Time 测量 SNPE 使用的 RPC 和加速器所花费的全部时间。该时间包括 Snpe Accelerator Init Time 和 Accelerator Init Time 中测量的时间。目前仅适用于 DSP 和 AIP 运行时。对于其他运行时将显示为 0。
- Snpe Accelerator Init Time 测量 SNPE 为 GPU、DSP、AIP 等加速器进程准备数据所花费的总时间。目前仅适用于 DSP 和 AIP 运行时。对于其他运行时将显示为 0。
- 加速器初始化时间测量加速器核心上花费的总处理时间,其中可能包括不同的硬件资源。目前仅适用于 DSP 和 AIP 运行时。对于其他运行时将显示为 0。
CSV 3:执行指标
本节包含有关执行神经网络模型的一次推理过程的测量。分析级别影响收集的测量值的数量。
分析级别:基本
- 总推理时间衡量一次推理过程的整个执行时间。这包括任何输入和输出处理、数据复制等。这是在执行调用的开始和结束时测量的。
分析级别:中等或详细
- 总推理时间衡量一次推理过程的整个执行时间。这包括任何输入和输出处理、数据复制等。这是在执行调用的开始和结束时测量的。
- 前向传播测量执行一次推理过程所花费的时间,不包括加速器核心之一上的处理开销。例如,对于 GPU,这表示在 GPU 硬件上运行的所有 GPU 内核的执行时间。
- RPC 执行测量 SNPE 使用的 RPC 和加速器所花费的全部时间。该时间包括在 Snpe Accelerator 和 Accelerator 中测量的时间。目前仅适用于 DSP 和 AIP 运行时。对于其他运行时将显示为 0。
- Snpe Accelerator 测量 SNPE 设置加速器处理所花费的总时间。目前仅适用于 DSP 和 AIP 运行时。对于其他运行时将显示为 0。
- 加速器测量加速器核心上花费的总执行时间,其中可能包括不同的硬件资源。目前仅适用于 DSP 和 AIP 运行时。对于其他运行时将显示为 0。
分析级别:详细
- Misc Accelerator 测量 SNPE 未指定的优化元素在加速器核心上花费的总执行时间。例如,对于 DSP,这表示加速器为实现最佳性能而添加的附加层所花费的执行时间。目前仅适用于 DSP 和 AIP 运行时。对于其他运行时将显示为 0。
CSV 4:模型层名称
本节包含神经网络模型每一层的名称列表。
请注意,只有当分析级别设置为详细时,此信息才会出现在 DSP/GPU 运行时。
CSV 5:模型层时间
本节中的每一行代表神经网络模型每一层的执行时间。对于每个运行时间,均表示平均值、最小值和最大值。请注意,与每一层相对应的值指的是周期计数,而所有其他组件(如 init、ForwardPropagate)的值均以微秒为单位。
请注意,只有当分析级别设置为详细时,此信息才会出现在 DSP/GPU 运行时。
有关数字的更多背景信息,请参阅测量方法测量方法。
JSON 基准结果文件
以 CSV 文件形式发布的基准测试结果也可以以 JSON 格式提供。内容与 CSV 文件中的内容相同,结构为键值对,有助于以简单高效的方式解析结果。JSON 文件包含类似于以下示例的结果。
使用您自己的网络和输入运行基准测试
准备输入
在运行基准测试之前,需要准备一组输入:
- your_model.dlc
- 列出所有输入数据的文本文件。有关示例,请参阅:$SNPE_ROOT/models/alexnet/data/image_list.txt
- 上述文本文件中列出的所有输入数据。有关示例,请参阅目录 $SNPE_ROOT/models/alexnet/data/cropped
- 注意:image_list.txt 必须与输入目录的结构完全匹配。
- 有关准备输入的更多信息,请参阅:输入图像
创建运行配置
配置结构
配置文件是具有预定义结构的 JSON 文件。请参阅 $SNPE_ROOT/benchmarks/alexnet_sample.json 作为示例。
各个领域都需要。
- 名称:该配置的名称,例如AlexNet
- HostRootPath:主机上的顶级输出文件夹。它可以是当前工作目录的绝对路径或相对路径。
- HostResultDir:主机上放置所有基准测试结果的文件夹。它可以是当前工作目录的绝对路径或相对路径。
- DevicePath:设备上放置所有基准相关数据和工件的文件夹,例如 /data/local/tmp/snpebm
- 设备:运行基准测试的设备的序列号。目前仅支持一台设备。
- 运行次数:针对每个“运行时”和“测量”运行组合运行基准测试的次数
- 模型:
- Name: DNN模型的名称,例如alexnet
- Dlc:模型dlc文件在主机上所在的文件夹。它可以是当前工作目录的绝对路径或相对路径。
- 输入列表:列出所有输入数据的文本文件路径。它可以是当前工作目录的绝对路径或相对路径。
- 数据: InputList 文件中列出的数据文件或文件夹的列表。它可以是当前工作目录的绝对路径或相对路径。如果路径是文件夹,则该文件夹的所有内容将被推送到设备。
- 运行时:可能的值为“GPU”、“GPU_FP16”、“DSP”和“CPU”。您可以使用这些的任意组合。
- 测量:可能的值为“timing”和“mem”。您可以设置其中一个或两个值。每次运行都会单独测量每种测量类型。
可选字段:
- CpuFallback:可能的值为 true 和 false。指示当某个层在运行时不可用时网络是否可以回退到 CPU。默认值为 false。
- 主机名:设备连接到的远程计算机的主机名/IP。默认值为“本地主机”。
- BufferTypes:用户缓冲区类型列表。可能的值为“”(空字符串)或“ub_float”和“ub_tf8”的任意组合。如果给出“”,它- 将在 RunTimes 字段中给出的所有运行时执行。如果给出任何 userbuffer 选项,它将针对运行时中的所有运行时以及给定的 userbuffer 变体执行。如果此字段不存在,则在所有可能的运行时执行(默认情况)。
架构支持
Android ARM 32 位和 AARCH 64 位均受支持。除了Android之外,对LinuxEmbedded的支持也很有限,仅支持时序测量。
运行时间和测量连接起来形成完整的运行组合名称,例如,
- “GPU_timing”:GPU运行时间,时序测量
- “CPU_mem”:CPU运行时间、内存测量
请注意,对于每个指定的运行时,都有多组时序测量,仅张量格式不同(使用 ITensors和使用用户缓冲区)。例如,对于 DSP 运行时,进行以下时序测量:
- “DSP_timing”:使用 ITensors 对 DSP 运行时进行时序测量
- “DSP_ub_tf8_timing”:使用带有 TF8 编码的 UserBuffer 对 DSP 运行时进行时序测量
- “DSP_ub_float_timing”:使用带有浮点编码的 UserBuffer 对 DSP 运行时进行时序测量
运行基准测试
运行基准测试的最简单方法是指定 -a 选项,该选项将在连接到计算机的单独设备上运行基准测试。
cd $SNPE_ROOT/benchmarks
python3 snpe_bench.py -c yourmodel.json -a
基准测试将对主机文件(在 JSON 配置中指定的文件)和设备文件执行 md5sum。由于 md5sum 检查,基准测试运行所需的文件必须在主机上可用。
对于主机和设备上都存在且 md5 不匹配的任何文件,基准测试会将文件从主机复制到目标,并发出警告消息,让您知道本地文件与设备文件不匹配。这样做是为了确保您从基准运行中获得的结果准确反映 JSON 文件中指定的文件。
其他选项
-v 选项
允许您覆盖配置文件中指定的设备 ID,以便可以在多个设备上使用相同的配置文件。如果您连接了多个设备,则可以使用此选项代替 -a。
-o 选项
仅当为 HostRootPath 和 HostResultsDir 指定相对路径时,结果输出基目录覆盖才适用。无论您从何处运行基准测试,它都允许您汇集输出。
-t 选项
操作系统类型覆盖当前支持 Android arm (armeabi-v7a)、Android aarch64 (arm64-v8a) 和 LinuxEmbedded 设备。
-b 选项
允许您指定输入和输出用户缓冲区的类型。
-p 选项
允许您分析不同操作模式下的性能。
-l 选项
允许您指定性能分析的级别。
阅读结果
打开 /latest_results 文件夹中的结果(CSV 文件或 JSON 文件)以查看结果。( 是您在 json 配置文件中指定的内容。)
测量方法
在所有情况下,snpe-net-run 可执行文件用于加载模型并通过模型运行输入。
性能(“时间”)
时序测量是使用 SNPE 库内的内部时序实用程序进行的。执行 snpe-net-run 时,库会将计时信息记录到文件中。然后离线解析该文件以检索总推理时间和每层时间。
总推理时间包括每层计算时间加上开销(例如层之间的数据移动以及进出运行时),而每层时间严格是每层的计算时间。对于较小的网络,相对于计算时间而言,开销可能相当大,特别是在将网络卸载到 GPU 或 DSP 上运行时。
此外,在神经元 conv-神经元或 fc-神经元对的情况下,GPU/DSP 上的进一步优化可能会导致层时间被错误归因。当在 GPU 上执行时,这些对的总时间将被分配给卷积神经元,而对于 DSP,它们将被分配给神经元。
基准依赖关系
基准测试脚本所依赖的二进制文件位于以下配置文件中,具体取决于目标架构、编译器和 STL 库:
- 安卓32位
- clang - libc++:snpebm/snpebm_artifacts.json - 安卓64位
- clang - libc++:snpebm/snpebm_artifacts_android_aarch64.json - Linux嵌入式:snpebm/snpebm_artifacts_le.json
7.2 Mobilenet SSD 基准测试
SNPE SDK支持Tensorflow版本和Caffe版本的MobilenetSSD模型。有关更多详细信息,请参阅使用 MobilenetSSD 。
对 Mobilenet SSD 进行基准测试需要对基准 JSON 配置文件和数据输入列表进行一些添加。
按照基准测试概述来熟悉基准测试工具。
本教程假设以下示例文件是在以下位置创建的:
- /tmp/mobilenetssd.dlc - 转换后的神经网络模型文件
- /tmp/mobilenetssd.json - 基准配置文件
- /tmp/imagelist.txt - 原始图像路径列表(每行一个)
- /tmp/images - 包含上面 imagelist.txt 中指定的图像的目录
Mobilenet SSD 基准测试配置文件包含基准测试概述中定义的相同条目以及一个附加参数。创建或编辑 /tmp/mobilenetssd.json 文件并添加一行以指示使用CpuFallback选项。需要此选项才能使 Mobilenet SSD 基准测试正确执行。
JSON 文件应类似于以下内容:
{
"Name":"mobilenet_ssd",
"HostRootPath": "mobilenet_ssd",
"HostResultsDir":"mobilenet_ssd/results",
"DevicePath":"/data/local/tmp/snpebm",
"Devices":["454d40f3"],
"Runs":2,
"Model": {
"Name": "mobilenet_ssd",
"Dlc": "/tmp/mobilenet_ssd.dlc",
"InputList": "/tmp/imagelist.txt",
"Data": [
"/tmp/images"
]
},
"Runtimes":["GPU"],
"Measurements": ["timing"],
"CpuFallback": true,
"BufferTypes": ["ub_float","ub_tf8"],
"ProfilingLevel": "detailed"
}
Tensorflow Mobilenet SSD 模型
Tensorflow Mobilenet SSD 具有多个输出层。为了准确表示基准运行中的输出,需要将附加输出指定为 的一部分/tmp/imagelist.txt。
模型的输出层是:
- Postprocessor/BatchMultiClassNonMaxSuppression
- add_6
在图像列表文件 ( /tmp/imagelist.txt) 的第一行添加输出图层名称,以“#”开头,并用空格分隔每个图层名称。例如,
#Postprocessor/BatchMultiClassNonMaxSuppression add_6
tmp/0#.rawtensor
tmp/1#.rawtensorr
注意: 如果重新训练模型并且输出层发生变化,则必须更新 imagelist.txt 中的第一行以反映这些更改。
Caffe Mobilenet SSD 模型
Caffe Mobilenet SSD 通常有一个输出层(例如detection_out)。在具有多个输出层的情况下,为了准确表示基准运行中的输出,需要将附加输出指定为 的一部分/tmp/imagelist.txt。
在图像列表文件 ( /tmp/imagelist.txt) 的第一行添加输出图层名称,以“#”开头,并用空格分隔每个图层名称。例如,
#a/detection_out b/detection_out
tmp/0#.rawtensor
tmp/1#.rawtensor
运行基准测试
通过以下方式运行基准测试
python3 snpe_bench.py -c /tmp/mobilenetssd.json -a
查看结果(csv 文件或 json 文件)
所有结果都存储在配置 json 文件中指定的“HostResultDir”中。基准测试为每次基准测试运行创建带时间戳的目录。所有计时结果均以微秒为单位存储。
为了您的方便,将创建一个“latest_results”链接,该链接始终指向最近的运行。
# In mobilenetssd.json, "HostResultDir" is set to "mobilenet_ssd/results"
cd $SNPE_ROOT/benchmarks/mobilenet_ssd/results
# Notice the time stamped directories and the "latest_results" link.
cd $SNPE_ROOT/benchmarks/mobilenet_ssd/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 文件中。要获取所有计时信息,需要将分析级别设置为Detailed。默认情况下,分析级别是基本的。请注意,为了清晰起见,添加了彩色标题。
CSV 结果文件的更详细描述可以在基准概述中找到。
比较总推理时间和前向传播行,我们发现 GPU 和 DSP 推理时间比 CPU 快约17~39 倍。使用 GPU 和 DSP 进行 MobilenetSSD 推理可能会获得更高的性能。
JSON 基准测试结果文件
以 CSV 文件发布的基准测试结果也可以以 JSON 格式提供。通过运行基准测试
python snpe_bench.py -c /tmp/mobilenetssd.json -a --generate_json
内容与 CSV 文件中的内容相同,结构为键值对,有助于以简单高效的方式解析结果。JSON 文件包含类似于以下示例的结果。