TensorFlow Lite 委任

「委派」可利用 GPU 和數位訊號處理器 (DSP) 等裝置端加速器,來啟用 TensorFlow Lite 模型的硬體加速功能。

根據預設,TensorFlow Lite 會使用針對 ARM Neon 指令集最佳化的 CPU 核心。然而,CPU 是一種多用途處理器,不需要針對機器學習模型中常見的大量算術 (例如,涉及卷積和密集層的矩陣數學) 進行最佳化。

另一方面,大多數新型手機都包含晶片,更適合處理這些繁重的作業。將其用於類神經網路作業可帶來顯著的延遲和電力效率優勢。例如,GPU 延遲時間最高可達 5 倍

這些加速器都有相關聯的 API,可以執行自訂運算,例如行動裝置 GPU 的 OpenCLOpenGL ES。一般來說,您必須編寫大量自訂程式碼,才能透過這些介面執行類神經網路。如果您發現每個加速器都有其優缺點,而且無法執行類神經網路中的每個作業,情況會更加複雜。TensorFlow Lite 的 Delegate API 是 TFLite 執行階段與這些較低層級 API 之間的橋樑,因此能夠解決這個問題。

執行含有委派項目的執行階段

選擇委派代表

TensorFlow Lite 支援多個委派,每個委派代表都針對特定平台和特定類型的模型進行最佳化。通常您的用途會有多個委派代表,具體取決於兩項主要條件:您指定的平台 (Android 或 iOS?),以及您要加速的模型類型 (浮點類型或量化?)。

各平台委派代表

跨平台 (Android 和 iOS)

  • GPU 委派:GPU 委派項目可用於 Android 和 iOS。已針對可使用 GPU 的 32 位元和 16 位元浮點型模型進行最佳化處理。同時支援 8 位元量化模型,並提供與浮點版本相當的 GPU 效能。如要進一步瞭解 GPU 委派,請參閱 GPU 上的 TensorFlow Lite

iOS

  • 適用於較新款 iPhone 和 iPad 的 Core ML 委派功能:對於支援 Neural Engine 的較新 iPhone 和 iPad,您可以使用 Core ML 委派功能,加快 32 位元或 16 位元浮點模型的推論速度。Neural Engine 支援搭載 A12 SoC 以上版本的 Apple 行動裝置。如需 Core ML 委派的總覽和逐步操作說明,請參閱 TensorFlow Lite Core ML 委派

各模型類型的委派代表

每個加速器在設計時都會考量特定位元寬度的資料。如果您為僅支援 8 位元量化作業的委派代表提供浮點模型,系統將會拒絕所有作業,而模型將完全在 CPU 上執行。為避免發生這類意外,下表根據模型類型概略列出委派支援:

模型類型 GPU CoreML
浮點 (32 位元)
訓練後的 float16 量化
訓練後的動態範圍量化
訓練後的整數量化
量化感知訓練

驗證成效

本節中的資訊可做為將委派代表列入候選清單的大原則,提升應用程式的服務品質。不過請注意,每個委派項目都有一組預先定義的作業支援作業,且執行結果可能因模型和裝置而異。因此,我們通常會建議您執行一些基準測試,以評估委派代表的實用程度。將委派項目附加至 TensorFlow Lite 執行階段時,這也有助於證明二進位檔大小增加的合理性。

TensorFlow Lite 提供廣泛的效能和準確率評估工具,可讓開發人員安心在應用程式中使用委派功能。我們將在下一節討論這些工具。

評估工具

延遲時間和記憶體用量

TensorFlow Lite 的基準工具可與適當的參數搭配使用,以估算模型效能,包括平均推論延遲時間、初始化負擔、記憶體用量等。這項工具支援多個標記,以便找出模型的最佳委派設定。舉例來說,您可以使用 --use_gpu 指定 --gpu_backend=gl,以測量使用 OpenGL 的 GPU 執行情況。如需支援委派參數的完整清單,請參閱詳細說明文件

以下舉例說明如何透過 adb 使用 GPU 的量化模型:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

您可以在這裡下載這項工具適用於 Android 64 位元 ARM 架構的預先建構版本 (瞭解詳情)。

準確性和正確性

委派項目執行運算的精確度,通常與 CPU 版本不同。因此,使用委派項目進行硬體加速時,會有 (通常不大) 的準確率取捨。請注意,這不一定是「一律」。舉例來說,由於 GPU 會使用浮點精確度來執行量化模型,因此可能會稍微改善精確度 (例如,ILSVRC 圖片分類排名小於 1% 的前 5 名)。

TensorFlow Lite 提供兩種工具,可用來測量特定模型的委派行為準確度,分別是「Task-Based」和「Task-Agnostic」。本節介紹的所有工具都支援上一節基準測試工具使用的進階委派參數。請注意,下方的子區段著重在「委派評估」 (委派項目執行時是否與 CPU 相同?) 而非模型評估 (模型本身是否適合用於工作?)。

工作型評估

TensorFlow Lite 提供工具,可用來評估兩項圖片型任務的正確性:

這些工具 (Android 64 位元 ARM 架構) 的預先建構二進位檔和相關說明文件,

以下範例說明如何在 Pixel 4 上使用 GPU 進行圖片分類評估

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_gpu=true

預期的輸出內容為介於 1 至 10 之間的「Top-K」指標:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

各項工作評估評估

如果工作尚未建立裝置端評估工具,或者您要以自訂模型進行實驗,則 TensorFlow Lite 有「Inference Diff」工具。(Android,64 位元 ARM 二進位檔架構二進位檔,請按這裡)

「推論差異」會在兩種設定中比較 TensorFlow Lite 的執行作業 (例如延遲時間和輸出值差):

  • 單一執行緒 CPU 推論
  • 使用者定義的推論 - 由這些參數定義

為了達成此目標,此工具會產生隨機高斯文資料,並透過兩個 TFLite 解譯器傳遞 (一個執行單一執行緒 CPU 核心),另一個則由使用者引數化的參數。

以個別元素為基礎,測量兩者的延遲時間,以及每個解譯器的輸出張量的絕對差異。

如果模型只有一個輸出張量,輸出內容可能如下所示:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

這表示針對索引 0 的輸出張量,CPU 輸出內容中的元素與委派輸出的平均值 1.96e-05 不同。

請注意,如要解讀這些數字,就必須更深入瞭解模型,以及每個輸出張量所代表的意義。如果是決定某種分數或嵌入的簡單迴歸,則差異應該較低 (否則代表會發生錯誤)。不過,如果是 SSD 模型中的「偵測類別」等輸出內容,系統比較難解讀。舉例來說,使用這項工具顯示差異可能就表示