Los microcontroladores tienen RAM y almacenamiento limitados, lo que impone restricciones en los tamaños de los modelos de aprendizaje automático. Además, LiteRT para microcontroladores actualmente admite un subconjunto limitado de operaciones, por lo que no todas las arquitecturas de modelos son posibles.
En este documento, se explica el proceso para convertir un modelo de TensorFlow para que se ejecute en microcontroladores. También describe las operaciones admitidas y brinda orientación para diseñar y entrenar un modelo que se ajuste a la memoria limitada.
Para ver un ejemplo ejecutable de extremo a extremo sobre cómo compilar y convertir un modelo, consulta el ejemplo de Hello World.
Conversión de modelos
Para convertir un modelo de TensorFlow entrenado para que se ejecute en microcontroladores, debes usar la API de Python del conversor de LiteRT. Esto convertirá el modelo en un FlatBuffer, reducirá su tamaño y lo modificará para que use operaciones de LiteRT.
Para obtener el tamaño de modelo más pequeño posible, debes considerar usar la cuantización posterior al entrenamiento.
Cómo convertir a un array de C
Muchas plataformas de microcontroladores no tienen compatibilidad nativa con el sistema de archivos. La forma más sencilla de usar un modelo desde tu programa es incluirlo como un array de C y compilarlo en tu programa.
El siguiente comando de Unix generará un archivo fuente en C que contiene el modelo de LiteRT como un array de char:
xxd -i converted_model.tflite > model_data.cc
El resultado se verá similar al siguiente código:
unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
// <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;
Una vez que generes el archivo, podrás incluirlo en tu programa. Es importante cambiar la declaración de la matriz a const para mejorar la eficiencia de la memoria en las plataformas integradas.
Para ver un ejemplo de cómo incluir y usar un modelo en tu programa, consulta hello_world_test.cc en el ejemplo de Hello World.
Arquitectura y entrenamiento del modelo
Cuando diseñas un modelo para usarlo en microcontroladores, es importante tener en cuenta el tamaño del modelo, la carga de trabajo y las operaciones que se usan.
Tamaño del modelo
Un modelo debe ser lo suficientemente pequeño como para caber en la memoria del dispositivo de destino junto con el resto de tu programa, tanto como un archivo binario como en el tiempo de ejecución.
Para crear un modelo más pequeño, puedes usar menos capas y más pequeñas en tu arquitectura. Sin embargo, es más probable que los modelos pequeños sufran de subajuste. Esto significa que, para muchos problemas, tiene sentido intentar usar el modelo más grande que quepa en la memoria. Sin embargo, usar modelos más grandes también aumentará la carga de trabajo del procesador.
Carga de trabajo
El tamaño y la complejidad del modelo influyen en la carga de trabajo. Los modelos grandes y complejos pueden generar un ciclo de trabajo más alto, lo que significa que el procesador del dispositivo dedica más tiempo a trabajar y menos tiempo a estar inactivo. Esto aumentará el consumo de energía y la emisión de calor, lo que podría ser un problema según tu aplicación.
Asistencia operativa
Actualmente, LiteRT para microcontroladores admite un subconjunto limitado de operaciones de TensorFlow, lo que afecta las arquitecturas de modelos que se pueden ejecutar. Estamos trabajando para expandir la compatibilidad con las operaciones, tanto en términos de implementaciones de referencia como de optimizaciones para arquitecturas específicas.
Las operaciones admitidas se pueden ver en el archivo micro_mutable_ops_resolver.h.