适用于 Android 的加速服务(Beta 版)

使用 GPU、NPU 或 DSP 等专用处理器进行硬件加速可以大幅提高推断性能(在某些情况下,将推断速度提高高达 10 倍),并改善支持机器学习的 Android 应用的用户体验。不过,鉴于用户可能拥有的硬件和驱动程序多种多样,为每个用户的设备选择最佳硬件加速配置可能并非易事。此外,在设备上启用错误的配置可能会导致用户体验不佳,因为延迟时间较长,在极少数情况下,还会因硬件不兼容而导致运行时错误或准确性问题。

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

Acceleration Service 会使用您的 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 推断的线程数。

创建验证配置

通过验证配置,您可以定义希望 Acceleration Service 评估推理的方式。您将使用这些变量传递:

  • 输入样本,
  • 预期输出,
  • 准确率验证逻辑。

请务必提供您预计模型能获得良好性能的输入样本(也称为“黄金”样本)。

使用 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>,该 API 会启用异步任务。
如需获取验证调用的结果,请添加 addOnSuccessListener() 回调。

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

检查回调中返回的 ValidatedAccelerationConfigResult 是否有效后,您可以将经过验证的配置设置为解释器调用 interpreterOptions.setAccelerationConfig() 的加速配置。

配置缓存

模型的最佳加速配置在设备上不太可能改变。因此,当您获得令人满意的加速配置后,应将其存储在设备上,并让应用检索该配置,并在后续会话期间使用它来创建 InterpreterOptions,而不是运行另一项验证。ValidatedAccelerationConfigResult 中的 serialize()deserialize() 方法可以简化存储和检索过程。

示例应用

如需查看加速服务的就地集成,请查看示例应用

限制

加速服务目前存在以下限制:

  • 目前仅支持 CPU 和 GPU 加速配置。
  • 它仅支持 Google Play 服务中的 TensorFlow Lite,如果您使用的是捆绑版 TensorFlow Lite,则无法使用它。
  • Acceleration Service 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 本身最终可能会正式发布,但这没有固定的时间表。

条款和隐私权

服务条款

使用加速服务 API 时需遵守 Google API 服务条款
此外,加速服务 API 目前处于 Beta 版阶段,因此,使用它,即表示您确认上述“注意事项”部分中列出的潜在问题,并确认加速服务有时可能无法按预期运行。

隐私权

当您使用加速服务 API 时,输入数据(例如图片、视频和文本)的处理完全在设备上进行,加速服务不会将这些数据发送到 Google 服务器。因此,您可以使用我们的 API 处理不应离开设备的输入数据。
Acceleration Service API 可能会不时与 Google 服务器通信,以便接收 bug 修复、更新后的模型和硬件加速器兼容性信息等信息。Acceleration Service API 还会向 Google 发送有关应用中 API 的性能和利用率的指标。如隐私权政策中所述,Google 会使用此指标数据来衡量性能、调试、维护和改进 API,以及检测滥用或滥用行为。
您有责任按照适用法律的要求,向使用您应用的用户说明 Google 会处理加速服务指标数据。
我们收集的数据包括:

  • 设备信息(例如制造商、型号、操作系统版本和 build)和可用的机器学习硬件加速器(GPU 和 DSP)。用于诊断和使用情况分析。
  • 应用信息(软件包名称 / 软件包 ID、应用版本)。用于诊断和使用情况分析。
  • API 配置(例如图片格式和分辨率)。用于诊断和使用情况分析。
  • 事件类型(例如初始化、下载模型、更新、运行、检测)。 用于诊断和使用情况分析。
  • 错误代码。用于诊断。
  • 效果指标。用于诊断。
  • 不能唯一标识用户或实体设备的每次安装标识符。用于进行远程配置和使用情况分析。
  • 网络请求发送者 IP 地址。用于远程配置诊断。收集的 IP 地址会暂时保留。

支持与反馈

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