Android 加速服務 (Beta 版)

使用 GPU、NPU 或 DSP 等特殊處理器進行硬體加速,可大幅提高推論效能 (在某些情況下,推論速度最高可達 10 倍),並且提供採用機器學習技術的 Android 應用程式使用者體驗。不過,由於使用者可能擁有的硬體和驅動程式種類繁多,要為每位使用者的裝置挑選最合適的硬體加速設定並不容易。此外,如果在裝置上啟用錯誤設定,可能會因為延遲時間過長,或因硬體不相容而造成的執行階段錯誤或準確度問題,帶給使用者不好的體驗。

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

加速服務會使用您的 TensorFlow Lite 模型執行內部推論基準,藉此在使用者裝置上評估不同的加速設定。這些測試通常會在幾秒內完成,視您的模型而定。進行推論前,您可以在每位使用者裝置上執行一次基準測試,然後快取結果,並在推論期間使用。這些基準測試是在程序外執行,可將應用程式當機的風險降到最低。

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

圖片

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

將依附元件新增至專案

在應用程式的 build.gradle 檔案中新增下列依附元件:

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

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

如何使用 Acceleration Service API

如要使用加速服務,請先建立您想評估模型的加速設定 (例如具備 OpenGL 的 GPU)。接著使用模型建立驗證設定、範例資料和預期的模型輸出內容。最後,呼叫 validateConfig() 以傳遞加速設定和驗證設定。

圖片

建立加速設定

加速設定是硬體設定的表示法,在執行時間會轉譯為委派項目。接著,加速服務會在內部使用這些設定來執行測試推論。

加速服務目前可讓您使用 GpuAccelerationConfig 和 CPU 推論 (使用 CpuAccelerationConfig),評估 GPU 設定 (在執行時間轉換為 GPU 委派)。我們正在努力開發,日後會支援更多委派代表存取其他硬體。

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();

驗證加速設定

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

執行下列指令,確認具備 Play 服務執行階段的 TensorFlow Lite 已正確初始化,且裝置可以使用 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() 回呼。

在解譯器中使用經過驗證的設定

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

設定快取

模型的最佳加速設定應該不會在裝置上變更。因此,收到令人滿意的加速設定後,應將其保存在裝置上,並讓應用程式擷取該設定,並在下列工作階段中使用它建立 InterpreterOptions,而不要執行另一項驗證。ValidatedAccelerationConfigResult 中的 serialize()deserialize() 方法可簡化儲存和擷取程序。

應用程式範例

如要查看 Acceleration Service 的即時整合,請查看範例應用程式

限制

加速服務目前有下列限制:

  • 目前僅支援 CPU 和 GPU 加速設定。
  • 這個功能僅支援 Google Play 服務中的 TensorFlow Lite,且在 TensorFlow Lite 套裝組合版本中無法使用。
  • 加速服務 SDK 僅支援 API 級別 22 以上。

注意事項

請詳閱以下注意事項,特別是您打算在實際工作環境中使用這個 SDK:

  • 在結束 Beta 版並發布 Acceleration Service API 的穩定版本之前,我們將發布新的 SDK,且這個 SDK 可能會與目前的 Beta 版稍有不同。如要繼續使用加速服務,您必須改用這個新的 SDK,並及時將更新推送至應用程式。否則可能會導致服務中斷,因為 Beta 版 SDK 一段時間後可能會與 Google Play 服務不相容。

  • 我們不保證 Acceleration Service API 或整個 API 中的特定功能一律都會正式發布。該程式庫可能會無限期保持 Beta 版狀態、遭到關閉,或與其他功能合併成專為特定開發人員目標對象設計的套件。某些採用 Acceleration Service API 或整個 API 的功能,最終可能會正式發布,但並沒有固定的時程。

條款與隱私權

《服務條款》

使用 Acceleration Service API 時需遵守《Google API 服務條款》。
此外,Acceleration Service API 目前為 Beta 版,因此使用此功能,即表示您確認上述注意事項一節中所述的潛在問題,也瞭解加速服務 API 不一定會按規定執行。

隱私權

使用 Acceleration Service API 時,輸入資料 (例如圖片、影片、文字) 處理作業會在裝置端進行,而且加速服務不會將這些資料傳送至 Google 伺服器。因此,您可以使用我們的 API 處理不應離開裝置的輸入資料。
Acceleration Service API 可能會不時與 Google 伺服器連線,以便接收錯誤修正、更新版模型和硬體加速相容性資訊等資訊。此外,Acceleration Service API 也會將應用程式中 API 的效能和使用率指標傳送給 Google。Google 會使用這些指標資料來評估效能、偵錯、維護及改善 API,以及偵測濫用或濫用行為,詳情請參閱《隱私權政策》。
您必須根據適用法律的規定,將 Google 如何處理加速服務指標資料,告知應用程式使用者。
我們蒐集的資料包括:

  • 裝置資訊 (例如製造商、型號、OS 版本和版本) 和可用的機器學習硬體加速器 (GPU 和 DSP)。用於診斷和用量分析。
  • 應用程式資訊 (套件名稱 / 軟體包 ID、應用程式版本)。用於診斷和使用分析。
  • API 設定 (例如圖片格式和解析度)。用於診斷和使用分析。
  • 事件類型 (例如初始化、下載模型、更新、執行、偵測)。用於診斷和使用情形分析。
  • 錯誤代碼。用於診斷。
  • 成效指標。用於診斷。
  • 無法明確識別使用者或實體裝置的單次安裝 ID。用於遠端設定和使用情況分析。
  • 網路要求傳送者 IP 位址。用於遠端設定診斷。收集的 IP 位址會暫時保留。

支援和意見回饋

你可以透過 TensorFlow Issue Tracker 提供意見回饋並取得支援。如要回報問題和支援要求,請在 Google Play 服務中使用 TensorFlow Lite 的問題範本