性能衡量

基准测试工具

TensorFlow Lite 基准测试工具目前测量和计算以下重要性能指标的统计信息

  • 初始化时间
  • 预热状态下的推理时间
  • 稳定状态下的推理时间
  • 初始化时间期间的内存使用情况
  • 总内存使用情况

基准测试工具以 Android 和 iOS 的基准测试应用程序以及本机命令行二进制文件的形式提供,它们都共享相同的核心性能测量逻辑。请注意,由于运行时环境的差异,可用选项和输出格式略有不同。

Android 基准测试应用程序

使用 Android 基准测试工具有两种选择。一种是 本机基准测试二进制文件,另一种是 Android 基准测试应用程序,它可以更好地衡量模型在应用程序中的性能。无论哪种方式,基准测试工具中的数字与在实际应用程序中使用模型进行推理时的数字仍会略有不同。

此 Android 基准测试应用程序没有 UI。使用 adb 命令安装并运行它,并使用 adb logcat 命令检索结果。

下载或构建应用程序

使用以下链接下载夜间预构建的 Android 基准测试应用程序

至于支持 TF 运算符(通过 Flex 代理)的 Android 基准测试应用程序,请使用以下链接

您也可以按照以下 说明 从源代码构建应用程序。

准备基准测试

在运行基准测试应用程序之前,请安装应用程序并将模型文件推送到设备,如下所示

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_nnapi: bool (默认值=false)
    使用 NNAPI 代理
  • use_xnnpack: bool (默认值=false)
    使用 XNNPACK 代理
  • use_hexagon: bool (默认值=false)
    使用 Hexagon 代理

根据您使用的设备,某些选项可能不可用或无效。请参考 参数,了解您可以使用基准测试应用程序运行的更多性能参数。

使用 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 设备上的 shell 命令行中执行此工具。

下载或构建二进制文件

通过以下链接下载夜间预构建的原生命令行二进制文件

对于支持 TF 操作 的夜间预构建二进制文件(通过 Flex 代理),请使用以下链接

为了使用 TensorFlow Lite Hexagon 代理 进行基准测试,我们还预构建了所需的 libhexagon_interface.so 文件(有关此文件的详细信息,请参见 此处)。从以下链接下载相应平台的文件后,请将文件名重命名为 libhexagon_interface.so

您也可以从 源代码 在您的计算机上构建原生基准测试二进制文件。

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 设备上运行基准测试,您需要从 源代码 构建应用程序。将 TensorFlow Lite 模型文件放在源代码树的 benchmark_data 目录中,并修改 benchmark_params.json 文件。这些文件将打包到应用程序中,应用程序将从该目录读取数据。请访问 iOS 基准测试应用程序,获取详细说明。

知名模型的性能基准测试

本节列出了在某些 Android 和 iOS 设备上运行知名模型时 TensorFlow Lite 的性能基准测试。

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

要使用 nnapi 代理运行,请设置 --use_nnapi=true。要使用 GPU 代理运行,请设置 --use_gpu=true

以下性能值是在 Android 10 上测量的。

模型名称 设备 CPU,4 个线程 GPU NNAPI
Mobilenet_1.0_224(float) Pixel 3 23.9 毫秒 6.45 毫秒 13.8 毫秒
Pixel 4 14.0 毫秒 9.0 毫秒 14.8 毫秒
Mobilenet_1.0_224 (quant) Pixel 3 13.4 毫秒 --- 6.0 毫秒
Pixel 4 5.0 毫秒 --- 3.2 毫秒
NASNet mobile Pixel 3 56 毫秒 --- 102 毫秒
Pixel 4 34.5 毫秒 --- 99.0 毫秒
SqueezeNet Pixel 3 35.8 毫秒 9.5 毫秒 18.5 毫秒
Pixel 4 23.9 毫秒 11.1 毫秒 19.0 毫秒
Inception_ResNet_V2 Pixel 3 422 毫秒 99.8 毫秒 201 毫秒
Pixel 4 272.6 毫秒 87.2 毫秒 171.1 毫秒
Inception_V4 Pixel 3 486 毫秒 93 毫秒 292 毫秒
Pixel 4 324.1 毫秒 97.6 毫秒 186.9 毫秒

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 (quant) iPhone XS 11 毫秒 ---
NASNet mobile 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 毫秒

跟踪 TensorFlow Lite 内部

在 Android 中跟踪 TensorFlow Lite 内部

