Delegados de TensorFlow Lite

Los delegados habilitan la aceleración de hardware de los modelos de TensorFlow Lite aprovechando los aceleradores integrados en el 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á optimizado para la aritmética pesada que se suele encontrar en los modelos de aprendizaje automático (por ejemplo, las matemáticas de matrices relacionadas con 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 grandes beneficios en términos de latencia y eficiencia de la energía. Por ejemplo, las GPU pueden proporcionar hasta 5 veces más velocidad en latencia.

Cada uno de estos aceleradores tiene APIs asociadas que habilitan procesamientos personalizados, como OpenCL o OpenGL ES para GPU para dispositivos móviles. Por lo general, tendrías que escribir mucho código personalizado para ejecutar una red neuronal a través de estas interfaces. La situación se complica aún más cuando consideras que cada acelerador tiene sus pros y contras, y no puede ejecutar todas las operaciones en una red neuronal. La API de Delegate de TensorFlow Lite resuelve este problema actuando como un 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 particulares de modelos. Por lo general, habrá varios delegados aplicables a tu caso de uso, según dos criterios principales: la Plataforma (¿Android o iOS?) a la que te orientas y el Tipo de modelo (¿punto flotante o cuantificado) que quieres acelerar.

Delegados por plataforma

Multiplataforma (iOS y Android)

  • Delegado de GPU: El delegado de GPU se puede usar en iOS y Android. Está optimizado para ejecutar modelos basados en números de punto flotante de 32 y 16 bits en los que haya una GPU disponible. También es compatible con modelos cuantificados de 8 bits y proporciona un rendimiento de GPU a la par de sus versiones de número de punto flotante. Para obtener más información sobre el delegado de GPU, consulta TensorFlow Lite en GPU.

iOS

  • Delegado de Core ML para iPhones y iPads más nuevos: Para iPhones y iPads nuevos en los que Neural Engine está disponible, puedes usar el delegado de Core ML a fin de acelerar la inferencia para los modelos de punto flotante de 32 bits o 16 bits. Neural Engine está disponible para 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 cuantificadas 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 CoreML
Punto flotante (32 bits)
Cuantización de float16 posterior al entrenamiento
Cuantización del rango dinámico posterior al entrenamiento No
Cuantización de números enteros posterior al entrenamiento No
Entrenamiento basado en la cuantización No

Validación del rendimiento

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

TensorFlow Lite cuenta con una amplia herramienta de evaluación del rendimiento y la precisión que puede 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 espacio en memoria

La herramienta de comparativas de TensorFlow Lite se puede usar con parámetros adecuados para estimar el rendimiento del modelo, incluida la latencia promedio de inferencia, la sobrecarga de inicialización, el uso de memoria, entre otros. Esta herramienta admite varias marcas que permiten determinar la mejor configuración de delegado para 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 parámetros delegados admitidos se define en la documentación detallada.

Este es un ejemplo ejecutado para 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 la arquitectura ARM de 64 bits de Android aquí (más detalles).

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 (por lo general menor) asociada con el uso de un delegado para la aceleración de hardware. Ten en cuenta que esto no es siempre cierto; por ejemplo, como la GPU usa la precisión de punto flotante para ejecutar modelos cuantizados, puede haber una leve mejora en la precisión (p.ej., Menos del 1% de las 5 mejores mejoras en la clasificación de imágenes del ILSVRC).

TensorFlow Lite tiene dos tipos de herramientas para medir la precisión con la que se comporta un delegado en un modelo determinado: basado en tareas y agnóstico a las tareas. Todas las herramientas descritas en esta sección admiten los parámetros de delegación avanzada 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 del modelo (¿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 los objetos binarios compilados previamente de estas herramientas (arquitectura ARM de 64 bits para Android), junto con la documentación a continuación:

En el siguiente ejemplo, se muestra la evaluación de clasificación de imágenes con GPU 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_gpu=true

El resultado esperado es una lista de las métricas 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 independiente de las tareas

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

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 configuraciones:

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

Para ello, la herramienta genera datos gaussianos aleatorios y los pasa por dos intérpretes de TFLite: uno que ejecuta kernels de CPU de un solo subproceso y el otro parametrizado por 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 la interpretación de estos números requiere un conocimiento más profundo del modelo y lo que significa cada tensor de salida. Si es 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 del delegado). Sin embargo, las salidas como la "clase de detección" de los modelos SSD son un poco más difíciles de interpretar. Por ejemplo, podría mostrar una diferencia con esta herramienta, pero no significa que haya un problema real con el delegado. Considera dos clases (falsas): "TV (ID: 10)", "Monitor (ID: 20)": Si un delegado se encuentra ligeramente fuera de la verdad dorada y muestra el monitor en lugar de TV, la diferencia de salida para este tensor podría ser de 20 a 10.