Servicio de aceleración para Android (Beta)

El uso de procesadores especializados como GPU, NPU o DSP para la aceleración de hardware puede mejorar drásticamente el rendimiento de la inferencia (hasta 10 veces más rápida en algunos casos) y la experiencia del usuario de su aplicación de Android habilitada para ML. Sin embargo, dada la variedad de hardware y controladores que pueden tener sus usuarios, elegir la configuración de aceleración de hardware óptima para el dispositivo de cada usuario puede resultar un desafío. Además, habilitar una configuración incorrecta en un dispositivo puede generar una mala experiencia de usuario debido a una alta latencia o, en algunos casos raros, errores de tiempo de ejecución o problemas de precisión causados ​​por incompatibilidades de hardware.

Acceleration Service para Android es una API que le ayuda a elegir la configuración óptima de aceleración de hardware para un dispositivo de usuario determinado y su modelo .tflite , al tiempo que minimiza el riesgo de errores de tiempo de ejecución o problemas de precisión.

Acceleration Service evalúa diferentes configuraciones de aceleración en los dispositivos de los usuarios mediante la ejecución de puntos de referencia de inferencia interna con su modelo TensorFlow Lite. Estas ejecuciones de prueba generalmente se completan en unos segundos, según su modelo. Puede ejecutar los puntos de referencia una vez en cada dispositivo de usuario antes del tiempo de inferencia, almacenar en caché el resultado y usarlo durante la inferencia. Estos puntos de referencia se ejecutan fuera de proceso; lo que minimiza el riesgo de fallas en su aplicación.

Proporcione su modelo, muestras de datos y resultados esperados (entradas y salidas "óptimas") y Acceleration Service ejecutará un punto de referencia de inferencia interno de TFLite para brindarle recomendaciones de hardware.

imagen

Acceleration Service es parte de la pila de aprendizaje automático personalizada de Android y funciona con TensorFlow Lite en los servicios de Google Play .

Añade las dependencias a tu proyecto.

Agregue las siguientes dependencias al archivo build.gradle de su aplicación:

implementation  "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"

La API del servicio de aceleración funciona con TensorFlow Lite en Google Play Services . Si aún no estás utilizando el tiempo de ejecución de TensorFlow Lite proporcionado a través de Play Services, deberás actualizar tus dependencias .

Cómo utilizar la API del servicio de aceleración

Para utilizar el Servicio de aceleración, comience creando la configuración de aceleración que desea evaluar para su modelo (por ejemplo, GPU con OpenGL). Luego cree una configuración de validación con su modelo, algunos datos de muestra y el resultado esperado del modelo. Finalmente llame validateConfig() pasando tanto su configuración de aceleración como su configuración de validación.

imagen

Crear configuraciones de aceleración

Las configuraciones de aceleración son representaciones de las configuraciones de hardware que se traducen en delegados durante el tiempo de ejecución. Luego, Acceleration Service utilizará estas configuraciones internamente para realizar inferencias de prueba.

Por el momento, el servicio de aceleración le permite evaluar las configuraciones de GPU (convertidas a delegado de GPU durante el tiempo de ejecución) con GpuAccelerationConfig y la inferencia de CPU (con CpuAccelerationConfig ). Estamos trabajando para permitir que más delegados accedan a otro hardware en el futuro.

Configuración de aceleración de GPU

Cree una configuración de aceleración de GPU de la siguiente manera:

AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
  .setEnableQuantizedInference(false)
  .build();

Debe especificar si su modelo utiliza o no la cuantificación con setEnableQuantizedInference() .

Configuración de aceleración de CPU

Cree la aceleración de la CPU de la siguiente manera:

AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
  .setNumThreads(2)
  .build();

Utilice el método setNumThreads() para definir la cantidad de subprocesos que desea utilizar para evaluar la inferencia de la CPU.

Crear configuraciones de validación

