Delegados de TensorFlow Lite

Los delegados habilitan la aceleración de hardware de los modelos de TensorFlow Lite aprovechando los aceleradores del dispositivo, como la GPU y el procesador de señales digitales (DSP).

De forma predeterminada, TensorFlow Lite usa kernels de CPU optimizados para el conjunto de instrucciones ARM Neon. Sin embargo, la CPU es un procesador multipropósito que no está necesariamente optimizado para la aritmética pesada que se suele encontrar en los modelos de aprendizaje automático (por ejemplo, las matemáticas de las matrices que intervienen en la convolución y las capas densas).

Por otro lado, la mayoría de los teléfonos celulares modernos contienen chips que son mejores para manejar estas operaciones pesadas. Su uso para operaciones de redes neuronales proporciona enormes beneficios en términos de latencia y eficiencia energética. Por ejemplo, las GPU pueden proporcionar una velocidad de hasta 5 veces en latencia, mientras que la DSP de Qualcomm® Hexagon demostró que reduce el consumo de energía hasta un 75% en nuestros experimentos.

Cada uno de estos aceleradores tiene APIs asociadas que habilitan cálculos personalizados, como OpenCL o OpenGLES para GPU móviles. Por lo general, tendrás que escribir mucho código personalizado para ejecutar una red neuronal a través de estas interfaces. El proceso se vuelve aún más complejo cuando se considera que cada acelerador tiene sus ventajas y desventajas, y no puede ejecutar todas las operaciones en una red neuronal. La API de delegado de TensorFlow Lite resuelve este problema, ya que actúa como puente entre el entorno de ejecución de TFLite y estas APIs de nivel inferior.

entorno de ejecución con delegados

Cómo elegir un delegado

TensorFlow Lite admite varios delegados, cada uno de los cuales está optimizado para ciertas plataformas y tipos de modelos específicos. Por lo general, habrá varios delegados aplicables a tu caso práctico, según dos criterios principales: la plataforma (¿Android o iOS?) a la que te orientes y el Tipo de modelo (¿punto flotante o cuantificado?) que intentas acelerar.

Delegados por plataforma

Multiplataforma (iOS y Android)

  • Delegado de GPU: El delegado de GPU se puede usar tanto en Android como en iOS. Está optimizada para ejecutar modelos basados en números de punto flotante de 32 y 16 bits en los que haya una GPU disponible. También admite modelos cuantificados de 8 bits y proporciona un rendimiento de la GPU al mismo nivel que sus versiones flotantes. Para obtener detalles sobre el delegado de la GPU, consulta TensorFlow Lite en GPU.

iOS

  • Delegado de Core ML para iPhones y iPads más recientes: En los iPhones y iPads más nuevos, donde Neural Engine está disponible, puedes usar el delegado de Core ML para acelerar la inferencia de modelos de punto flotante de 32 o 16 bits. Neural Engine está disponible en dispositivos móviles Apple con SoC A12 o superior. Para obtener una descripción general del delegado de Core ML y las instrucciones paso a paso, consulta Delegado de Core ML de TensorFlow Lite.

Delegados por tipo de modelo

Cada acelerador está diseñado con un cierto ancho de bits de datos en mente. Si proporcionas un modelo de punto flotante a un delegado que solo admite operaciones cuantizadas de 8 bits, se rechazarán todas sus operaciones y el modelo se ejecutará por completo en la CPU. Para evitar esas sorpresas, la siguiente tabla proporciona una descripción general de la compatibilidad con delegados según el tipo de modelo:

Tipo de modelo GPU NNAPI Hexágono CoreML
Punto flotante (32 bits) No
Cuantización de float16 posterior al entrenamiento No No
Cuantización del rango dinámico posterior al entrenamiento No No
Cuantización de números enteros posterior al entrenamiento No
Entrenamiento con cuantización No

Valida el rendimiento

La información de esta sección actúa como un lineamiento aproximado para crear una lista reducida de delegados que podrían mejorar tu aplicación. Sin embargo, es importante tener en cuenta que cada delegado admite un conjunto predefinido de operaciones que puede realizar de manera diferente según el modelo y el dispositivo. Por lo tanto, se suele recomendar que realices algunas comparativas a fin de medir la utilidad de un delegado para tus necesidades. Esto también ayuda a justificar el aumento de tamaño del objeto binario asociado con la conexión de un delegado al entorno de ejecución de TensorFlow Lite.

