成效評估

基準工具

LiteRT 基準工具目前會測量與計算以下項目的統計資料: 下列重要成效指標:

  • 初始化時間
  • 暖機狀態的推論時間
  • 推論時間穩定
  • 初始化期間的記憶體用量
  • 整體記憶體用量

我們提供 Android 和 iOS 的基準應用程式,以及 都具有相同的核心效能 評估邏輯請注意,系統提供的選項和輸出格式如下 但因執行階段環境差異而稍有不同

Android 基準應用程式

搭配 Android 使用基準測試工具的方法有兩種。第一是 原生基準二進位檔和 Android 應用程式 對應用程式進行基準測試,則更適合用來評估模型在應用程式中的表現。兩者皆可 但基準工具的數據仍有些微差異 並在實際應用程式中以模型進行推論

這個 Android 基準應用程式沒有 UI。使用 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 (default=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

執行基準測試

如要在電腦上執行基準測試,請透過殼層執行二進位檔。

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 (default='all')
要進行基準的 TFLite 效能選項清單 (以半形逗號分隔)。

您可以取得這項工具的夜間預先建構二進位檔,如下所示:

iOS 基準應用程式

如要在 iOS 裝置上執行基準測試,您必須從 source。 將 LiteRT 模型檔案放入 benchmark_data 並修改 benchmark_params.json 檔案。這些 檔案封裝到應用程式中,而應用程式會從目錄讀取資料。前往 這個 iOS 基準應用程式

已知模型的效能基準

本章節會在運作狀態良好時,列出 LiteRT 效能基準 部分 Android 和 iOS 裝置上的已知模型

Android 效能基準

這些成效基準數據是經由 原生基準測試二進位檔

針對 Android 基準,CPU 相依性設定為使用裝置上的大型核心 即可減少變異數 (請參閱 details)。

此範例假設模型已下載並解壓縮至 /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 毫秒

追蹤 LiteRT 內部

在 Android 中追蹤 LiteRT 內部

Android 應用程式 LiteRT 翻譯程式的內部事件可能如下所示 擷取者 Android 追蹤工具。 在 Android 系統中,這兩個事件是相同的 Trace API,因此 從 Java/Kotlin 程式碼擷取的事件會與 LiteRT 一併顯示 內部事件。

事件範例如下:

  • 運算子叫用
  • 委派代表修改圖表
  • 張量分配

本指南將介紹多種擷取追蹤記錄的方式, Studio CPU 分析器和「系統追蹤」應用程式詳情請參閱 Perfetto 指令列工具Systrace 指令列工具 一文。

在 Java 程式碼中加入追蹤事件

這是 Google 新聞倡議計畫的 圖片分類 範例 app。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. 選取 執行 >。

  2. 顯示 Profiler 視窗時,按一下 CPU 時間軸中的任一處。

  3. 選取 [追蹤系統呼叫]在 CPU 剖析模式之間進行切換

    選取 [追蹤系統呼叫]

  4. 按下「錄製」按鈕。

  5. 按下「停止」按鈕。

  6. 調查追蹤記錄結果。

    Android Studio 追蹤記錄

在本例中,您可以在執行緒中查看事件階層和統計資料 也可以查看每個操作員時間的整個應用程式資料流向 。

「系統追蹤」應用程式

請按照以下詳細步驟,在不使用 Android Studio 的情況下擷取追蹤記錄: 「系統追蹤」應用程式

在此範例中,系統擷取相同的 TFLite 事件,並將其儲存至 Perfetto。 或是 Systrace 格式擷取 您可以在 Perfetto UI 中開啟追蹤檔。

Perfetto 追蹤記錄

在 iOS 中追蹤 LiteRT 內部

以下為 iOS 應用程式 LiteRT 解譯器的內部事件: 擷取者 樂器 Xcode 隨附的工具這些是 iOS 系統 signpost 事件,因此從 Swift/Objective-C 程式碼擷取的事件會全部一起顯示 稱為 LiteRT 內部事件

事件範例如下:

  • 運算子叫用
  • 委派代表修改圖表
  • 張量分配

啟用 LiteRT 追蹤功能

請按照下列步驟設定環境變數 debug.tflite.trace

  1. 選取產品 >配置 >編輯配置...從 Xcode 的頂端功能表。

  2. 按一下「個人資料」左側面板

  3. 取消選取「使用執行動作的引數和環境變數」 核取方塊。

  4. 在「Environment Variables」下方新增 debug.tflite.trace專區。

    設定環境變數

如要在分析 iOS 應用程式時排除 LiteRT 事件, 透過移除環境變數來停用追蹤功能

XCode 檢測

按照下列步驟擷取追蹤記錄:

  1. 選取產品 >設定檔

  2. 檢測工具啟動時,按一下剖析範本中的「記錄」

  3. 按下「開始」按鈕。

  4. 按下「停止」按鈕。

  5. 按一下「os_signpost」展開 OS Logging 子系統項目。

  6. 按一下「org.tensorflow.lite」OS 記錄子系統。

  7. 調查追蹤記錄結果。

    Xcode 檢測設備追蹤記錄

在這個範例中,您會看到事件的階層結構,以及每個 運算子時間。

使用追蹤資料

追蹤資料可讓您找出效能瓶頸。

以下列舉幾個從分析器可以取得的洞察資料範例 可能有助於改善成效的解決方案:

  • 如果可用的 CPU 核心數量少於推論數量 那麼 CPU 排程負擔可能會導致效能不彰。 您可以在應用程式中重新安排其他會耗用大量 CPU 的工作,避免發生這類工作。 與模型推論的重疊或微調數量 。
  • 如果運算子尚未完全委派,則模型圖表的某些部分 是在 CPU 上執行,而不是預期的硬體加速器。個人中心 可以使用類似的支援運算子替換不支援的運算子。