委派可運用裝置端加速器 (例如 GPU 和數位訊號處理器 (DSP)),為 LiteRT 模型啟用硬體加速功能。
根據預設,LiteRT 會使用針對 ARM Neon 指令集最佳化的 CPU 核心。不過,CPU 是多用途處理器,不一定會針對機器學習模型中常見的大量算術運算進行最佳化 (例如捲積和密集層涉及的矩陣數學)。
另一方面,大多數現代手機都內含晶片,更擅長處理這些繁重作業。將這些核心用於類神經網路作業,在延遲和能源效率方面都有極大優勢。舉例來說,GPU 最多可將延遲時間縮短 5 倍。
這些加速器都有相關聯的 API,可啟用自訂運算,例如行動 GPU 的 OpenCL 或 OpenGL 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 提供工具,可評估兩項圖像相關工作的正確性:
ILSVRC 2012 (圖片分類),前 K 項準確率
COCO 物件偵測 (含定界框) 平均準確率 (mAP)
如要查看這些工具的預先建構二進位檔 (Android、64 位元 ARM 架構) 和文件,請前往:
- ImageNet 圖片分類 (更多詳細資料) * COCO 物件偵測 (更多詳細資料)
以下範例說明如何在 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。