TensorFlow Lite cuenta con amplias herramientas de evaluación del rendimiento y la precisión que pueden ayudar a los desarrolladores a confiar en el uso de delegados en sus aplicaciones. Estas herramientas se analizan en la siguiente sección.

Herramientas de evaluación

Latencia y huella de memoria

La herramienta comparativa de TensorFlow Lite se puede usar con parámetros adecuados para estimar el rendimiento del modelo, como la latencia promedio de inferencia, la sobrecarga de inicialización, el uso de memoria, etc. Esta herramienta admite varias marcas para determinar la mejor configuración delegada de tu modelo. Por ejemplo, se puede especificar --gpu_backend=gl con --use_gpu para medir la ejecución de la GPU con OpenGL. La lista completa de los parámetros delegados admitidos se define en la documentación detallada.

A continuación, se muestra un ejemplo de ejecución de un modelo cuantizado con GPU a través de adb:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Puedes descargar la versión precompilada de esta herramienta para Android con la arquitectura ARM de 64 bits aquí (más información).

Exactitud y precisión

Por lo general, los delegados realizan cálculos con una precisión diferente a la de sus contrapartes de CPU. Como resultado, existe una compensación de precisión (generalmente pequeña) asociada con el uso de un delegado para la aceleración de hardware. Ten en cuenta que esto no siempre es así; por ejemplo, como la GPU usa la precisión de punto flotante para ejecutar modelos cuantizados, se puede producir una leve mejora en la precisión (p.ej., <1% de mejora entre las 5 mejoras principales en la clasificación de imágenes ILSVRC).

TensorFlow Lite tiene dos tipos de herramientas para medir la precisión con la que se comporta un delegado en un modelo determinado: basadas en tareas y agnósticos a las tareas. Todas las herramientas descritas en esta sección admiten los parámetros de delegación avanzados que usa la herramienta de comparativas de la sección anterior. Ten en cuenta que las subsecciones que aparecen a continuación se enfocan en la evaluación delegada (¿el delegado realiza lo mismo que la CPU?) en lugar de la evaluación de modelos (¿el modelo en sí es bueno para la tarea?).

Evaluación basada en tareas

TensorFlow Lite tiene herramientas para evaluar la precisión en dos tareas basadas en imágenes:

Puedes encontrar aquí los objetos binarios compilados previamente de estas herramientas (arquitectura ARM de 64 bits para Android) junto con la documentación:

En el siguiente ejemplo, se muestra la evaluación de clasificación de imágenes mediante la NNAPI en la que se usa Edge-TPU de Google en un Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

El resultado esperado es una lista de métricas de Top-K del 1 al 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

Evaluación agnóstica a las tareas

Para tareas en las que no hay una herramienta de evaluación integrada en el dispositivo o si estás experimentando con modelos personalizados, TensorFlow Lite tiene la herramienta Diferencia de inferencia. (Android, objeto binario de arquitectura binaria ARM de 64 bits aquí)

La diferencia de inferencia compara la ejecución de TensorFlow Lite (en términos de latencia y desviación del valor de salida) en dos parámetros de configuración:

  • Inferencia de CPU de un solo subproceso
  • Inferencia definida por el usuario: Definida por estos parámetros

Para hacerlo, la herramienta genera datos gaussianos aleatorios y los pasa a través de dos intérpretes de TFLite: uno que ejecuta kernels de CPU de subproceso único y el otro parametrizado mediante los argumentos del usuario.

Mide la latencia de ambos, así como la diferencia absoluta entre los tensores de salida de cada intérprete, por elemento.

Para un modelo con un solo tensor de salida, la salida podría verse de la siguiente manera:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

Esto significa que, para el tensor de salida en el índice 0, los elementos de la salida de la CPU difieren de la salida del delegado en un promedio de 1.96e-05.

Ten en cuenta que interpretar estos números requiere un conocimiento más profundo del modelo y lo que significa cada tensor de salida. Si se trata de una regresión simple que determina algún tipo de puntuación o incorporación, la diferencia debe ser baja (de lo contrario, es un error con el delegado). Sin embargo, los resultados como la “clase de detección” de los modelos SSD son un poco más difíciles de interpretar. Por ejemplo, el uso de esta herramienta podría mostrar una diferencia, pero eso no significa que algo no esté bien con el delegado: considera dos clases (falsas): "TV (ID: 10)", "Monitor (ID:20)". Si un delegado no es real y muestra el monitor en lugar de TV, la diferencia de salida para este tensor podría ser de entre 10 y 10.