Los dispositivos móviles y los dispositivos integrados tienen recursos de procesamiento limitados, por lo que es importante que tu aplicación sea eficiente en el uso de recursos. Compilamos una lista de prácticas recomendadas y estrategias que puedes usar para mejorar el rendimiento de tu modelo de TensorFlow Lite.
Elige el mejor modelo para la tarea
Según la tarea, deberás hacer una compensación entre la complejidad y el tamaño del modelo. Si tu tarea requiere una precisión alta, es posible que necesites un modelo grande y complejo. Para las tareas que requieren menos precisión, es mejor usar un modelo más pequeño, ya que no solo usan menos espacio en el disco y memoria, sino que también suelen ser más rápidos y eficientes en cuanto al consumo de energía. Por ejemplo, los gráficos a continuación muestran las compensaciones entre la precisión y la latencia para algunos modelos comunes de clasificación de imágenes.


Un ejemplo de modelos optimizados para dispositivos móviles son las MobileNets, que están optimizadas para aplicaciones de visión en dispositivos móviles. En Kaggle Models, se enumeran varios otros modelos que se optimizaron específicamente para dispositivos móviles y dispositivos integrados.
Puedes volver a entrenar los modelos enumerados en tu propio conjunto de datos con el aprendizaje por transferencia.
Genera un perfil de tu modelo
Una vez que hayas seleccionado un modelo candidato adecuado para tu tarea, es una buena práctica crear un perfil de tu modelo y compararlo con otros modelos. La herramienta de comparativas de LiteRT tiene un generador de perfiles integrado que muestra estadísticas de generación de perfiles por operador. Esto puede ayudar a comprender los cuellos de botella del rendimiento y qué operadores dominan el tiempo de procesamiento.
También puedes usar el registro de LiteRT para generar perfiles del modelo en tu aplicación para Android con el registro estándar del sistema de Android y visualizar las invocaciones de operadores por tiempo con herramientas de generación de perfiles basadas en la GUI.
Genera perfiles y optimiza los operadores en el grafo
Si un operador en particular aparece con frecuencia en el modelo y, según la generación de perfiles, descubres que es el que consume la mayor cantidad de tiempo, puedes intentar optimizarlo. Esta situación debería ser poco frecuente, ya que TensorFlow Lite tiene versiones optimizadas para la mayoría de los operadores. Sin embargo, es posible que puedas escribir una versión más rápida de una operación personalizada si conoces las restricciones en las que se ejecuta el operador. Consulta la guía de operadores personalizados.
Optimiza tu modelo
La optimización de modelos tiene como objetivo crear modelos más pequeños que, en general, sean más rápidos y eficientes en el consumo de energía, de modo que se puedan implementar en dispositivos móviles. LiteRT admite varias técnicas de optimización, como la cuantización.
Consulta los documentos sobre la optimización de modelos para obtener más detalles.
Ajusta la cantidad de subprocesos
LiteRT admite kernels de subprocesos múltiples para muchos operadores. Puedes aumentar la cantidad de subprocesos y acelerar la ejecución de los operadores. Sin embargo, aumentar la cantidad de subprocesos hará que tu modelo use más recursos y energía.
En algunas aplicaciones, la latencia puede ser más importante que la eficiencia energética. Puedes aumentar la cantidad de subprocesos configurando la cantidad de subprocesos del intérprete. Sin embargo, la ejecución de subprocesos múltiples conlleva un aumento en la variabilidad del rendimiento, según qué más se ejecute de forma simultánea. Esto es especialmente cierto en el caso de las aplicaciones para dispositivos móviles. Por ejemplo, las pruebas aisladas pueden mostrar una aceleración del doble en comparación con un solo subproceso, pero, si otra app se ejecuta al mismo tiempo, puede generar un rendimiento peor que el de un solo subproceso.
Elimina las copias redundantes
Si tu aplicación no está diseñada con cuidado, puede haber copias redundantes cuando se ingresa la entrada al modelo y se lee su salida. Asegúrate de eliminar las copias redundantes. Si usas APIs de nivel superior, como Java, asegúrate de revisar cuidadosamente la documentación para conocer las advertencias sobre el rendimiento. Por ejemplo, la API de Java es mucho más rápida si se usan ByteBuffers como entradas.
Cómo perfilar tu aplicación con herramientas específicas de la plataforma
Las herramientas específicas de la plataforma, como Android Profiler y Instruments, proporcionan una gran cantidad de información de generación de perfiles que se puede usar para depurar tu app. A veces, el error de rendimiento puede no estar en el modelo, sino en partes del código de la aplicación que interactúan con el modelo. Asegúrate de familiarizarte con las herramientas de generación de perfiles específicas de la plataforma y las prácticas recomendadas para tu plataforma.
Evalúa si tu modelo se beneficia del uso de los aceleradores de hardware disponibles en el dispositivo
LiteRT agregó nuevas formas de acelerar los modelos con hardware más rápido, como GPU, DSP y aceleradores neuronales. Por lo general, estos aceleradores se exponen a través de submódulos delegate que se hacen cargo de partes de la ejecución del intérprete. LiteRT puede usar delegados de la siguiente manera:
- El delegado de GPU está disponible en Android y iOS, con OpenGL/OpenCL y Metal, respectivamente. Para probarlos, consulta el delegado de GPU.
- Puedes crear tu propio delegado si tienes acceso a hardware no estándar. Consulta Delegados de LiteRT para obtener más información.
Ten en cuenta que algunos aceleradores funcionan mejor para diferentes tipos de modelos. Algunos delegados solo admiten modelos de números de punto flotante o modelos optimizados de una manera específica. Es importante comparar cada delegado para ver si es una buena opción para tu aplicación. Por ejemplo, si tienes un modelo muy pequeño, tal vez no valga la pena delegarlo en la GPU. Por el contrario, los aceleradores son una excelente opción para los modelos grandes que tienen una alta intensidad aritmética.