TensorFlow Lite 的 GPU 委任

使用圖形處理器 (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 加速功能,僅供參考:

最佳化 GPU

使用 TensorFlow Lite GPU 委派功能在 GPU 硬體上執行模型時,下列技巧可協助您提升效能:

  • 重新塑形作業 - 在 CPU 上快速執行的部分作業,對於行動裝置上的 GPU 可能會有較高的費用。重新形狀作業的執行成本特別高,包括 BATCH_TO_SPACESPACE_TO_BATCHSPACE_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 等程式庫,從模型資料產生指紋,藉此計算模型權杖。