Android 加速服务(Beta 版)

使用 GPU、NPU 或 DSP 等专用处理器进行硬件加速可以显著提高推理性能(在某些情况下推理速度提高 10 倍),并改善您支持 ML 的 Android 应用程序的用户体验。但是,鉴于用户可能拥有各种硬件和驱动程序,为每个用户的设备选择最佳硬件加速配置可能具有挑战性。此外,在设备上启用错误的配置可能会导致用户体验不佳,因为延迟过高,或者在极少数情况下,由于硬件不兼容导致运行时错误或精度问题。

Android 加速服务是一个 API,可帮助您为给定的用户设备和您的 .tflite 模型选择最佳硬件加速配置,同时最大程度地降低运行时错误或精度问题的风险。

Android 加速服务通过使用您的 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 代理)和使用 CpuAccelerationConfig 的 CPU 推理。我们正在努力在未来支持更多代理以访问其他硬件。

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 Services 运行时已正确初始化,并且通过运行以下命令,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>,该 API 支持异步任务。
要获取验证调用的结果,请添加一个 addOnSuccessListener() 回调。

在您的解释器中使用经过验证的配置

在检查回调中返回的 ValidatedAccelerationConfigResult 是否有效后,您可以将经过验证的配置设置为解释器的加速配置,方法是调用 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,它可能与当前的 Beta 版本有所不同。为了继续使用加速服务,您需要迁移到这个新的 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 配置(例如图像格式和分辨率)。用于诊断和使用情况分析。
  • 事件类型(例如初始化、下载模型、更新、运行、检测)。用于诊断和使用情况分析。
  • 错误代码。用于诊断。
  • 性能指标。用于诊断。
  • 不唯一标识用户或物理设备的每个安装标识符。用于远程配置和使用情况分析的操作。
  • 网络请求发送方 IP 地址。用于远程配置诊断。收集的 IP 地址将暂时保留。

支持和反馈

您可以通过 TensorFlow 问题跟踪器提供反馈并获得支持。请使用 问题模板 报告 Google Play 服务中的 TensorFlow Lite 的问题和支持请求。