效果衡量

基准测试工具

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 是必需参数。

  • graphstring
    TFLite 模型文件的路径。

您可以指定更多可选参数来运行基准。

  • num_threadsint(默认值=1)
    用于运行 TFLite 解释器的线程数。
  • use_gpubool(默认值=false)
    使用 GPU 代理
  • use_xnnpackbool(默认值=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_liststring(默认设置为“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 性能分析器 按照以下步骤操作:

  1. 选择 Run >Profile 'app'

  2. 出现 Profiler 窗口时,点击 CPU 时间轴上的任意位置。

  3. 选择“跟踪系统调用”多种 CPU 性能分析模式

    选择“跟踪系统调用”

  4. 按“录制”按钮。

  5. 按“停止”按钮。

  6. 调查跟踪记录结果。

    Android Studio 轨迹文件

在此示例中,您可以看到线程中事件的层次结构和统计信息 还可以查看整个应用的数据流 线程。

“系统跟踪”应用

按照本文中详述的步骤,在不使用 Android Studio 的情况下捕获跟踪记录 System Tracing 应用

在本示例中,捕获了相同的 TFLite 事件并将其保存到 Perfetto 或 Systrace 格式,具体取决于 Android 设备的版本。捕获的 跟踪文件可以在 Perfetto 界面中打开。

Perfetto 跟踪记录

在 iOS 中跟踪 LiteRT 内部函数

来自 iOS 应用的 LiteRT 解释器的内部事件 拍摄者 乐器 工具。他们是 iOS signpost 事件,以便同时查看从 Swift/Objective-C 代码中捕获的事件 LiteRT 内部事件。

以下是一些事件示例:

  • 运算符调用
  • 委托对图的修改
  • 张量分配

启用 LiteRT 跟踪功能

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

  1. 选择产品 >架构 >Edit Scheme...

  2. 点击“个人资料”。

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

  4. 在“环境变量”下添加 debug.tflite.trace部分。

    设置环境变量

如果您想在分析 iOS 应用时排除 LiteRT 事件, 通过移除环境变量来停用跟踪。

XCode 插桩

请按照以下步骤捕获轨迹:

  1. 选择产品 >Profile

  2. Instruments 工具启动时,点击分析模板中的 Logging

  3. 按“开始”按钮。

  4. 按“停止”按钮。

  5. 点击“os_signpost”以展开 OS Logging 子系统项。

  6. 点击“org.tensorflow.lite”OS Logging 子系统。

  7. 调查跟踪记录结果。

    Xcode Instruments 跟踪记录

在此示例中,您可以看到事件的层次结构和每个事件的统计信息 操作员的时间。

使用跟踪数据

通过跟踪数据,您可以识别性能瓶颈。

以下是一些您可以从性能分析器获取的数据洞见示例, 可能的解决方案:

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