使用 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 问题模板报告问题和支持请求。