基準工具
TensorFlow Lite 基準工具目前會針對下列重要成效指標測量及計算統計資料:
- 初始化時間
- 暖機狀態的推論時間
- 穩定狀態的推論時間
- 初始化期間的記憶體用量
- 整體記憶體用量
基準工具可做為 Android 和 iOS 的基準應用程式及原生指令列二進位檔,而且都共用相同的核心效能測量邏輯。請注意,由於執行階段環境不同,可用選項和輸出格式略有不同。
Android 基準應用程式
搭配 Android 使用基準工具的方法有兩種。一個是原生基準二進位檔,另一個是 Android 基準應用程式,更能準確評估模型在應用程式中的成效。無論如何,基準工具的數據在實際應用程式中進行推論時,基準數據仍可能會略有不同。
這個 Android 基準應用程式沒有 UI。使用 adb
指令安裝並執行這個程式庫,並使用 adb logcat
指令擷取結果。
下載或建構應用程式
透過下方連結下載每晚預先建立的 Android 基準應用程式:
對於透過 Flex 委派支援 TF 運算的 Android 基準應用程式,請使用以下連結:
您也可以按照這些instructions,從原始碼建構應用程式。
準備基準
執行基準應用程式之前,請安裝應用程式,並將模型檔案推送至裝置,如下所示:
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
(default=1)
用於執行 TFLite 解譯器的執行緒數量。use_gpu
:bool
(default=false)
使用 GPU 委派。use_xnnpack
:bool
(default=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 裝置上透過殼層指令列執行這項工具。
下載或建構二進位檔
請按照以下連結,下載每晚預先建構的原生指令列二進位檔:
至於透過 Flex 委派支援 TF 運算的夜間預建二進位檔,請使用以下連結:
您也可以透過電腦上的來源建構原生基準測試二進位檔。
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_list
:string
(default='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
如要使用 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 委派,我們也為 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 (量化) | 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 毫秒 |
追蹤 TensorFlow Lite 內部資訊
在 Android 中追蹤 TensorFlow Lite 內部結構
Android 追蹤工具可擷取 Android 應用程式的 TensorFlow Lite 解譯器提供的內部事件。它們與 Android Trace API 中的事件相同,因此透過 Java/Kotlin 程式碼擷取的事件會與 TensorFlow Lite 內部事件一併顯示。
例如:
- 運算子叫用
- 委派代表修改圖表
- TensorFlow 分配
本指南以不同的方式擷取追蹤記錄,並介紹 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 分析器擷取追蹤記錄:
在頂端選單中依序選取「Run」>「Profile 'app'」。
顯示 Profiler 視窗時,按一下 CPU 時間軸中的任何位置。
在 CPU 剖析模式中選取 [Trace System Calls] (追蹤系統呼叫)。
按下「錄製」按鈕。
按下「停止」按鈕。
調查追蹤記錄結果。
在這個範例中,您可以查看執行緒中的事件階層、每個運算子時間的統計資料,以及整個應用程式在執行緒間的資料流。
「系統追蹤」應用程式
按照「系統追蹤應用程式」中詳細的步驟操作,在不使用 Android Studio 的情況下擷取追蹤記錄。
在此範例中,系統擷取到的 TFLite 事件,並儲存到 Perfetto 或 Systrace 格式,視 Android 裝置版本而定。擷取的追蹤檔可在 Perfetto UI 中開啟。
在 iOS 中追蹤 TensorFlow Lite 內部結構
iOS 應用程式 TensorFlow Lite 解譯器的內部事件,可透過 Xcode 中的檢測工具擷取。這些是 iOS signpost 事件,因此從 Swift/Objective-C 程式碼擷取的事件會與 TensorFlow Lite 內部事件一併顯示。
例如:
- 運算子叫用
- 委派代表修改圖表
- TensorFlow 分配
啟用 TensorFlow Lite 追蹤功能
請按照下列步驟設定環境變數 debug.tflite.trace
:
從 Xcode 頂端的選單中,依序選取「Product」>「 Scheme」>「Edit Scheme...」。
點選左側窗格中的「Profile」。
取消選取「使用執行動作的引數和環境變數」核取方塊。
在「Environment Variables」區段下方新增
debug.tflite.trace
。
如要在分析 iOS 應用程式時排除 TensorFlow Lite 事件,請移除環境變數來停用追蹤功能。
XCode 儀器
請按照下列步驟擷取追蹤記錄:
從 Xcode 頂端的選單中,依序選取「Product」>「Profile」。
在檢測工具啟動時,按一下剖析範本中的「Logging」。
按下「開始」按鈕。
按下「停止」按鈕。
按一下「os_signpost」展開 OS Logging 子系統項目。
按一下「org.tensorflow.lite」OS Logging 子系統。
調查追蹤記錄結果。
在這個範例中,您可以查看每個運算子時間的事件階層和統計資料。
使用追蹤資料
追蹤資料可讓您找出效能瓶頸。
以下列舉一些從分析器和潛在解決方案中可以改善效能的深入分析結果:
- 如果可用的 CPU 核心數量少於推論執行緒數量,CPU 排程負擔可能會導致效能不如預期。您可以重新排定應用程式中其他需要大量 CPU 資源的工作,以免與模型推論重疊,或調整解譯執行緒執行緒的數量。
- 如果運算子未完全委派,則模型圖的某些部分會在 CPU (而非預期的硬體加速器) 上執行。您可以使用類似的支援的運算子替換不支援的運算子。