Las configuraciones de validación le permiten definir cómo desea que Acceleration Service evalúe las inferencias. Los utilizarás para aprobar:

  • muestras de entrada,
  • resultados esperados,
  • Lógica de validación de precisión.

Asegúrese de proporcionar muestras de entrada de las que espera un buen rendimiento de su modelo (también conocidas como muestras "doradas").

Cree una ValidationConfig con CustomValidationConfig.Builder de la siguiente manera:

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenOutputs(outputBuffer)
   .setAccuracyValidator(new MyCustomAccuracyValidator())
   .build();

Especifique el número de muestras doradas con setBatchSize() . Pase las entradas de sus muestras doradas usando setGoldenInputs() . Proporcione el resultado esperado para la entrada pasada con setGoldenOutputs() .

Puede definir un tiempo de inferencia máximo con setInferenceTimeoutMillis() (5000 ms por defecto). Si la inferencia tarda más del tiempo que usted definió, la configuración será rechazada.

Opcionalmente, también puede crear un AccuracyValidator personalizado de la siguiente manera:

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;

   }
}

Asegúrese de definir una lógica de validación que funcione para su caso de uso.

Tenga en cuenta que si los datos de validación ya están integrados en su modelo, puede usar EmbeddedValidationConfig .

Generar resultados de validación

Las salidas doradas son opcionales y, siempre que proporcione entradas doradas, el Servicio de Aceleración puede generar las salidas doradas internamente. También puede definir la configuración de aceleración utilizada para generar estas salidas doradas llamando setGoldenConfig() :

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenConfig(customCpuAccelerationConfig)
   [...]
   .build();

Validar configuración de aceleración

Una vez que haya creado una configuración de aceleración y una configuración de validación, puede evaluarlas para su modelo.

Asegúrese de que el tiempo de ejecución de TensorFlow Lite con Play Services esté correctamente inicializado y que el delegado de GPU esté disponible para el dispositivo ejecutando:

TfLiteGpu.isGpuDelegateAvailable(context)
   .onSuccessTask(gpuAvailable -> TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(gpuAvailable)
        .build()
      )
   );

Cree una instancia de AccelerationService llamando AccelerationService.create() .

Luego puede validar su configuración de aceleración para su modelo llamando 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);
});

También puede validar múltiples configuraciones llamando validateConfigs() y pasando un objeto Iterable<AccelerationConfig> como parámetro.

validateConfig() devolverá una Task< ValidatedAccelerationConfigResult > de la API de tareas de servicios de Google Play que permite tareas asincrónicas.
Para obtener el resultado de la llamada de validación, agregue una devolución de llamada addOnSuccessListener() .

Utilice la configuración validada en su intérprete

Después de verificar si el ValidatedAccelerationConfigResult devuelto en la devolución de llamada es válido, puede configurar la configuración validada como una configuración de aceleración para su intérprete llamando interpreterOptions.setAccelerationConfig() .

Almacenamiento en caché de configuración

Es poco probable que la configuración de aceleración óptima para su modelo cambie en el dispositivo. Entonces, una vez que reciba una configuración de aceleración satisfactoria, debe almacenarla en el dispositivo y dejar que su aplicación la recupere y la use para crear sus InterpreterOptions durante las siguientes sesiones en lugar de ejecutar otra validación. Los métodos serialize() y deserialize() en ValidatedAccelerationConfigResult facilitan el proceso de almacenamiento y recuperación.

Aplicación de muestra

Para revisar una integración in situ del Servicio de Aceleración, eche un vistazo a la aplicación de muestra .

Limitaciones

El Servicio de Aceleración tiene las siguientes limitaciones actuales:

  • Por el momento, solo se admiten configuraciones de aceleración de CPU y GPU.
  • Solo es compatible con TensorFlow Lite en los servicios de Google Play y no puedes usarlo si estás usando la versión incluida de TensorFlow Lite.
  • No es compatible con la biblioteca de tareas de TensorFlow Lite ya que no puede inicializar BaseOptions directamente con el objeto ValidatedAccelerationConfigResult .
  • El SDK de Acceleration Service solo admite el nivel de API 22 y superior.

