基准测试工具
LiteRT 基准工具目前可测量并计算 下面列出了几项重要的效果指标
- 初始化时间
- 推断预热状态的时间
- 推断稳定状态的时间
- 初始化期间的内存用量
- 总体内存用量
这些基准工具可用作 Android 和 iOS 的基准应用 它们都具有相同的核心性能 衡量逻辑请注意,可用的选项和输出格式如下: 由于运行时环境的差异而略有不同
Android 基准应用
在 Android 中使用基准测试工具有两种方法。其中一个是 原生基准二进制文件,另一个是 Android 基准测试,以便更好地衡量模型在应用中的表现。两者之一 基准工具得出的数据仍与 在实际应用中使用模型进行推理。
此 Android 基准应用没有界面。使用 adb
安装并运行该脚本。
命令并使用 adb logcat
命令检索结果。
下载或构建应用
使用以下链接下载每晚预构建的 Android 基准应用:
对于支持 TF 操作的 Android 基准应用 通过 Flex 委托 请访问以下链接:
您还可以按照以下提示从源代码构建应用 说明。
准备基准
在运行基准应用之前,请安装该应用并将模型文件推送到 设备:
adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp
运行基准
adb shell am start -S \
-n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
--es args '"--graph=/data/local/tmp/your_model.tflite \
--num_threads=4"'
graph
是必需参数。
graph
:string
TFLite 模型文件的路径。
您可以指定更多可选参数来运行基准。
num_threads
:int
(默认值=1)
用于运行 TFLite 解释器的线程数。use_gpu
:bool
(默认值=false)
使用 GPU 代理。use_xnnpack
:bool
(默认值=false
)
使用 XNNPACK 委托。
根据您使用的设备,上述部分选项可能不适用 或没有任何作用。请参阅 参数 了解更多可搭配基准应用一起运行的性能参数。
使用 logcat
命令查看结果:
adb logcat | grep "Inference timings"
基准结果的报告方式如下:
... tflite : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2
原生基准二进制文件
基准测试工具也作为原生二进制文件 benchmark_model
提供。您可以
在 Linux、Mac、嵌入式设备和
Android 设备。
下载或构建二进制文件
按照 以下链接:
对于支持 TF 操作的每晚预构建二进制文件 通过 Flex 委托 请访问以下链接:
您还可以从命令行构建原生基准二进制文件,具体方法是: 来源 。
bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model
若要使用 Android NDK 工具链进行构建,您需要设置构建环境 首先,请关注此 指南,或使用 创建 Docker 映像 指南。
bazel build -c opt --config=android_arm64 \
//tensorflow/lite/tools/benchmark:benchmark_model
运行基准
如需在计算机上运行基准测试,请从 shell 执行二进制文件。
path/to/downloaded_or_built/benchmark_model \
--graph=your_model.tflite \
--num_threads=4
您可以使用同一组 参数 (如上所述)。
对模型操作进行性能分析
通过基准模型二进制文件,您还可以分析模型操作,并获取
每个运算符的执行时间。为此,请将
在调用期间将 --enable_op_profiling=true
设置为 benchmark_model
。详细信息为
解释
此处。
在一次运行中用于多个性能选项的原生基准测试二进制文件
还提供了一个方便、简单的 C++ 二进制文件
对多个性能选项进行基准测试
运行一次。此二进制文件基于上述基准工具构建
每次只能对一个效果选项进行基准化分析。他们与
相同的构建/安装/运行流程,但此二进制文件的 BUILD 目标名称是
benchmark_model_performance_options
,并且需要一些额外的参数。
此二进制文件的一个重要参数是:
perf_options_list
:string
(默认设置为“all”)
要基准化分析的 TFLite 性能选项的逗号分隔列表。
您可以为此工具获取每晚预构建的二进制文件,如下所示:
iOS 基准应用
若要在 iOS 设备上运行基准测试,您需要从
source。
将 LiteRT 模型文件
benchmark_data
然后修改 benchmark_params.json
文件。这些
文件会打包到应用中,并且应用会从目录中读取数据。请访问
iOS 基准应用
了解详细说明。
知名模型的性能基准
本部分列出了运行良好时的 LiteRT 性能基准 已知模型。
Android 性能基准
这些效果基准数据是使用 原生基准二进制文件。
对于 Android 基准测试,CPU 亲和性设置为使用设备上的大核心 以减少方差(请参阅 详细信息)。
它假定模型已下载并解压缩到
/data/local/tmp/tflite_models
目录中。基准二进制文件是使用
这些说明
并假定位于 /data/local/tmp
目录中。
如需运行基准,请执行以下操作:
adb shell /data/local/tmp/benchmark_model \
--num_threads=4 \
--graph=/data/local/tmp/tflite_models/${GRAPH} \
--warmup_runs=1 \
--num_runs=50
如需使用 GPU 代理运行,请设置 --use_gpu=true
。
以下性能值是在 Android 10 上衡量的。
模型名称 | 设备 | CPU,4 个线程 | GPU |
---|---|---|---|
Mobilenet_1.0_224(float) | Pixel 3 | 23.9 毫秒 | 6.45 毫秒 |
Pixel 4 | 14.0 毫秒 | 9.0 毫秒 | |
Mobilenet_1.0_224(定量) | Pixel 3 | 13.4 毫秒 | --- |
Pixel 4 | 5.0 毫秒 | --- | |
NASNet 移动版 | Pixel 3 | 56 毫秒 | --- |
Pixel 4 | 34.5 毫秒 | --- | |
SqueezeNet | Pixel 3 | 35.8 毫秒 | 9.5 毫秒 |
Pixel 4 | 23.9 毫秒 | 11.1 毫秒 | |
Inception_ResNet_V2 | Pixel 3 | 422 毫秒 | 99.8 毫秒 |
Pixel 4 | 272.6 毫秒 | 87.2 毫秒 | |
Inception_V4 | Pixel 3 | 486 毫秒 | 93 毫秒 |
Pixel 4 | 324.1 毫秒 | 97.6 毫秒 |
iOS 性能基准
这些效果基准数据是使用 iOS 基准应用。
为了运行 iOS 基准,我们修改了基准应用,在其中添加了适当的
模型,并且 benchmark_params.json
修改为将 num_threads
设置为 2。要使用
GPU 代理、"use_gpu" : "1"
和 "gpu_wait_type" : "aggressive"
选项
已添加到“benchmark_params.json
”中。
模型名称 | 设备 | CPU,2 个线程 | GPU |
---|---|---|---|
Mobilenet_1.0_224(float) | iPhone XS | 14.8 毫秒 | 3.4 毫秒 |
Mobilenet_1.0_224(定量) | iPhone XS | 11 毫秒 | --- |
NASNet 移动版 | iPhone XS | 30.4 毫秒 | --- |
SqueezeNet | iPhone XS | 21.1 毫秒 | 15.5 毫秒 |
Inception_ResNet_V2 | iPhone XS | 261.1 毫秒 | 45.7 毫秒 |
Inception_V4 | iPhone XS | 309 毫秒 | 54.4 毫秒 |
Trace LiteRT 内部配置
在 Android 中跟踪 LiteRT 内部
来自 Android 应用的 LiteRT 解释器的内部事件 拍摄者 Android 跟踪工具。 在 Android 中,事件是一样的 Trace API,因此 从 Java/Kotlin 代码捕获的事件会与 LiteRT 一起显示 内部事件
以下是一些事件示例:
- 运算符调用
- 委托对图的修改
- 张量分配
本指南介绍了用于捕获跟踪记录的不同选项, Studio CPU 性能分析器和 System Tracing 应用。请参阅 Perfetto 命令行工具 或 Systrace 命令行工具 了解其他选项。
在 Java 代码中添加跟踪事件
这是来自 Google Analytics 的
图片分类
示例应用。LiteRT 解释器在
recognizeImage/runInference
部分。这是可选步骤,但对于
帮助注意推理调用的位置。
Trace.beginSection("recognizeImage");
...
// Runs the inference call.
Trace.beginSection("runInference");
tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
Trace.endSection();
...
Trace.endSection();
启用 LiteRT 跟踪功能
如需启用 LiteRT 跟踪,请设置 Android 系统属性
将 debug.tflite.trace
设为 1,然后再启动 Android 应用。
adb shell setprop debug.tflite.trace 1
如果在初始化 LiteRT 解释器时设置了此属性, 将跟踪来自解释器的按键事件(例如操作员调用)。
捕获所有跟踪记录后,通过设置属性值来停用跟踪 设置为 0。
adb shell setprop debug.tflite.trace 0
Android Studio CPU 性能分析器
使用 Android Studio CPU 性能分析器 按照以下步骤操作:
选择 Run >Profile 'app'。
出现 Profiler 窗口时,点击 CPU 时间轴上的任意位置。
选择“跟踪系统调用”多种 CPU 性能分析模式
按“录制”按钮。
按“停止”按钮。
调查跟踪记录结果。
在此示例中,您可以看到线程中事件的层次结构和统计信息 还可以查看整个应用的数据流 线程。
“系统跟踪”应用
按照本文中详述的步骤,在不使用 Android Studio 的情况下捕获跟踪记录 System Tracing 应用。
在本示例中,捕获了相同的 TFLite 事件并将其保存到 Perfetto 或 Systrace 格式,具体取决于 Android 设备的版本。捕获的 跟踪文件可以在 Perfetto 界面中打开。
在 iOS 中跟踪 LiteRT 内部函数
来自 iOS 应用的 LiteRT 解释器的内部事件 拍摄者 乐器 工具。他们是 iOS signpost 事件,以便同时查看从 Swift/Objective-C 代码中捕获的事件 LiteRT 内部事件。
以下是一些事件示例:
- 运算符调用
- 委托对图的修改
- 张量分配
启用 LiteRT 跟踪功能
按照以下步骤设置环境变量 debug.tflite.trace
:
选择产品 >架构 >Edit Scheme...。
点击“个人资料”。
取消选择“使用运行操作的参数和环境变量” 复选框。
在“环境变量”下添加
debug.tflite.trace
部分。
如果您想在分析 iOS 应用时排除 LiteRT 事件, 通过移除环境变量来停用跟踪。
XCode 插桩
请按照以下步骤捕获轨迹:
选择产品 >Profile。
Instruments 工具启动时,点击分析模板中的 Logging。
按“开始”按钮。
按“停止”按钮。
点击“os_signpost”以展开 OS Logging 子系统项。
点击“org.tensorflow.lite”OS Logging 子系统。
调查跟踪记录结果。
在此示例中,您可以看到事件的层次结构和每个事件的统计信息 操作员的时间。
使用跟踪数据
通过跟踪数据,您可以识别性能瓶颈。
以下是一些您可以从性能分析器获取的数据洞见示例, 可能的解决方案:
- 如果可用 CPU 核心数小于推理数 那么 CPU 调度开销可能会导致性能不佳。 您可以重新调度应用中的其他 CPU 密集型任务,以避免 与模型推断重叠,或者调整解释器的数量 线程。
- 如果运算符未完全委托,则模型图的某些部分 在 CPU(而不是预期的硬件加速器)上执行。您 可以将不受支持的运算符替换为受支持的类似运算符。