LiteRT 委派

委派可運用裝置端加速器 (例如 GPU 和數位訊號處理器 (DSP)),為 LiteRT 模型啟用硬體加速功能。

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

另一方面,大多數現代手機都內含晶片,更擅長處理這些繁重作業。將這些核心用於類神經網路作業,在延遲和能源效率方面都有極大優勢。舉例來說,GPU 最多可將延遲時間縮短 5 倍

這些加速器都有相關聯的 API,可啟用自訂運算,例如行動 GPU 的 OpenCLOpenGL ES。通常您必須編寫大量自訂程式碼,才能透過這些介面執行類神經網路。考量到每個加速器都有優缺點,且無法執行神經網路中的所有作業,情況就更加複雜。TensorFlow Lite 的 Delegate API 可做為 TFLite 執行階段與這些低階 API 之間的橋樑,解決這個問題。

使用委派項目的執行階段

選擇代理人

LiteRT 支援多個委派項目,每個項目都針對特定平台和特定類型的模型進行最佳化。通常,根據兩項主要條件,會有適用於您用途的多個委派項目:您鎖定的平台 (Android 或 iOS?) 和您嘗試加速的模型類型 (浮點或量化?)。

各平台的委派作業

跨平台 (Android 和 iOS)

  • GPU 委任 - GPU 委任可用於 Android 和 iOS。如果 GPU 可用,這個執行階段會經過最佳化,可執行以 32 位元和 16 位元浮點數為基礎的模型。此外,這項功能也支援 8 位元量化模型,並提供與浮點數版本相當的 GPU 效能。如要瞭解 GPU 委派的詳細資料,請參閱「GPU 上的 LiteRT」。

iOS

  • 適用於新版 iPhone 和 iPad 的 Core ML 委任:對於提供類神經引擎的新版 iPhone 和 iPad,您可以使用 Core ML 委任,加快 32 位元或 16 位元浮點模型的推論速度。神經網路引擎適用於搭載 A12 SoC 以上版本的 Apple 行動裝置。如需 Core ML 委派的總覽資訊和逐步操作說明,請參閱 LiteRT Core ML 委派

依模型類型劃分的委派

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

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

驗證成效

本節資訊可做為初步指引,協助您選出可改善應用程式的委派項目。不過請注意,每個委派都有預先定義的支援作業集,且可能會根據模型和裝置以不同方式執行作業。因此,我們通常建議您執行一些基準測試,評估委派是否符合您的需求。這也有助於證明與將委派項目附加至 LiteRT 執行階段相關聯的二進位檔大小增加是合理的。

LiteRT 具有廣泛的效能和準確度評估工具,可協助開發人員放心在應用程式中使用委派。下一節將討論這些工具。

評估工具

延遲和記憶體用量

LiteRT 的基準測試工具可搭配適當參數使用,用來估算模型效能,包括平均推論延遲時間、初始化負擔、記憶體用量等。這項工具支援多個標記,可找出最適合模型的委派設定。舉例來說,您可以指定 --gpu_backend=gl,並搭配 --use_gpu 測量 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 圖像分類前 5 名的準確率提升不到 1%。

LiteRT 提供兩種工具,可評估委派項目對特定模型的行為準確度:以工作為準與工作無關。本節所述的所有工具都支援進階委派參數,這些參數是由上一節的基準化工具所使用。請注意,下方的子章節著重於委派評估 (委派是否與 CPU 執行相同作業?),而非模型評估 (模型本身是否適合這項工作?)。

以工作為基礎的評估

LiteRT 提供工具,可評估兩項圖像相關工作的正確性:

如要查看這些工具的預先建構二進位檔 (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

預期輸出內容為 Top-K 指標清單 (1 到 10):

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

與工作無關的評估

如果沒有適用的裝置端評估工具,或是您正在實驗自訂模型,LiteRT 提供的推論差異工具就派得上用場。(Android,64 位元 ARM 二進位架構二進位檔這裡)

Inference Diff 會比較兩種設定下的 LiteRT 執行作業 (以延遲時間和輸出值偏差而言):

  • 單一執行緒 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 模型輸出的「偵測類別」等內容較難解讀。舉例來說,這個工具可能會顯示差異,但這不一定表示委派項目有問題:假設有兩個 (虛擬) 類別:「TV (ID: 10)」和「Monitor (ID:20)」。如果委派項目稍微偏離黃金真相,顯示的是 Monitor 而非 TV,這個張量的輸出差異可能高達 20-10 = 10。