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 (inferencia hasta 10 veces más rápida en algunos casos) y la experiencia del usuario de su aplicación 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 ser un desafío. Además, habilitar la configuración incorrecta en un dispositivo puede crear una experiencia de usuario deficiente debido a la 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 lo ayuda a elegir la configuración de aceleración de hardware óptima para un dispositivo de usuario determinado y su modelo .tflite , mientras 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 internos 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 bloqueos en su aplicación.

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

imagen

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

Agrega las dependencias a tu proyecto

Agrega las siguientes dependencias al archivo build.gradle de tu 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 usa el tiempo de ejecución de TensorFlow Lite provisto a través de Play Services, deberá actualizar sus dependencias .

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

Para usar 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() para pasar 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. El servicio de aceleración luego usará 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 la inferencia de GpuAccelerationConfig y CPU (con CpuAccelerationConfig ). Estamos trabajando para ayudar a más delegados a acceder 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 está utilizando 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();

Use el método setNumThreads() para definir la cantidad de subprocesos que desea usar 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 usarás para pasar:

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

Asegúrese de proporcionar muestras de entrada para 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 toma más tiempo que el tiempo que definiste, 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 incrustados en su modelo, puede usar EmbeddedValidationConfig .

Generar salidas de validación

Las salidas doradas son opcionales y siempre que proporcione entradas doradas, Acceleration Service puede generar internamente las salidas doradas. 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úrate de que el tiempo de ejecución de TensorFlow Lite con Play Services se haya inicializado correctamente 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()
      )
   );

Crea 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 varias configuraciones llamando validateConfigs() y pasando un objeto Iterable<AccelerationConfig> como parámetro.

validateConfig() devolverá una Task< ValidatedAccelerationConfigResult > de la Task Api de los servicios de Google Play que habilita las 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 establecer la configuración validada como una configuración de aceleración para su intérprete llamando interpreterOptions.setAccelerationConfig() .

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.

Ejemplo de aplicación

Para revisar una integración in situ de Acceleration Service, eche un vistazo a la aplicación de muestra .

Limitaciones

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

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

Advertencias

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

  • Antes de salir de Beta y lanzar la versión estable para la API de Acceleration Service, publicaremos un nuevo SDK que puede tener algunas diferencias con el Beta actual. Para continuar usando el servicio de aceleración, deberá migrar a este nuevo SDK y enviar una actualización a su aplicación de manera oportuna. No hacerlo puede causar fallas, ya que es posible que Beta SDK ya no sea compatible con los servicios de Google Play después de un tiempo.

  • No hay garantía de que una función específica dentro de la API de Acceleration Service o la API en su conjunto esté disponible de forma general. Puede permanecer en Beta indefinidamente, cerrarse o combinarse con otras funciones en paquetes diseñados para audiencias específicas de desarrolladores. Algunas funciones con la API del servicio de aceleración o la API completa pueden eventualmente estar disponibles de forma general, pero no hay 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 el Servicio de aceleración no siempre puede funcionar como se especifica.

Privacidad

Cuando utiliza las API del Servicio de aceleración, el procesamiento de los datos de entrada (p. ej., imágenes, video, texto) ocurre completamente en el dispositivo y el Servicio de aceleración no envía esos datos a los servidores de Google . Como resultado, puede usar nuestras API para procesar datos de entrada que no deberían salir del dispositivo.
Las API del servicio de aceleración pueden ponerse en contacto con los servidores de Google de vez en cuando para recibir cosas 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 más detalladamente en nuestra Política de privacidad .
Usted es responsable de informar a los usuarios de su aplicación sobre el procesamiento 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 lo siguiente:

  • Información del dispositivo (como fabricante, modelo, versión del sistema operativo y compilación) y aceleradores de hardware ML disponibles (GPU y DSP). Se utiliza para diagnósticos 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ósticos y análisis de uso.
  • Configuración de API (como formato de imagen y resolución). Se utiliza para diagnósticos y análisis de uso.
  • Tipo de evento (como inicializar, descargar modelo, actualizar, ejecutar, detección). Se utiliza para diagnósticos y análisis de uso.
  • Códigos de error. Se utiliza para diagnósticos.
  • Métricas de rendimiento. Se utiliza para diagnósticos.
  • Identificadores por instalación que no identifican de forma exclusiva 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 solicitud de red. Se utiliza para diagnósticos de configuración remota. Las direcciones IP recopiladas se conservan temporalmente.

Soporte y retroalimentación

Puede proporcionar comentarios y obtener soporte a través del Rastreador de problemas de TensorFlow. Informe los problemas y las solicitudes de asistencia mediante la plantilla de problemas para TensorFlow Lite en los servicios de Google Play.