TensorFlow Lite 的 GPU 委派

使用圖形處理單元 (GPU) 執行機器學習 (ML) 模型,可大幅提升模型的效能,以及啟用 ML 功能的應用程式的使用者體驗。TensorFlow Lite 透過稱為委派的硬體驅動程式,啟用 GPU 和其他專用處理器的使用。在 TensorFlow Lite ML 應用程式中啟用 GPU 的使用,可提供下列優點:

  • 速度 - GPU 是專為大量平行工作負載的高輸送量所打造。這種設計使其非常適合深度神經網路,深度神經網路包含大量運算子,每個運算子都在可平行處理的輸入張量上運作,這通常會降低延遲時間。在最佳情況下,在 GPU 上執行模型的速度可能夠快,以支援先前不可能實現的即時應用程式。
  • 電源效率 - GPU 以非常有效率且最佳化的方式執行 ML 計算,通常比在 CPU 上執行相同工作消耗更少的電力並產生更少的熱量。

本文件概述 TensorFlow Lite 中的 GPU 支援,以及 GPU 處理器的部分進階用途。如需在特定平台上實作 GPU 支援的更具體資訊,請參閱下列指南:

GPU ML 運算支援

TensorFlow ML 運算或運算元可透過 TensorFlow Lite GPU 委派加速的功能有所限制。委派支援下列 16 位元和 32 位元浮點精度的運算元:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (僅限基本 LSTM)
  • 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,8] 的張量大致相同,但明顯比 [B,H,W,4] 差。如果您使用的相機硬體支援 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 等程式庫) 來計算模型權杖。