LiteRT 的 GPU 委派

使用圖形處理器 (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 提供做為參考及測試之用:

最佳化 GPU

以下技巧可協助您在執行模型時獲得更好的效能 在 GPU 硬體上使用 LiteRT GPU 委派功能執行下列操作:

  • 重新塑形作業 - 在 CPU 上快速執行的部分作業, 而且成本高昂重塑作業特別容易 執行費用昂貴,包括 BATCH_TO_SPACESPACE_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
,瞭解如何調查及移除這項存取權。