成效評估

基準工具

LiteRT 基準化工具目前會測量及計算下列重要效能指標的統計資料:

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

基準化工具提供 Android 和 iOS 適用的基準化應用程式,以及預先建構的指令列二進位檔,且這些工具都採用相同的核心效能量測邏輯。請注意,由於執行階段環境不同,可用選項和輸出格式會略有差異。

預先建構的基準測試二進位檔 (使用 CompiledModel API)

使用 Android 裝置進行基準測試的方法有兩種。一個是原生基準測試二進位檔 (以 CompiledModel API 為基礎),另一個是Android 基準測試應用程式 (以 Interpreter API 為基礎)。LiteRT 基準工具會以內建二進位檔 benchmark_model 的形式提供。您可以在 Linux、macOS、Windows、Raspberry Pi、嵌入式裝置和 Android 裝置上,透過殼層指令列執行這項工具,並啟用 GPU 加速功能。

下載或建構二進位檔

請按照下列連結下載每夜預先建構的指令列二進位檔:

您也可以在電腦上從來源建構基準二進位檔。

bazel build -c opt //litert/tools:benchmark_model

如要使用 Android NDK 工具鍊建構,請先按照這份指南設定建構環境,或使用這份指南所述的 Docker 映像檔。

bazel build -c opt --config=android_arm64 \
  //litert/tools:benchmark_model

執行基準測試

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

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

您可以使用與先前相同的參數,搭配預先建構的指令列二進位檔。

GPU 加速器

這些預先建構的二進位檔包含新的 LiteRT GPU 加速器。支援 OpenCL 和 WebGPU,並以 Vulkan (Linux)、Metal (MacOS) 和 Direct3D (Windows) 為後盾。

如要使用 GPU 加速器,請傳遞 --use_gpu=true 標記。

剖析模型作業

基準模型二進位檔也能讓您分析模型運算,並取得每個運算子的執行時間。如要這麼做,請在叫用期間將 --use_profiler=true 旗標傳遞至 benchmark_model

Android 基準化應用程式 (使用 Interpreter API)

我們也提供以 v1 Interpreter API 為基礎的 Android 基準測試應用程式。這能更準確地評估模型在 Android 應用程式中的效能。不過,基準化工具的數字仍會與在實際應用程式中執行模型推論時略有不同。

這個 Android 基準測試應用程式沒有 UI。使用 adb 指令安裝及執行,並使用 adb logcat 指令擷取結果。

下載或建構應用程式

使用下列連結下載每夜預先建構的 Android 基準測試應用程式:

如要使用支援 Flex 委派的 Android 基準測試應用程式,請點選下列連結:TF 作業

您也可以按照這些操作說明,從來源建構應用程式。

準備基準

執行基準測試應用程式前,請先安裝應用程式,然後將模型檔案推送至裝置,方法如下:

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

iOS 基準應用程式

如要在 iOS 裝置上執行基準測試,您需要從來源建構應用程式。 將 LiteRT 模型檔案放在來源樹狀結構的 benchmark_data 目錄中,然後修改 benchmark_params.json 檔案。這些檔案會封裝到應用程式中,應用程式會從目錄讀取資料。如需詳細操作說明,請參閱 iOS 基準測試應用程式

知名模型的效能基準

本節列出在部分 Android 和 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 (quant) Pixel 3 13.4 毫秒 ---
Pixel 4 5.0 毫秒 ---
NASNet mobile 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 (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 毫秒

追蹤 LiteRT 內部項目

在 Android 中追蹤 LiteRT 內部項目

Android 應用程式 LiteRT 解譯器的內部事件可由 Android 追蹤工具擷取。這些事件與 Android Trace API 的事件相同,因此從 Java/Kotlin 程式碼擷取的事件會與 LiteRT 內部事件一併顯示。

以下列舉幾個事件範例:

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

本指南將介紹 Android Studio CPU 分析器和「系統追蹤」應用程式,說明如何擷取追蹤記錄。如需其他選項,請參閱 Perfetto 指令列工具Systrace 指令列工具

在 Java 程式碼中新增追蹤事件

這是圖片分類範例應用程式的程式碼片段。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 應用程式前,將 Android 系統屬性 debug.tflite.trace 設為 1。

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. 分析器視窗隨即顯示,請點選 CPU 時間軸中的任一處。

  3. 在 CPU 分析模式中選取「追蹤系統呼叫」。

    選取「Trace System Calls」(追蹤系統呼叫)

  4. 按下「錄製」按鈕。

  5. 按下「停止」按鈕。

  6. 調查追蹤結果。

    Android Studio 追蹤記錄

在這個範例中,您可以看到執行緒中的事件階層和每個運算子時間的統計資料,以及執行緒間整個應用程式的資料流程。

「系統追蹤」應用程式

如要在沒有 Android Studio 的情況下擷取追蹤記錄,請按照「系統追蹤記錄應用程式」一文的詳細步驟操作。

在本範例中,系統會擷取相同的 TFLite 事件,並根據 Android 裝置版本,以 Perfetto 或 Systrace 格式儲存。您可以在 Perfetto UI 中開啟擷取的追蹤記錄檔。

Perfetto 追蹤記錄

在 iOS 中追蹤 LiteRT 內部項目

iOS 應用程式 LiteRT 解譯器的內部事件可由 Xcode 隨附的 Instruments 工具擷取。這些是 iOS signpost事件,因此從 Swift/Objective-C 程式碼擷取的事件會與 LiteRT 內部事件一起顯示。

以下列舉幾個事件範例:

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

啟用 LiteRT 追蹤

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

  1. 在 Xcode 的頂端選單中,依序選取「Product」>「Scheme」>「Edit Scheme...」

  2. 按一下左側窗格中的「個人資料」。

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

  4. 在「環境變數」部分下方新增 debug.tflite.trace

    設定環境變數

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

XCode Instruments

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

  1. 在 Xcode 的頂端選單中,依序選取「Product」>「Profile」

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

  3. 按下「開始」按鈕。

  4. 按下「停止」按鈕。

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

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

  7. 調查追蹤結果。

    Xcode Instruments 追蹤記錄

在這個範例中,您可以看到每個接線人員時間的事件和統計資料階層。

使用追蹤資料

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

以下列舉幾個可從剖析器取得的洞察資料,以及提升效能的潛在解決方案:

  • 如果可用的 CPU 核心數小於推論執行緒數,CPU 排程負擔可能會導致效能不佳。您可以重新安排應用程式中其他 CPU 密集型工作,避免與模型推論重疊,或調整解譯器執行緒的數量。
  • 如果運算子未完全委派,模型圖的部分內容會在 CPU 上執行,而非預期的硬體加速器。您可以將不支援的運算子替換為類似的支援運算子。