Advertencias

Revise atentamente las siguientes advertencias, especialmente si planea utilizar este SDK en producción:

  • Antes de salir de la Beta y lanzar la versión estable de la API del Servicio de Aceleración, publicaremos un nuevo SDK que puede tener algunas diferencias con respecto a la Beta actual. Para continuar usando el Servicio de Aceleración, deberá migrar a este nuevo SDK e implementar una actualización en su aplicación de manera oportuna. No hacerlo puede provocar roturas, ya que es posible que el SDK Beta ya no sea compatible con los servicios de Google Play después de un tiempo.

  • No hay garantía de que una característica específica dentro de la API del Servicio de Aceleración o de la API en su conjunto alguna vez esté disponible de forma generalizada. Puede permanecer en versión Beta indefinidamente, cerrarse o combinarse con otras funciones en paquetes diseñados para audiencias de desarrolladores específicas. Algunas funciones de la API del Servicio de Aceleración o de la API completa pueden llegar a estar disponibles de forma generalizada, pero no existe un cronograma fijo para esto.

Términos y privacidad

Términos de servicio

El uso de las API del Servicio de Aceleración está sujeto a los Términos de Servicio de las API de Google .
Además, las API del Servicio de Aceleración se encuentran actualmente en versión beta y, como tal, al usarlas usted reconoce los posibles problemas descritos en la sección Advertencias anterior y reconoce que es posible que el Servicio de Aceleración no siempre funcione como se especifica.

Privacidad

Cuando utiliza las API del Servicio de Aceleración, el procesamiento de los datos de entrada (por ejemplo, imágenes, videos, texto) se realiza completamente en el dispositivo y el Servicio de Aceleración no envía esos datos a los servidores de Google . Como resultado, puede utilizar nuestras API para procesar datos de entrada que no deben salir del dispositivo.
Las API del servicio de aceleración pueden comunicarse con los servidores de Google de vez en cuando para recibir elementos como correcciones de errores, modelos actualizados e información de compatibilidad del acelerador de hardware. Las API del servicio de aceleración también envían métricas sobre el rendimiento y la utilización de las API en su aplicación a Google. Google utiliza estos datos de métricas para medir el rendimiento, depurar, mantener y mejorar las API, y detectar el uso indebido o el abuso, como se describe con más detalle en nuestra Política de privacidad .
Usted es responsable de informar a los usuarios de su aplicación sobre el procesamiento por parte de Google de los datos de métricas del Servicio de Aceleración según lo exige la ley aplicable.
Los datos que recopilamos incluyen los siguientes:

  • Información del dispositivo (como fabricante, modelo, versión del sistema operativo y compilación) y aceleradores de hardware de ML disponibles (GPU y DSP). Se utiliza para diagnóstico y análisis de uso.
  • Información de la aplicación (nombre del paquete/ID del paquete, versión de la aplicación). Se utiliza para diagnóstico y análisis de uso.
  • Configuración de API (como formato de imagen y resolución). Se utiliza para diagnóstico y análisis de uso.
  • Tipo de evento (como inicialización, descarga de modelo, actualización, ejecución, detección). Se utiliza para diagnóstico y análisis de uso.
  • Códigos de error. Utilizado para diagnóstico.
  • Métricas de rendimiento. Utilizado para diagnóstico.
  • Identificadores por instalación que no identifican de forma única a un usuario o dispositivo físico. Se utiliza para la operación de configuración remota y análisis de uso.
  • Direcciones IP del remitente de solicitudes de red. Se utiliza para diagnósticos de configuración remota. Las direcciones IP recopiladas se conservan temporalmente.

Apoyo y comentarios

Puede proporcionar comentarios y obtener soporte a través de TensorFlow Issue Tracker. Informe problemas y solicitudes de soporte utilizando la plantilla de problemas para TensorFlow Lite en los servicios de Google Play.