使用 GPU、NPU 或 DSP 等专用处理器进行硬件加速可以显著提高推理性能(在某些情况下推理速度提高 10 倍),并改善您支持 ML 的 Android 应用程序的用户体验。但是,鉴于用户可能拥有各种硬件和驱动程序,为每个用户的设备选择最佳硬件加速配置可能具有挑战性。此外,在设备上启用错误的配置可能会导致用户体验不佳,因为延迟过高,或者在极少数情况下,由于硬件不兼容导致运行时错误或精度问题。
Android 加速服务是一个 API,可帮助您为给定的用户设备和您的 .tflite
模型选择最佳硬件加速配置,同时最大程度地降低运行时错误或精度问题的风险。
Android 加速服务通过使用您的 TensorFlow Lite 模型运行内部推理基准测试来评估用户设备上的不同加速配置。这些测试运行通常在几秒钟内完成,具体取决于您的模型。您可以在每次用户设备上运行基准测试,并在推理之前缓存结果,并在推理期间使用它。这些基准测试是在进程外运行的;这最大程度地降低了应用程序崩溃的风险。
提供您的模型、数据样本和预期结果(“黄金”输入和输出),加速服务将运行内部 TFLite 推理基准测试,为您提供硬件建议。
加速服务是 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()
。
创建加速配置
加速配置是硬件配置的表示形式,这些配置在执行期间被转换为代理。然后,加速服务将在内部使用这些配置来执行测试推理。
目前,加速服务允许您使用 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 的问题和支持请求。