Servicio de aceleración para Android (beta)

El uso de procesadores especializados, como GPU, NPU o DSP para hardware La aceleración puede mejorar drásticamente el rendimiento de la inferencia (hasta 10 veces más rápido inferencia en algunos casos) y la experiencia del usuario de tu dispositivo Android y mantener la integridad de su aplicación. Sin embargo, debido a la variedad de hardware y controladores, los usuarios podrían y elige la configuración de aceleración de hardware óptima para las necesidades dispositivo puede ser un desafío. Además, habilitar la configuración incorrecta en un puede causar una mala experiencia del usuario debido a la alta latencia o, en errores de tiempo de ejecución o problemas de precisión causados por incompatibilidades de hardware.

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

El servicio de aceleración evalúa diferentes configuraciones de aceleración en el usuario a través de la ejecución de comparativas de inferencia internas con tu LiteRT un modelo de responsabilidad compartida. Estas ejecuciones de prueba suelen completarse en pocos segundos, dependiendo de un modelo de responsabilidad compartida. Puedes ejecutar las comparativas una vez en cada dispositivo del usuario antes de la inferencia almacenar en caché el resultado y usarlo durante la inferencia. Estas comparativas se ejecutan fuera del proceso; lo que minimiza el riesgo de fallas en tu app.

Proporciona tu modelo, muestras de datos y resultados esperados (entradas “doradas” y resultados) y el servicio de aceleración ejecutará una inferencia interna de TFLite para ofrecerte recomendaciones de hardware.

imagen

Acceleration Service forma parte de la pila de AA personalizada de Android y funciona con LiteRT 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 de Acceleration Service funciona con LiteRT en Google Play. Servicios Si aún no usan el entorno de ejecución LiteRT proporcionado a través de los Servicios de Play, deberás actualizar tus dependencies.

Cómo usar la API de Acceleration Service

Para usar el servicio de aceleración, crea la configuración de aceleración que quieres evaluar para tu modelo (p. ej., GPU con OpenGL). Luego, crea configuración de validación con tu modelo, algunos datos de muestra y los salida del modelo. Por último, llama a validateConfig() y pasa ambos de aceleración y validación.

imagen

Cómo 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, el servicio de aceleración usará estos parámetros de configuración internamente para realizar inferencias de prueba.

En este momento, el servicio de aceleración permite evaluar las GPU parámetros de configuración (se convierten en delegados de GPU durante el tiempo de ejecución) con el GpuAccelerationConfig y la inferencia de CPU (con CpuAccelerationConfig). Estamos trabajando para que más delegados puedan acceder a otro hardware en el en el futuro.

Configuración de aceleración de GPU

Crea 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 usa cuantización con setEnableQuantizedInference()

Configuración de aceleración de la CPU

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

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

Usa el setNumThreads() para definir la cantidad de subprocesos que quieres usar para evaluar la CPU la inferencia.

Crear configuraciones de validación

Los parámetros de configuración de validación te permiten definir cómo deseas que se aplique la Servicio para evaluar inferencias. Las usarás para pasar lo siguiente:

  • muestras de entrada,
  • los resultados esperados,
  • la lógica de validación de exactitud.

Asegúrate de proporcionar muestras de entrada de las que esperas un buen rendimiento para tu modelo (también conocidas como muestras “doradas”).

Crea un ValidationConfig con CustomValidationConfig.Builder de la siguiente manera:

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

Especifica la cantidad de muestras doradas con setBatchSize() Pasa las entradas de tus muestras doradas con el siguiente setGoldenInputs() Proporciona el resultado esperado de la entrada que se pasó con setGoldenOutputs()

Puedes definir un tiempo máximo de inferencia con setInferenceTimeoutMillis(). (5,000 ms de forma predeterminada). Si la inferencia lleva más tiempo que el tiempo definido, se rechazará la configuración.

De manera opcional, también puedes 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úrate de definir una lógica de validación que funcione para tu caso de uso.

Ten en cuenta que si los datos de validación ya están incorporados en el modelo, puedes usar EmbeddedValidationConfig

Genera resultados de validación

Los resultados dorados son opcionales y, siempre que proporciones entradas doradas, el El servicio de aceleración puede generar internamente los resultados dorados. También puedes definir la configuración de aceleración que se usa para generar estas salidas doradas Llamando a setGoldenConfig():

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

Valida la configuración de la aceleración

Una vez que hayas creado una configuración de aceleración y una de validación, puedes evaluarlas para tu modelo.

Asegúrate de que el entorno de ejecución de LiteRT con Servicios de Play esté funcionando correctamente se inicialice y que el delegado de la GPU esté disponible para el dispositivo ejecutando lo siguiente:

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

Crea una instancia de AccelerationService. llamando a AccelerationService.create()

Luego, puedes validar la configuración de aceleración para tu 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 puedes validar varios parámetros de configuración llamando validateConfigs() y pasar un objeto Iterable<AccelerationConfig> como parámetro.

validateConfig()mostrará un Task<ValidatedAccelerationConfigResult> desde los Servicios de Google Play API de Task que permite las tareas asíncronas.
Para obtener el resultado de la llamada de validación, agrega un addOnSuccessListener() devolución de llamada.

