Path: blob/master/site/zh-cn/lite/performance/measurement.md
25118 views
性能测量
基准化分析工具
TensorFlow Lite 基准化分析工具目前可测量和计算以下重要性能指标的统计信息:
初始化时间
预热状态的推断时间
稳定状态的推断时间
初始化期间的内存使用量
整体内存使用量
基准化分析工具的可用形式包括 Android 和 iOS 版基准化分析应用以及原生命令行二进制文件,它们共享相同的核心性能测量逻辑。请注意,由于运行时环境的差异,可用选项和输出格式会略有不同。
Android 基准化分析应用
在 Android 上使用基准化分析工具有两种选项。一种是原生基准化分析二进制文件,另一种是 Android 基准化分析应用,后者可以更好地测量模型在应用中的性能。无论哪种方式,基准化分析工具测得的数字都会与在实际应用中运行模型推断略有不同。
此 Android 基准化分析应用没有用户界面。需要使用 adb
命令来安装和运行,并使用 adb logcat
命令来检索结果。
下载或构建应用
请使用以下链接下载 Nightly 预构建版 Android 基准化分析应用:
对于通过 Flex 委托支持 TF 运算的 Android 基准化分析应用,请使用以下链接:
您还可以按照以下说明以从源代码构建应用。
注:如果您想在 x86 CPU 或 Hexagon 委托上运行 Android 基准化分析 apk,或者您的模型包含精选 TF 算子或自定义算子,则需要从源代码构建应用。
准备基准化分析
在运行基准化分析应用之前,请按照以下方法安装应用并将模型文件推送至设备:
运行基准化分析
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
命令查看结果:
将以如下形式报告基准化分析结果:
原生基准化分析二进制文件
基准化分析工具也以原生二进制文件 benchmark_model
形式提供。您可以在 Linux、Mac、嵌入式设备和 Android 设备上通过 Shell 命令行执行此工具。
下载或构建二进制文件
请使用以下链接下载 Nightly 预构建版原生命令行二进制文件:
对于支持通过 Flex 委托执行 TF 运算的 Nightly 预构建版二进制文件,请使用以下链接:
为了使用 TensorFlow Lite Hexagon 委托进行基准化分析,我们还预构建了所需的 libhexagon_interface.so
文件(请参阅这里了解有关此文件的详细信息)。从以下链接下载对应平台的文件后,请将文件重命名为 libhexagon_interface.so
。
您还可以从计算机上的源代码构建原生基准化分析二进制文件。
要使用 Android NDK 工具链进行构建,您需要先按照此指南设置构建环境,或使用此指南中描述的 Docker 镜像。
注:直接在 Android 设备上推送并执行二进制文件进行基准化分析是一种有效方式,但与在实际 Android 应用中执行相比,可能会导致性能存在细微(但可观察到的)差异。尤其是,Android 的调度程序会根据线程和进程优先级来调整行为,而前台活动/应用和通过 adb shell ...
执行的常规后台二进制文件具有不同的优先级。对 TensorFlow Lite 启用多线程 CPU 执行时,这种行为调整最明显。因此,Android 基准化分析应用是性能测量的首选工具。
运行基准化分析
要在您的计算机上运行基准测试,请从 shell 执行二进制文件。
你可以在原生命令行二进制文件中使用上面提到的相同的参数集。
分析模型运算
基准化分析模型二进制文件还支持分析模型运算以及获取每个算子的执行时间。为此,请在调用期间将标志 --enable_op_profiling=true
传递至 benchmark_model
。此处解释了详细信息。
使用原生基准化分析二进制文件在一次运行中分析多个性能选项
我们还提供了方便易用的 C++ 二进制文件,用于在一次运行中对多个性能选项进行基准化分析。此二进制文件基于前文所述的每次只能基准化分析一个性能选项的基准化分析工具构建而成。它们的构建/安装/运行过程相同,但此二进制文件的 BUILD 目标名称为 benchmark_model_performance_options
,并具有一些附加参数。此二进制文件的一个重要参数为:
perf_options_list
: string
(默认值为 'all')
以逗号分隔的用于基准化分析的 TFLite 性能选项列表。
您可以获取此工具的 Nightly 预构建版二进制文件,如下所示:
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
目录中。
要运行基准化分析,请执行以下操作:
要使用 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 委托,我们还为 benchmark_params.json
添加了 "use_gpu" : "1"
和 "gpu_wait_type" : "aggressive"
选项。
模型名称 | 设备 | 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 内部事件
注:此功能将从 TensorFlow Lite 2.4 版开始提供。
Android 应用的 TensorFlow Lite 解释器的内部事件可以被 Android 跟踪工具捕获。它们是与 Android Trace API 相同的事件,因此从 Java/Kotlin 代码中捕获的事件会与 TensorFlow Lite 内部事件一起显示。
事件的一些示例包括:
算子调用
委托修改计算图
张量分配
在捕获跟踪的各种选项中,本指南将介绍 Android Studio CPU 性能剖析器和系统跟踪应用。请参阅 Perfetto 命令行工具或 Systrace 命令行工具以了解其他选项。
在 Java 代码中添加跟踪事件
以下为图像分类示例应用的代码段。TensorFlow Lite 解释器在 recognizeImage/runInference
部分中运行。此步骤为可选步骤,但有助于通知在何处调用了推断。
启用 TensorFlow Lite 跟踪
要启用 TensorFlow Lite 跟踪,请在启动 Android 应用之前将 Android 系统属性 debug.tflite.trace
设置为 1.
如果在初始化 TensorFlow Lite 解释器时已设置了此属性,则将跟踪解释器中的关键事件(例如,算子调用)。
捕获所有跟踪后,可将属性值设置为 0 以停用跟踪。
Android Studio CPU 性能剖析器
请遵循以下步骤来使用 Android Studio CPU 性能剖析器捕获跟踪:
从顶部菜单中选择 Run > Profile 'app'。
当性能剖析器窗口出现时,点击 CPU 时间轴上的任意位置。
在CPU分析模式中选择 'Trace System Calls'。
按下 'Record' 按钮。
按下 'Stop' 按钮。
调查跟踪结果。
在本例中,您可以查看线程中事件的层次结构以及每个算子时间的统计信息,还可以查看整个应用在各个线程之间的数据流。
系统跟踪应用
按照系统跟踪应用中详细介绍的步骤,在不使用 Android Studio 的情况下捕获跟踪。
在本例中,我们捕获了相同的 TFLite 事件并根据 Android 设备版本将其保存为 Perfetto 或 Systrace 格式。捕获的跟踪文件可在 Perfetto 界面中打开。
在 iOS 中跟踪 TensorFlow Lite 内部事件
注:此功能将从 TensorFlow Lite 2.5 版开始提供。
来自 iOS 应用的 TensorFlow Lite 解释器的内部事件可以由 Xcode 附带的 Instruments 工具捕获。它们是 IOS 路标事件,因此从 SWIFT/Objective-C 代码捕获的事件会与 TensorFlow Lite 内部事件一起显示。
事件的一些示例包括:
算子调用
委托修改计算图
张量分配
启用 TensorFlow Lite 跟踪
按照以下步骤设置环境变量 debug.tflite.trace
:
从 Xcode 的顶部菜单中选择 Product > Scheme > Edit Scheme...
点击左侧窗格中的 'Profile'。
取消选中 'Use the Run action's arguments and environment variables' 复选框。
在 'Environment Variables' 部分下添加
debug.tflite.trace
。
如果要在评测 iOS 应用时排除 TensorFlow Lite 事件,请移除环境变量以禁用跟踪。
XCode Instruments
请按照以下步骤捕获跟踪数据:
从 Xcode 的顶部菜单中选择 Product > Profile。
在 Instruments 工具启动时,在剖析模板中点击 Logging。
按下 'Start' 按钮。
按下 'Stop' 按钮。
点击 'os_signpost' 以展开 OS Logging 子系统项目。
点击 'org.tensorflow.lite' OS Logging 子系统。
调查跟踪结果。
在本例中,您可以看到每个运算符时间的事件和统计信息的层次结构。
使用跟踪数据
您可以通过跟踪数据识别性能瓶颈。
以下示例展示了您可以从性能剖析器中获得的一些洞见和提高性能的潜在解决方案:
如果可用 CPU 核心的数量小于推断线程的数量,则 CPU 调度开销可能会导致性能低于平均水平。您可以重新调度应用中的其他 CPU 密集型任务以免与模型推断重叠,或者调整解释器线程的数量。
如果算子没有完全委托,那么模型计算图的某些部分将在 CPU 上执行,而不是在预期的硬件加速器上执行。您可以将不受支持的算子替换为类似的受支持的算子。