使用 Java/Kotlin 解释器 API 的 GPU 加速委托

使用图形处理单元 (GPU) 运行机器学习 (ML) 模型可以显著提高机器学习支持的应用程序的性能和用户体验。在 Android 设备上,您可以启用

委托 和以下 API 之一

  • Java/Kotlin 解释器 API - 本指南
  • 任务库 API - 指南
  • 原生 (C/C++) API - 指南

本页介绍如何使用解释器 API 在 Android 应用程序中为 TensorFlow Lite 模型启用 GPU 加速。有关使用 TensorFlow Lite 的 GPU 委托的更多信息(包括最佳实践和高级技术),请参阅 GPU 委托 页面。

使用 Google Play 服务在 TensorFlow Lite 中使用 GPU

TensorFlow Lite Java/Kotlin 解释器 API 提供了一组通用 API,用于构建机器学习应用程序。本节介绍如何使用 Google Play 服务的 TensorFlow Lite 与这些 API 结合使用 GPU 加速委托。

使用 Google Play 服务的 TensorFlow Lite 是在 Android 上使用 TensorFlow Lite 的推荐方法。如果您的应用程序面向未运行 Google Play 的设备,请参阅 使用解释器 API 和独立 TensorFlow Lite 的 GPU 部分。

添加项目依赖项

要启用对 GPU 委托的访问,请将 com.google.android.gms:play-services-tflite-gpu 添加到您的应用程序的 build.gradle 文件中

dependencies {
    ...
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
}

启用 GPU 加速

然后使用 GPU 支持初始化 Google Play 服务的 TensorFlow Lite

Kotlin

    val useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

    val interpreterTask = useGpuTask.continueWith { useGpuTask ->
      TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
          .setEnableGpuDelegateSupport(useGpuTask.result)
          .build())
      }
      

Java

    Task useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context);

    Task interpreterOptionsTask = useGpuTask.continueWith({ task ->
      TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
    });
      

最后,您可以通过 InterpreterApi.Options 传递 GpuDelegateFactory 来初始化解释器

Kotlin

    val options = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(GpuDelegateFactory())

    val interpreter = InterpreterApi(model, options)

    // Run inference
    writeToInput(input)
    interpreter.run(input, output)
    readFromOutput(output)
      

Java

    Options options = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
      .addDelegateFactory(new GpuDelegateFactory());

    Interpreter interpreter = new InterpreterApi(model, options);

    // Run inference
    writeToInput(input);
    interpreter.run(input, output);
    readFromOutput(output);
      

GPU 委托也可以与 Android Studio 中的 ML 模型绑定一起使用。有关更多信息,请参阅 使用元数据生成模型接口

使用独立 TensorFlow Lite 的 GPU

如果您的应用程序面向未运行 Google Play 的设备,则可以将 GPU 委托捆绑到您的应用程序中,并将其与独立版本的 TensorFlow Lite 一起使用。

添加项目依赖项

要启用对 GPU 委托的访问,请将 org.tensorflow:tensorflow-lite-gpu-delegate-plugin 添加到您的应用程序的 build.gradle 文件中

dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite'
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin'
}

启用 GPU 加速

然后使用 TfLiteDelegate 在 GPU 上运行 TensorFlow Lite。在 Java 中,您可以通过 Interpreter.Options 指定 GpuDelegate

Kotlin

      import org.tensorflow.lite.Interpreter
      import org.tensorflow.lite.gpu.CompatibilityList
      import org.tensorflow.lite.gpu.GpuDelegate

      val compatList = CompatibilityList()

      val options = Interpreter.Options().apply{
          if(compatList.isDelegateSupportedOnThisDevice){
              // if the device has a supported GPU, add the GPU delegate
              val delegateOptions = compatList.bestOptionsForThisDevice
              this.addDelegate(GpuDelegate(delegateOptions))
          } else {
              // if the GPU is not supported, run on 4 threads
              this.setNumThreads(4)
          }
      }

      val interpreter = Interpreter(model, options)

      // Run inference
      writeToInput(input)
      interpreter.run(input, output)
      readFromOutput(output)
      

Java

      import org.tensorflow.lite.Interpreter;
      import org.tensorflow.lite.gpu.CompatibilityList;
      import org.tensorflow.lite.gpu.GpuDelegate;

      // Initialize interpreter with GPU delegate
      Interpreter.Options options = new Interpreter.Options();
      CompatibilityList compatList = CompatibilityList();

      if(compatList.isDelegateSupportedOnThisDevice()){
          // if the device has a supported GPU, add the GPU delegate
          GpuDelegate.Options delegateOptions = compatList.getBestOptionsForThisDevice();
          GpuDelegate gpuDelegate = new GpuDelegate(delegateOptions);
          options.addDelegate(gpuDelegate);
      } else {
          // if the GPU is not supported, run on 4 threads
          options.setNumThreads(4);
      }

      Interpreter interpreter = new Interpreter(model, options);

      // Run inference
      writeToInput(input);
      interpreter.run(input, output);
      readFromOutput(output);
      

量化模型

Android GPU 委托库默认支持量化模型。您无需进行任何代码更改即可将量化模型与 GPU 委托一起使用。以下部分介绍如何禁用量化支持以进行测试或实验目的。

禁用量化模型支持

以下代码展示了如何禁用对量化模型的支持。

Java

GpuDelegate delegate = new GpuDelegate(new GpuDelegate.Options().setQuantizedModelsAllowed(false));

Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

有关使用 GPU 加速运行量化模型的更多信息,请参阅 GPU 代理 概述。