Usa la configuración validada en tu intérprete

Después de verificar si ValidatedAccelerationConfigResult se mostró en el es válida, puedes establecer la configuración validada como una configuración de aceleración. para tu intérprete llamando a interpreterOptions.setAccelerationConfig().

Almacenamiento en caché de la configuración

Es poco probable que la configuración de aceleración óptima para tu modelo cambie en el dispositivo. Una vez que recibes una configuración de aceleración satisfactoria, debe almacenarla en el dispositivo y dejar que tu aplicación la recupere y la use para crea tu InterpreterOptions durante las siguientes sesiones en lugar de ejecutando otra validación. Los métodos serialize() y deserialize() en ValidatedAccelerationConfigResult realizan el proceso de almacenamiento y recuperación y fácil de usar.

Aplicación de ejemplo

Para revisar una integración in situ del Acceleration Service, consulta el app de ejemplo.

Limitaciones

Actualmente, el servicio de aceleración tiene las siguientes limitaciones:

  • Por el momento, solo se admiten las configuraciones de aceleración de CPU y GPU.
  • Solo es compatible con LiteRT en los Servicios de Google Play y no puedes utilízalo si usas la versión integrada de LiteRT.
  • El SDK de Acceleration Service solo es compatible con el nivel de API 22 y versiones posteriores.

Advertencias

Revisa atentamente las siguientes advertencias, especialmente si estás planificando para usar este SDK en producción:

  • Antes de salir del programa Beta y lanzar la versión estable, API de Acceleration Service, publicaremos un nuevo SDK que puede tener diferencias con respecto a la versión beta actual. Para seguir usando de Acceleration, deberás migrar a este SDK nuevo y enviar la actualización de la app de manera oportuna. De lo contrario, se podrían producir fallas es posible que el SDK beta ya no sea compatible con Google Play Services después de algún tiempo.

  • No hay garantía de que un atributo específico de la La API del servicio o la API en su totalidad estarán disponibles de manera general. Integra pueden permanecer en Beta de forma indefinida, cerrarse o combinarse con otras en paquetes diseñados para públicos de desarrolladores específicos. Algunos con la API de Acceleration Service o toda la API con el tiempo estarán disponibles de forma general, pero no hay un cronograma fijo esto.

Condiciones y privacidad

Condiciones del Servicio

El uso de las APIs de Acceleration Service está sujeto a las Condiciones del Servicio de las APIs de Google Service.
Además, las APIs de Acceleration Service se encuentran actualmente en versión beta. y, como tal, al usarlo, reconoces los posibles problemas descritos en las Advertencias anteriores y reconoce que el Servicio de aceleración no podrá funcionen siempre según lo especificado.

Privacidad

Cuando usas las APIs de Acceleration Service, el procesamiento de los datos de entrada (p.ej., imágenes, video o texto) se realiza en el dispositivo, y el Servicio de aceleración no envía esos datos a los servidores de Google. Por ello, puedes usar nuestras APIs para procesar datos de entrada que no deben salir del dispositivo.
Las APIs de Acceleration Service pueden comunicarse con los servidores de Google ocasionalmente para recibir correcciones de errores, modelos actualizados y acelerador de hardware información de compatibilidad. Las APIs de Acceleration Service también envían métricas sobre el rendimiento y el uso de las APIs de tu app en Google. Google usa estos datos de métricas para medir el rendimiento, depurar, mantener y mejorar las APIs y detectar usos inadecuados o abusos, tal como se describe en nuestra sección Política.
Usted es responsable de informar a los usuarios de la aplicación sobre el procesamiento que realiza Google. de los datos de métricas del Servicio de aceleración según lo exija la ley aplicable.
Los datos que recopilamos incluyen lo siguiente:

  • Información del dispositivo (como el fabricante, el modelo, la versión del SO y la compilación) aceleradores de hardware para AA disponibles (GPU y DSP). Se usa para diagnósticos y estadísticas de uso.
  • Información de la aplicación (nombre del paquete / ID del paquete, versión de la aplicación) Se usa para las estadísticas de uso y diagnóstico.
  • Configuración de la API (como el formato y la resolución de imagen) Se usa para las estadísticas de uso y diagnóstico.
  • Tipo de evento (como inicialización, descarga del modelo, actualización, ejecución y detección). Se usa para diagnósticos y estadísticas de uso.
  • Códigos de error Se usa para diagnósticos.
  • Métricas de rendimiento Se usa para diagnósticos.
  • Los identificadores por instalación que no identifican de manera inequívoca a un usuario o dispositivo físico. Se usa para la operación de configuración y uso remotos de análisis de datos en la nube.
  • Direcciones IP del remitente de la solicitud de red. Se usa para la configuración remota diagnóstico. Las direcciones IP recopiladas se conservan temporalmente.

Asistencia y comentarios

Puedes enviar comentarios y obtener asistencia a través de la Herramienta de seguimiento de errores de TensorFlow. Informa problemas y solicitudes de asistencia a través de la plantilla de problemas para LiteRT en los Servicios de Google Play.