Android 加速服務 (Beta)

使用 GPU、NPU 或 DSP 等專用處理器進行硬體加速,可大幅改善推論效能 (在某些情況下,推論速度最多可加快 10 倍) 和啟用 ML 的 Android 應用程式的使用者體驗。然而,鑑於使用者的硬體和驅動程式可能種類繁多,為每位使用者的裝置挑選最佳硬體加速設定可能是一項挑戰。此外,在裝置上啟用錯誤的設定可能會因延遲時間過長而導致不良的使用者體驗,或在極少數情況下,因硬體不相容而導致執行階段錯誤或準確性問題。

Android 加速服務是一種 API,可協助您為特定使用者裝置和您的 .tflite 模型挑選最佳硬體加速設定,同時將執行階段錯誤或準確性問題的風險降至最低。

加速服務會透過使用您的 TensorFlow Lite 模型執行內部推論基準評估,來評估使用者裝置上的不同加速設定。這些測試執行通常會在幾秒鐘內完成,具體取決於您的模型。您可以在每個使用者裝置上推論前執行一次基準評估、快取結果,並在推論期間使用。這些基準評估會在進程外執行;這可將應用程式當機的風險降至最低。

提供您的模型、資料樣本和預期結果 (「黃金」輸入和輸出),加速服務將執行內部 TFLite 推論基準評估,為您提供硬體建議。

image

加速服務是 Android 自訂 ML 堆疊的一部分,可與 Google Play 服務中的 TensorFlow Lite 搭配使用。

將依附元件新增至您的專案

將下列依附元件新增至應用程式的 build.gradle 檔案

implementation  "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"

加速服務 API 可與 Google Play 服務中的 TensorFlow Lite 搭配使用。如果您尚未使用透過 Play 服務提供的 TensorFlow Lite 執行階段,則需要更新您的依附元件

如何使用加速服務 API

若要使用加速服務,請先建立您要為模型評估的加速設定 (例如使用 OpenGL 的 GPU)。然後使用您的模型、一些範例資料和預期模型輸出建立驗證設定。最後,在傳遞您的加速設定和驗證設定時,呼叫 validateConfig()

image

建立加速設定

加速設定是硬體設定的表示法,在執行階段會轉譯為委派。然後,加速服務會在內部使用這些設定來執行測試推論。

目前,加速服務可讓您使用 GpuAccelerationConfig 評估 GPU 設定 (在執行階段轉換為 GPU 委派) 以及 CPU 推論 (使用 CpuAccelerationConfig)。我們正努力支援更多委派,以便在未來存取其他硬體。

GPU 加速設定

依照下列步驟建立 GPU 加速設定

AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
  .setEnableQuantizedInference(false)
  .build();

您必須使用 setEnableQuantizedInference() 指定您的模型是否使用量化。

CPU 加速設定

依照下列步驟建立 CPU 加速

AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
  .setNumThreads(2)
  .build();

使用 setNumThreads() 方法定義您要用於評估 CPU 推論的執行緒數量。

建立驗證設定

驗證設定可讓您定義要讓加速服務如何評估推論。您將使用它們來傳遞

  • 輸入樣本、
  • 預期輸出、
  • 準確性驗證邏輯。

請務必提供您預期模型效能良好的輸入樣本 (也稱為「黃金」樣本)。

依照下列步驟使用 CustomValidationConfig.Builder 建立 ValidationConfig

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenOutputs(outputBuffer)
   .setAccuracyValidator(new MyCustomAccuracyValidator())
   .build();

使用 setBatchSize() 指定黃金樣本的數量。使用 setGoldenInputs() 傳遞黃金樣本的輸入。使用 setGoldenOutputs() 提供與傳遞的輸入相對應的預期輸出。

您可以使用 setInferenceTimeoutMillis() (預設為 5000 毫秒) 定義最長推論時間。如果推論時間超過您定義的時間,系統將拒絕該設定。

或者,您也可以依照下列步驟建立自訂 AccuracyValidator

class MyCustomAccuracyValidator implements AccuracyValidator {
   boolean validate(
      BenchmarkResult benchmarkResult,
      ByteBuffer[] goldenOutput) {
        for (int i = 0; i < benchmarkResult.actualOutput().size(); i++) {
            if (!goldenOutputs[i]
               .equals(benchmarkResult.actualOutput().get(i).getValue())) {
               return false;
            }
         }
         return true;

   }
}

請務必定義適用於您的使用情境的驗證邏輯。

請注意,如果驗證資料已嵌入您的模型中,您可以使用 EmbeddedValidationConfig

產生驗證輸出

黃金輸出為選用項目,只要您提供黃金輸入,加速服務即可在內部產生黃金輸出。您也可以呼叫 setGoldenConfig(),定義用於產生這些黃金輸出的加速設定。

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenConfig(customCpuAccelerationConfig)
   [...]
   .build();

驗證加速設定

建立加速設定和驗證設定後,您就可以針對模型評估這些設定。

請執行下列步驟,確保 TensorFlow Lite with Play 服務執行階段已正確初始化,且 GPU 委派適用於裝置

TfLiteGpu.isGpuDelegateAvailable(context)
   .onSuccessTask(gpuAvailable -> TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(gpuAvailable)
        .build()
      )
   );

