使用圖形處理器 (GPU) 執行機器學習 (ML) 模型 可大幅改善模型成效和使用者體驗 您的機器學習應用程式LiteRT 可讓您使用 GPU 其他專門處理器 「委派代表」。透過 LiteRT ML 啟用 GPU 應用程式具有以下優點:
- 速度 - GPU 以大量平行處理量為最佳化目標 工作負載這項設計非常適合深層類神經網路 包含多個運算子,每個運算子都會處理 可以平行處理,因此通常可縮短延遲時間。於 在 GPU 上執行模型可能會快速執行 即時應用程式,這意味著前所未有
- 電力效率:GPU 以極高效率執行機器學習運算。 且採用經過最佳化處理的做法,通常耗電量較低, 比較熱度。
本文件提供 LiteRT 中 GPU 支援的總覽, GPU 處理器的進階用途如要進一步瞭解 如何在特定平台上實作 GPU 支援,請參閱下列指南:
GPU 機器學習作業支援
TensorFlow ML 作業或作業的部分都存在限制 透過 LiteRT GPU 委派功能加速。委派代表支援 下列作業 (採用 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 第 2 版。
GPU 支援疑難排解
如果 GPU 委派功能不支援某些作業,該架構就會 只會在 GPU 和 CPU 上執行部分圖形應付款項 且 CPU/GPU 同步處理成本很高,這種分割執行模式如下 比起執行整個網路, 也就是單靠 CPU在這種情況下,應用程式會產生警告,例如:
WARNING: op code #42 cannot be handled by this delegate.
這種類型的失敗並非實際發生,因此不會有回呼 run-time 失敗。使用 GPU 委派功能測試模型執行作業時 警示這些警告的數量過多 表示您的模型並非最適合用於 GPU 加速功能。 可能需要重構模型
範例模型
下列範例模型專為利用 GPU 加速功能而建構 LiteRT 提供做為參考及測試之用:
- MobileNet v1 (224x224) 圖像
分類
- 專為行動裝置和嵌入式播放器設計的圖像分類模型 視覺應用程式 (模型)
- DeepLab 區隔
(257 x 257)。
- 為模型指派語意標籤,例如狗 對應至輸入圖片中的每一個像素 (模型)
- MobileNet SSD 物件
偵測
- 圖像分類模型,能以各種圖像方式偵測多個物件 定界框。 (模型)
- PoseNet 表示姿勢
預估
- 預測圖像或人姿勢的視覺模型 影片。 (模型)
最佳化 GPU
以下技巧可協助您在執行模型時獲得更好的效能 在 GPU 硬體上使用 LiteRT GPU 委派功能執行下列操作:
重新塑形作業 - 在 CPU 上快速執行的部分作業, 而且成本高昂重塑作業特別容易 執行費用昂貴,包括
BATCH_TO_SPACE
、SPACE_TO_BATCH
SPACE_TO_DEPTH
等。建議您仔細檢查重新形狀的使用情形 以及可能僅適用於探索資料 或在模型的早期疊代移除這類目標對象會大幅降低 改善效能影像資料管道:在 GPU 上,Tensor 資料會分割為 4 個通道, 因此,在具有
[B,H,W,5]
形狀的張量上進行計算,將會執行 和[B,H,W,8]
形狀相同,但明顯低於[B,H,W,4]
。如果您使用的相機硬體支援 RGBA,提供 4 個管道的輸入內容會大幅加快,因為 這是從 3 聲道 RGB 到 4 聲道 RGBX 的記憶體副本。行動裝置最佳化模式:為獲得最佳成效,您應考慮採用 使用針對行動裝置最佳化的網路架構重新訓練分類器。 最佳化裝置端推論可大幅縮短延遲時間,並 以消耗電力。
進階 GPU 支援
您也可以使用其他進階的 GPU 處理技術來實現 提升模型效能,包括量化和序列化。 以下各節將詳細說明這些技巧。
使用量化模型
本節說明 GPU 委派功能如何加快 8 位元量化模型的速度。 包括:
為了達到最佳效能,請使用含有浮點輸入和 輸出張量
運作方式
由於 GPU 後端只支援浮點執行,因此我們執行了 可將原始模型的「浮點值檢視」指派給模型於 執行步驟如下:
常數張量 (例如權重/偏誤) 會在 以及 GPU 記憶體這項作業會在為下列專案啟用委派代表: LiteRT。
GPU 程式的輸入和輸出內容 (8 位元量化時) 反量化和量化 (分別)這項作業 都是透過 LiteRT 的最佳化核心在 CPU 上進行
在作業之間插入量化模擬工具,用來模擬量化 行為模型如果模型需要啟動,就必須採用這種方法 在量化過程中追蹤邊界的學習過程
如要進一步瞭解如何使用 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()
敬上 指向目前應用程式不公開的位置。 - 特定型號裝置的模型符記不得重複。你可以
方法是使用
與 App Engine
farmhash::Fingerprint64
。