使用圖形處理器 (GPU) 執行機器學習 (ML) 模型,可大幅提升模型效能,並改善採用機器學習技術的應用程式使用者體驗。TensorFlow Lite 可讓您透過稱為「委派」的硬體驅動程式,使用 GPU 和其他特殊處理器。為您的 TensorFlow Lite 機器學習應用程式啟用 GPU 可提供以下好處:
- 速度 - GPU 針對大量平行工作負載的處理量提供高處理量。經過設計,這些演算法非常適合深層類神經網路 (當中包含大量的運算子),且每個運算子可以平行處理可平行處理的輸入張量,因此通常可減少延遲時間。在最佳情況下,在 GPU 上執行模型的速度可能會夠快,能夠啟用前所未有的即時應用程式。
- 電池效率:GPU 以極有效率且最佳化的方式執行機器學習運算,相較於在 CPU 執行同一種工作,通常耗電量和熱度都較低。
本文件提供 TensorFlow Lite 中 GPU 支援的總覽,以及 GPU 處理器的一些進階用途。如要進一步瞭解如何在特定平台上實作 GPU 支援功能,請參閱下列指南:
GPU 機器學習作業支援
使用 TensorFlow Lite GPU 委派功能加速的 TensorFlow ML 作業 (或稱「運算」) 有一些限制。委派項目支援 16 位元和 32 位元浮點精確度的下列運算:
ADD
AVERAGE_POOL_2D
CONCATENATION
CONV_2D
DEPTHWISE_CONV_2D v1-2
EXP
FULLY_CONNECTED
LOGICAL_AND
LOGISTIC
LSTM v2 (Basic LSTM only)
MAX_POOL_2D
MAXIMUM
MINIMUM
MUL
PAD
PRELU
RELU
RELU6
RESHAPE
RESIZE_BILINEAR v1-3
SOFTMAX
STRIDED_SLICE
SUB
TRANSPOSE_CONV
根據預設,只有版本 1 才支援所有作業。啟用量化支援會啟用適當的版本,例如 ADD v2。
GPU 支援疑難排解
如果 GPU 委派項目不支援某些運算,則架構只會在 GPU 和 CPU 執行其餘部分執行圖表的一部分。由於 CPU/GPU 同步處理成本較高,這種分割執行模式通常比在只使用 CPU 上執行整個網路時,效能會變慢。在這種情況下,應用程式會產生警告,例如:
WARNING: op code #42 cannot be handled by this delegate.
這不是實際的執行階段失敗,因此不會針對這類失敗的回呼進行回呼。使用 GPU 委派功能測試模型的執行作業時,您應收到這些警告的警示。這類警告過多可能表示您的模型並非最適合用於 GPU 加速功能,因此可能需要重構模型。
範例模型
下列模型範例利用 TensorFlow Lite 提升 GPU 加速功能,僅供參考:
- MobileNet v1 (224x224) 圖片分類
- 專為行動裝置和嵌入式視覺應用程式設計的圖像分類模型。(model)
- DeepLab 區隔 (257x257)
- 為輸入圖片中的每個像素指派語意標籤 (例如狗、貓、汽車) 的圖片區隔模型。(model)
- MobileNet SSD 物件偵測
- 圖片分類模型,可偵測多個有定界框的物件。(model)
- PoseNet 估算姿勢
- 預測圖像或影片中人物姿勢的視覺模型。(model)
最佳化 GPU
使用 TensorFlow Lite GPU 委派功能在 GPU 硬體上執行模型時,下列技巧可協助您提升效能:
重新塑形作業 - 在 CPU 上快速執行的部分作業,對於行動裝置上的 GPU 可能會有較高的費用。重新形狀作業的執行成本特別高,包括
BATCH_TO_SPACE
、SPACE_TO_BATCH
、SPACE_TO_DEPTH
等。您應密切檢查重塑作業的使用情況,並考量可能已用於探索資料或模型的早期疊代。移除這些使用者可大幅改善效能。圖片資料管道:在 GPU 上,張量資料會分割為 4 個通道;因此,對
[B,H,W,5]
形狀的張量進行運算的效能大致相同,但遠低於[B,H,W,4]
。[B,H,W,8]
如果您使用的相機硬體支援 RGBA 中的圖片影格,則提供 4 個管道的輸入內容會大幅加快,因為不會將記憶體從 3 聲道 RGB 複製到 4 聲道 RGBX。針對行動裝置最佳化的模型:為獲得最佳效能,建議您使用針對行動裝置最佳化的網路架構重新訓練分類器。此外,針對裝置端推論進行最佳化,可利用行動裝置硬體功能,大幅縮短延遲時間和耗電量。
進階 GPU 支援
您可搭配 GPU 處理使用其他進階技術,進一步提升模型效能,包括量化和序列化。以下各節將詳細說明這些技巧。
使用量化模型
本節說明 GPU 委派功能如何加速 8 位元量化模型,包括:
為了達到最佳效能,請使用具有浮點輸入和輸出張量的模型。
這是如何辦到的呢?
由於 GPU 後端僅支援浮點執行,因此我們提供原始模型的「浮點檢視」來執行量化模型。大致來說,這包含以下步驟:
常數張量 (例如權重/偏誤) 會重新量化至 GPU 記憶體。系統會在為 TensorFlow Lite 啟用委派功能時執行這項作業。
GPU 程式的輸入和輸出內容 (8 位元量化) 會針對每個推論進行反量化和量化 (相對)。這項作業會在 CPU 上使用 TensorFlow Lite 的最佳化核心完成。
系統會在作業之間插入量化模擬工具,用來模擬量化行為。如果模型的任務預期啟動次數會跟在量化期間學習,就一定要採用這種方法。
如要瞭解如何使用 GPU 委派功能啟用這項功能,請參閱下列資源:
透過序列化作業縮短初始化時間
GPU 委派功能可讓您從預先編譯的核心程式碼載入,以及透過先前執行在磁碟中序列化並儲存的模型資料。這種做法可避免重新編譯,並可縮短啟動時間最多達 90%。藉由交換磁碟空間來節省寶貴時間,可以達到提升效果。您可以透過幾種設定選項啟用這項功能,如以下程式碼範例所示:
C++
TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default(); options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION; options.serialization_dir = kTmpDir; options.model_token = kModelToken; auto* delegate = TfLiteGpuDelegateV2Create(options); if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
Java
GpuDelegate delegate = new GpuDelegate( new GpuDelegate.Options().setSerializationParams( /* serializationDir= */ serializationDir, /* modelToken= */ modelToken)); Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
使用序列化功能時,請確保您的程式碼符合下列實作規則:
- 將序列化資料儲存在其他應用程式無法存取的目錄中。在 Android 裝置上,請使用
getCodeCacheDir()
,指向目前應用程式不公開的位置。 - 特定型號裝置的模型符記不得重複。您可以使用
farmhash::Fingerprint64
等程式庫,從模型資料產生指紋,藉此計算模型權杖。