Crea y convierte modelos

Los microcontroladores tienen RAM y almacenamiento limitados, lo que restringe el tamaño de los modelos de aprendizaje automático. Además, en la actualidad, TensorFlow Lite para microcontroladores admite un subconjunto limitado de operaciones, por lo que no todas las arquitecturas de modelos son posibles.

En este documento, se explica el proceso de convertir un modelo de TensorFlow para que se ejecute en microcontroladores. También se describen las operaciones admitidas y se brinda orientación sobre cómo diseñar y entrenar un modelo para que se ajuste a la memoria limitada.

Para ver un ejemplo de extremo a extremo ejecutable de compilación y conversión de un modelo, consulta el ejemplo de Hello World.

Conversión de modelos

Si quieres convertir un modelo de TensorFlow entrenado para que se ejecute en microcontroladores, debes usar la API de Python del conversor de TensorFlow Lite. Esto convertirá el modelo en un FlatBuffer, lo que reduce su tamaño y lo modificará para usar operaciones de TensorFlow Lite.

Para obtener el tamaño de modelo más pequeño posible, debes considerar usar la cuantización posterior al entrenamiento.

Convertir en un array de C

Muchas plataformas de microcontroladores no son compatibles con el sistema de archivos nativo. La forma más fácil de usar un modelo de tu programa es incluirlo como un array de C y compilarlo en tu programa.

El siguiente comando de Unix generará un archivo fuente C que contiene el modelo de TensorFlow Lite como un array 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 hayas generado el archivo, puedes incluirlo en tu programa. Es importante cambiar la declaración del array a const para mejorar la eficiencia de la memoria en plataformas incorporadas.

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 de modelos

Cuando diseñas un modelo para usar en microcontroladores, es importante considerar 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 del programa, tanto como objeto binario como en el tiempo de ejecución.

Para crear un modelo más pequeño, puedes usar menos capas que sean más pequeñas en tu arquitectura. Sin embargo, es más probable que los modelos pequeños experimenten un subajuste. Esto significa que, para muchos problemas, tiene sentido intentar usar el modelo más grande que quepa en la memoria. Sin embargo, el uso de modelos más grandes también aumentará la carga de trabajo del procesador.

Carga de trabajo

El tamaño y la complejidad del modelo afectan 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 pasa más tiempo trabajando y menos inactivo. Esto aumentará el consumo de energía y la salida de calor, lo que podría ser un problema según tu aplicación.

Asistencia para operaciones

Actualmente, TensorFlow Lite para microcontroladores admite un subconjunto limitado de operaciones de TensorFlow, lo que afecta las arquitecturas del modelo que es posible ejecutar. Estamos trabajando para expandir la compatibilidad con las operaciones, tanto en términos de implementaciones de referencia como en optimizaciones para arquitecturas específicas.

Las operaciones admitidas se pueden ver en el archivo micro_mutable_ops_resolver.h.