Android 应用程序的 TensorFlow Lite 解释器的内部事件可以通过 Android 跟踪工具 捕获。它们与 Android Trace API 中的事件相同,因此从 Java/Kotlin 代码捕获的事件将与 TensorFlow Lite 内部事件一起显示。

一些事件示例包括

  • 运算符调用
  • 代理修改的图形
  • 张量分配

在用于捕获跟踪的不同选项中,本指南涵盖了 Android Studio CPU 分析器和系统跟踪应用程序。有关其他选项,请参考 Perfetto 命令行工具Systrace 命令行工具

在 Java 代码中添加跟踪事件

这是来自 图像分类 示例应用程序的代码片段。TensorFlow Lite 解释器在 recognizeImage/runInference 部分运行。此步骤是可选的,但它有助于了解推理调用是在哪里进行的。

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

启用 TensorFlow Lite 跟踪

要启用 TensorFlow Lite 跟踪,请在启动 Android 应用程序之前将 Android 系统属性 debug.tflite.trace 设置为 1。

adb shell setprop debug.tflite.trace 1

如果在初始化 TensorFlow Lite 解释器时已设置此属性,则将跟踪来自解释器的关键事件(例如,运算符调用)。

捕获所有跟踪后,通过将属性值设置为 0 来禁用跟踪。

adb shell setprop debug.tflite.trace 0

Android Studio CPU 分析器

按照以下步骤使用 Android Studio CPU 分析器 捕获跟踪

  1. 从顶部菜单中选择 **运行 > 分析 'app'**。

  2. 当分析器窗口出现时,单击 CPU 时间线中的任意位置。

  3. 在 CPU 分析模式中选择 '跟踪系统调用'。

    Select 'Trace System Calls'

  4. 按 '记录' 按钮。

  5. 按 '停止' 按钮。

  6. 调查跟踪结果。

    Android Studio trace

在此示例中,您可以看到线程中事件的层次结构以及每个运算符时间的统计信息,还可以看到整个应用程序在线程之间的数据流。

系统跟踪应用程序

按照 系统跟踪应用程序 中详细介绍的步骤,在没有 Android Studio 的情况下捕获跟踪。

在此示例中,捕获了相同的 TFLite 事件,并根据 Android 设备的版本保存为 Perfetto 或 Systrace 格式。捕获的跟踪文件可以在 Perfetto UI 中打开。

Perfetto trace

在 iOS 中跟踪 TensorFlow Lite 内部

iOS 应用程序的 TensorFlow Lite 解释器的内部事件可以通过 Xcode 中包含的 Instruments 工具捕获。它们是 iOS signpost 事件,因此从 Swift/Objective-C 代码捕获的事件将与 TensorFlow Lite 内部事件一起显示。

一些事件示例包括

  • 运算符调用
  • 代理修改的图形
  • 张量分配

启用 TensorFlow Lite 跟踪

按照以下步骤设置环境变量 debug.tflite.trace

  1. 从 Xcode 顶部菜单中选择 **产品 > 方案 > 编辑方案...**。

  2. 在左侧窗格中单击 '分析'。

  3. 取消选中 '使用运行操作的参数和环境变量' 复选框。

  4. 在 '环境变量' 部分下添加 debug.tflite.trace

    Set environment variable

如果您想在分析 iOS 应用程序时排除 TensorFlow Lite 事件,请通过删除环境变量来禁用跟踪。

XCode Instruments

按照以下步骤捕获跟踪

  1. 从 Xcode 顶部菜单中选择 **产品 > 分析**。

  2. 当 Instruments 工具启动时,在分析模板中单击 **日志记录**。

  3. 按 '开始' 按钮。

  4. 按 '停止' 按钮。

  5. 单击 'os_signpost' 以展开 OS 日志记录子系统项。

  6. 单击 'org.tensorflow.lite' OS 日志记录子系统。

  7. 调查跟踪结果。

    Xcode Instruments trace

在此示例中,您可以看到事件的层次结构以及每个运算符时间的统计信息。

使用跟踪数据

跟踪数据允许您识别性能瓶颈。

以下是您从分析器中获得的见解示例以及提高性能的潜在解决方案。

  • 如果可用 CPU 内核的数量小于推理线程的数量,则 CPU 调度开销会导致性能下降。您可以重新安排应用程序中的其他 CPU 密集型任务,以避免与模型推理重叠,或者调整解释器线程的数量。
  • 如果运算符未完全委托,则模型图的某些部分将在 CPU 上执行,而不是在预期的硬件加速器上执行。您可以用类似的支持运算符替换不支持的运算符。