呼叫 AccelerationService.create(),例項化 AccelerationService

然後,您可以呼叫 validateConfig(),針對模型驗證加速設定

InterpreterApi interpreter;
InterpreterOptions interpreterOptions = InterpreterApi.Options();
AccelerationService.create(context)
   .validateConfig(model, accelerationConfig, validationConfig)
   .addOnSuccessListener(validatedConfig -> {
      if (validatedConfig.isValid() && validatedConfig.benchmarkResult().hasPassedAccuracyTest()) {
         interpreterOptions.setAccelerationConfig(validatedConfig);
         interpreter = InterpreterApi.create(model, interpreterOptions);
});

您也可以呼叫 validateConfigs() 並傳遞 Iterable<AccelerationConfig> 物件做為參數,藉此驗證多個設定。

validateConfig() 將從 Google Play 服務 Task Api 傳回 Task<ValidatedAccelerationConfigResult>,以啟用非同步工作。
若要從驗證呼叫取得結果,請新增 addOnSuccessListener() 回呼。

在 Interpreter 中使用已驗證的設定

在檢查回呼中傳回的 ValidatedAccelerationConfigResult 是否有效後,您可以將已驗證的設定設定為 Interpreter 的加速設定,方法是呼叫 interpreterOptions.setAccelerationConfig()

設定快取

模型的最佳加速設定不太可能在裝置上變更。因此,一旦您收到令人滿意的加速設定,就應將其儲存在裝置上,並讓應用程式在後續工作階段中擷取並使用它來建立 InterpreterOptions,而無需執行另一次驗證。ValidatedAccelerationConfigResult 中的 serialize()deserialize() 方法可讓儲存和擷取程序更輕鬆。

範例應用程式

若要查看加速服務的就地整合,請參閱範例應用程式

限制

加速服務目前有下列限制

  • 目前僅支援 CPU 和 GPU 加速設定。
  • 僅支援 Google Play 服務中的 TensorFlow Lite,如果您使用的是 TensorFlow Lite 的配套版本,則無法使用。
  • 它不支援 TensorFlow Lite Task Library,因為您無法使用 ValidatedAccelerationConfigResult 物件直接初始化 BaseOptions
  • 加速服務 SDK 僅支援 API 級別 22 以上版本。

注意事項

請仔細審閱下列注意事項,尤其是當您計劃在生產環境中使用此 SDK 時

  • 在結束 Beta 版並發布加速服務 API 的穩定版本之前,我們將發布新的 SDK,該 SDK 可能與目前的 Beta 版 SDK 有些差異。為了繼續使用加速服務,您需要遷移至這個新的 SDK,並及時推送應用程式更新。若未這麼做,可能會導致中斷,因為 Beta 版 SDK 在一段時間後可能不再與 Google Play 服務相容。

  • 無法保證加速服務 API 內的特定功能或整個 API 會成為正式發行版本。它可能會無限期地保持在 Beta 版狀態、關閉,或與其他功能合併到專為特定開發人員受眾設計的套件中。加速服務 API 中的某些功能或整個 API 本身最終可能會成為正式發行版本,但這沒有固定的時程表。

條款與隱私權

服務條款

加速服務 API 的使用受 Google API 服務條款 規範。
此外,加速服務 API 目前為 Beta 版,因此,使用它即表示您承認上述「注意事項」章節中概述的潛在問題,並承認加速服務可能無法始終按指定方式執行。

隱私權

當您使用加速服務 API 時,輸入資料 (例如圖片、影片、文字) 的處理完全在裝置上進行,且 加速服務不會將該資料傳送至 Google 伺服器。因此,您可以將我們的 API 用於處理不應離開裝置的輸入資料。
加速服務 API 可能會不時聯絡 Google 伺服器,以接收錯誤修正、更新的模型和硬體加速器相容性資訊等內容。加速服務 API 也會將關於應用程式中 API 效能和使用率的指標傳送給 Google。Google 會使用這些指標資料來衡量效能、偵錯、維護和改進 API,以及偵測濫用或違規行為,詳情請參閱我們的《隱私權政策》
您有責任依照適用法律的要求,告知您的應用程式使用者 Google 對加速服務指標資料的處理方式。
我們收集的資料包括以下內容

  • 裝置資訊 (例如製造商、型號、作業系統版本和組建版本) 和可用的 ML 硬體加速器 (GPU 和 DSP)。用於診斷和使用情況分析。
  • 應用程式資訊 (套件名稱/套件 ID、應用程式版本)。用於診斷和使用情況分析。
  • API 設定 (例如圖片格式和解析度)。用於診斷和使用情況分析。
  • 事件類型 (例如初始化、下載模型、更新、執行、偵測)。用於診斷和使用情況分析。
  • 錯誤代碼。用於診斷。
  • 效能指標。用於診斷。
  • 不會唯一識別使用者或實體裝置的每次安裝專屬 ID。用於遠端設定和使用情況分析的運作。
  • 網路要求傳送者 IP 位址。用於遠端設定診斷。收集的 IP 位址會暫時保留。

支援與意見回饋

您可以透過 TensorFlow 問題追蹤工具提供意見回饋並取得支援。請使用 問題範本 (適用於 Google Play 服務中的 TensorFlow Lite) 回報問題和支援要求。