TENDENCIA
Hemos vuelto a hacer simple el Machine Learning en Arduino
Por qué el TinyML es cada vez más importante en la era de ChatGPT y por qué los tutoriales oficiales Arduino sobre Machine Learning para la placa Nano 33 BLE habían dejado de funcionar.
Quien haya tenido ocasión de experimentar con la placa Arduino Nano 33 BLE, siguiendo el clásico itinerario propuesto por la documentación oficial de Arduino, muy probablemente se haya visto atraído por la posibilidad de utilizar el Machine Learning.
El Machine Learning era precisamente uno de los elementos distintivos que caracterizaron el lanzamiento de esta placa, coincidente con la publicación por parte de Google de la librería TensorFlow Lite Micro.
Arduino Nano 33 BLE fue el dispositivo elegido por el equipo de Google en 2018 para experimentar el funcionamiento de la primera versión de la nueva librería, y la versión para Arduino fue el primer ejemplo de porting hacia una plataforma a microcontrolador específica.
El proyecto fue seguido por un equipo de trabajo formado por ingenieros de software de Google e ingenieros de Arduino.
De esta experiencia nació un interesante workshop que más tarde se utilizó como base para la redacción del tutorial denominado “Get Started With Machine Learning on Arduino”, todavía presente en la documentación oficial de la placa y visible en este enlace.
En 2019 fuimos uno de los primeros centros de formación italianos en incluir este tutorial en nuestros cursos de Tiny Machine Learning, ya que representaba bien el potencial de esta tecnología emergente.
Aunque la fecha de actualización del tutorial oficial es muy reciente (abril de 2024 en el momento en que escribimos este post), quien haya intentado seguir los pasos descritos y utilizar los sketches publicados en los últimos dos años habrá notado sin duda que la compilación del sketch decisivo —el que se refiere a la ejecución de TensorFlow Lite en Arduino— falla con una serie de errores.
¿Qué ha pasado?
Buscar en Internet el problema no ayuda.
Todos los tutoriales en vídeo están datados entre 2019 y 2020, periodo en el que todo funcionaba a la perfección.
A partir de algunos threads presentes en el foro Arduino y en las “issues” de GitHub se entiende que el problema es conocido y que la causa hay que buscarla en el desalineamiento entre las versiones de la librería —ya no presente en el registry oficial Arduino pero sí en el repositorio GitHub de TensorFlow— y el código del sketch presente en el tutorial.
Algunas respuestas en los threads del foro Arduino son tajantes y más o menos afirman que ya, con la llegada de la IA estilo ChatGPT, jugar con el Tiny Machine Learning sobre una plataforma limitada como un microcontrolador es un ejercicio inútil y superado.
Nosotros no estamos de acuerdo en absoluto, y por este motivo, con motivo de la preparación de nuestro nuevo curso sobre Arduino, hemos decidido incluir el Tiny Machine Learning entre los temas y poner las manos en TensorFlow Lite Micro para generar una nueva librería —actualizada a junio de 2024— capaz de devolver la experimentación directa con esta tecnología al alcance de todos, sobre todo de quienes no son programadores C++ expertos en TensorFlow.
En este artículo os explicaremos por qué consideramos el Tiny Machine Learning un tema de gran actualidad sobre todo en la era de ChatGPT y qué había sucedido con la librería original Arduino TensorFlow Lite.
Si buscas una solución al problema del mal funcionamiento del tutorial oficial Arduino sobre Machine Learning en la placa Nano 33 BLE, estás en el lugar correcto.
Tras nuestras consideraciones sobre la importancia del tema Tiny Machine Learning, te explicaremos cómo realizar sketches correctos y funcionales que utilicen TensorFlow Lite Micro en Arduino.
¿Qué es el Tiny Machine Learning y por qué es importante?
El Machine Learning es una de las áreas de investigación dentro del más amplio sector de la Inteligencia Artificial.
Desde un punto de vista práctico e ingenieril, se trata de un proceso de desarrollo de software alternativo al tradicional, basado en la definición de algoritmos explícitos compuestos por secuencias de instrucciones, ciclos y ramificaciones if … then … else.
Existen, en efecto, situaciones en las que el proceso tradicional no es aplicable.
Para entender el concepto, hagamos referencia a algunos ejemplos sencillos.
Imaginemos querer realizar un programa que, dadas como input las tres medidas de las longitudes de los lados de un triángulo, ofrezca como output la categoría a la que pertenece el triángulo: triángulo rectángulo o triángulo no rectángulo.
Es un trivial problema de clasificación, fácilmente resoluble. La vía más rápida es referirse al teorema de Pitágoras y realizar un sencillo algoritmo que verifique si la suma de los cuadrados de los lados más cortos es igual al cuadrado del lado más largo. Si esta propiedad se cumple, el triángulo es rectángulo; si no se cumple, no lo es.
En este caso hemos podido encontrar un algoritmo explícito que ha permitido resolver el problema de clasificación.
Tomemos ahora un problema diferente. Imaginemos un brazo robótico al que se ha aplicado un sensor IMU (Inertial Measurement Unit) capaz de detectar los valores de aceleración lineal y angular durante el movimiento del brazo.
Según la carga aplicada al brazo robótico, las condiciones operativas y otros factores ambientales, las secuencias de valores leídos por el sensor pueden ser muy distintas entre sí. Imaginemos detectar secuencias de lecturas en distintas condiciones operativas, tanto cuando el brazo funciona correctamente como cuando muestra anomalías de funcionamiento —por ejemplo por sobrecalentamiento de los motores o en caso de fallos reales—.
Probablemente las lecturas realizadas en el intervalo de tiempo previo a la anomalía muestren tendencias que pueden utilizarse para predecir el inminente fallo futuro.
Observando las secuencias de datos, ¿somos capaces de identificar las reglas matemáticas que permiten identificar la situación anómala?
Muy probablemente no.
Cuando se analizan situaciones de este tipo, muy a menudo la representación gráfica de las secuencias de valores aparece distinta ya por simple análisis visual, pero pasar del reconocimiento visual del “pattern” de las curvas de valores a la formulación de una regla algorítmica no es algo fácil y a menudo ni siquiera posible.
Así como, analizando la secuencia de números binarios de la que está compuesto un archivo jpg, es imposible definir un algoritmo específico para identificar los objetos presentes en la imagen, también en el caso del análisis de secuencias de valores detectadas por sensores complejos como un IMU es habitualmente imposible definir un algoritmo específico para identificar situaciones de potencial anomalía.
En estos casos el Machine Learning ofrece una solución elegante y eficaz.
Para proceder a través de esta técnica, se divide el proceso de realización del software en dos fases.
En la primera fase se desarrolla un software para recoger y memorizar las secuencias de datos, y se deja correr el software durante un periodo suficientemente largo como para detectar situaciones normales pero también anómalas.
Los datos así recogidos se “etiquetan”, manual o automáticamente, para identificar las muestras que representan situaciones de normalidad y aquellas que representan situaciones de alarma.
En la segunda fase se realiza un software que implementa un modelo de machine learning, por ejemplo una red neuronal convolucional.
Estos “modelos” son algoritmos generalizados caracterizados por un elevado número de parámetros.
Para cada valor proporcionado en input, el resultado calculado en output depende del valor asignado a los parámetros.
Al “modelo” está asociado un oportuno algoritmo de training (también llamado algoritmo de model fitting) que, mediante un procedimiento iterativo y la aplicación de funciones y métodos de derivación estadística, elabora los datos de ejemplo —etiquetados con las clasificaciones conocidas— para determinar el valor a asignar a los parámetros de modo que el “modelo” sea capaz de determinar la clasificación correcta del input.
El resultado final de este proceso de desarrollo es un algoritmo software capaz de resolver nuestro problema de clasificación.
El proyectista de software no es capaz de establecer a priori un algoritmo preciso para resolver el problema, pero a través del mecanismo de aprendizaje o model fitting, el sistema es capaz de determinar automáticamente los parámetros correctos, sobre la base de un conjunto de datos conocido, llamado dataset de training.
La esencia del Machine Learning es esta y, como se intuye, se trata de un método muy potente que nos permite resolver problemas de análisis de datos y clasificación que no son abordables de manera tradicional.
El ejemplo relativo al mantenimiento predictivo del brazo robótico es indicativo de cómo el Machine Learning puede ser una herramienta muy válida en el ámbito de los sistemas digitales de control. ¿Cómo se implementa todo esto en un contexto donde los datos son recogidos y analizados por dispositivos a microcontrolador?
Como hemos visto, en los sistemas basados en Machine Learning existen dos categorías distintas de algoritmos: los algoritmos de aprendizaje o model fitting y los algoritmos de “previsión” o “clasificación”, en los que se elabora el input a través de un modelo matemático cuyos parámetros han sido predeterminados a través del aprendizaje.
Los algoritmos de aprendizaje requieren tiempos largos y muchos recursos de cálculo. Por este motivo se ejecutan habitualmente en ordenadores dedicados, equipados con CPU multi-core y coprocesadores especializados GPU (los mismos usados para los gráficos) o TPU (coprocesadores especializados en el cálculo tensorial típico del machine learning).
Los algoritmos de clasificación, en casos similares a los citados como ejemplos, requieren habitualmente recursos y potencias de cálculo mucho más limitados y en la mayoría de los casos pueden ejecutarse incluso a bordo de un moderno microcontrolador a 32 bits.
La tecnología que permite procesar los algoritmos de previsión de los modelos de Machine Learning y de las Redes Neuronales sobre dispositivos limitados como smartphones, single board computer y placas a microcontrolador se llama Tiny Machine Learning.
Una solución basada en Tiny Machine Learning prevé habitualmente una fase de recogida de datos, una fase de model fitting a realizar en ordenadores dedicados o en plataformas de cálculo en la nube, y la instalación y ejecución del modelo entrenado en los dispositivos a microcontrolador o en smart device.
En 2018 Google lanzó una librería open source en C++ llamada TensorFlow Lite Micro, que ha hecho fácil e inmediato el porting de un modelo de red neuronal realizado a través de la potente y muy utilizada plataforma TensorFlow sobre los microcontroladores.
El entusiasmo inicial por parte de los desarrolladores de firmware y el florecer de tutoriales y proyectos piloto en el ámbito de las community open source —como la de Arduino— han sido eclipsados por la reciente llegada de las nuevas Inteligencias Artificiales Generativas, que han modificado en parte el enfoque hacia las tecnologías generales de Machine Learning.
La potencia de sistemas como los presentados por OpenAI y sus competidores es tal que muchos problemas de análisis de datos pueden plantearse directamente a herramientas como ChatGPT obteniendo respuestas inmediatas y correctas sin tener que proceder ya a la realización de un propio modelo de red neuronal a entrenar de manera apropiada.
¿Tiene aún sentido implementar a bordo de un microcontrolador un algoritmo basado en redes neuronales, cuando sería más fácil e inmediato enviar los datos detectados por los sensores a un potente sistema de IA accesible en la nube e invocado mediante API?
Una sencilla búsqueda web sobre la palabra clave Inteligencia Artificial asociada a Arduino lleva hoy a una serie de páginas donde se describen proyectos —más o menos amateur— en los que el dispositivo utiliza la conexión a Internet para servirse de un servicio externo basado en IA.
Aunque esta arquitectura es fácil de realizar y mucho más inmediata en un contexto amateur o artesanal, la solución del envío hacia la nube de los datos elementales recogidos por los sensores remotos no es eficiente, ni económicamente conveniente, en un contexto industrial.
La recogida real time de flujos de datos continuos desde cientos o miles de sensores remotos, y su envío hacia Internet, requiere anchos de banda adecuados y la consiguiente necesidad de emplear dispositivos de transmisión potentes para superar los problemas de interferencias y disturbios habitualmente presentes en las instalaciones industriales.
No es casualidad que en el ámbito Industrial Internet of Things sean cada vez más comunes las arquitecturas definidas de Edge Computing, en las que la elaboración de datos se realiza a bordo de los dispositivos sensores —o en sistemas intermedios próximos a ellos—, limitando el envío hacia los sistemas centrales solo a los datos de síntesis o las alarmas.
El Tiny Machine Learning es una solución conforme a la arquitectura Edge Computing y por este motivo su importancia crecerá en el futuro inmediato.
A nivel industrial, la investigación y desarrollo en este sector no se ha detenido nunca y la propia librería TensorFlow Lite Micro está actualmente localizada para todas las principales arquitecturas de microcontroladores presentes en el mercado, desde ARM Cortex M4 hasta ESP32 S3.
El mundo Arduino, sin embargo, sufre mucho los trends y los hypes mediáticos, que obviamente influyen en la nutrida community de aficionados —que comprende también a muchos estudiantes e investigadores—.
El Tiny Machine Learning sobre Arduino parecía un tema pasado de moda, y es una pena, ya que históricamente de esta community han surgido ideas creativas e innovadoras que han sabido influir en la investigación industrial.
En realidad, en los últimos meses, el interés parece haber resurgido, pero la evidente obsolescencia de los recursos puestos a disposición por la documentación oficial y por la community desilusiona rápidamente a los perfiles menos técnicos que tratan de experimentar con esta tecnología.
Por este motivo hemos decidido retomar el proyecto de porting de TensorFlow Lite Micro a Arduino y volver a poner a disposición recursos y material didáctico que permitan a creativos y entusiastas la inserción del Tiny Machine Learning en sus propios proyectos, de forma intuitiva y en el típico estilo que caracteriza a Arduino.
La librería TensorFlow Lite para Arduino
La librería oficial C++ TensorFlow Lite Micro la desarrolla y mantiene Google como colección general de archivos fuente en lenguaje C++. Los archivos están disponibles con licencia de tipo open source en un repositorio GitHub dedicado, separado del repositorio general del código fuente de la plataforma TensorFlow. Inicialmente los archivos estaban contenidos en la rama Lite del repositorio TensorFlow, pero a partir de 2022 el código se ha trasladado a un repositorio dedicado.
Quien está acostumbrado a contribuir en proyectos open source en rápida evolución conoce bien la estructura aparentemente caótica y a menudo redundante de estos archivos en GitHub. Los archivos esenciales y más significativos están mezclados en un intrincado árbol de directorios y subdirectorios junto con archivos de ejemplo, códigos experimentales y archivos de utilidad dudosa. La documentación externa es prácticamente inexistente y para orientarse es necesario leer el código fuente y estudiar su estructura y comentarios.
La idea de Google es que el efectivo porting de la librería sobre una plataforma específica —como por ejemplo mbed_nano Arduino o Raspberry Pi— lo realice el equipo de proyectistas que tenga interés en hacerlo. Para dar líneas guía sobre cómo efectuar este proceso de generación de un proyecto específico, partiendo de la librería genérica, el equipo de Google decidió usar la placa Arduino Nano 33 BLE como ejemplo. Se creó por tanto una versión de la librería adaptada y funcional sobre esta placa Arduino y guardada en este repositorio con el nombre de TensorFlow Lite Micro Arduino Example. La palabra “example” en el nombre del repositorio se refiere precisamente al hecho de que este proyecto debía servir de ejemplo para cualquiera que quisiera adaptar la librería a su propia plataforma.
En el proyecto participaron ingenieros de Arduino, y la librería fue registrada en el library register oficial de Arduino con el nombre Arduino_TensorFlowLite, haciéndola instalable automáticamente a través del IDE Arduino. El repositorio GitHub de esta librería se mantuvo sincronizado —a través de las funcionalidades automáticas ofrecidas por GitHub— con la versión genérica y no especializada de la librería C++ fuente, de modo que las eventuales modificaciones aportadas a los archivos fuente originales se replicaran sobre los archivos presentes en el repositorio derivado.
Sin embargo, como siempre ocurre en este tipo de proyectos, dado que las operaciones de porting sobre plataformas complejas como los microcontroladores requieren cierta dosis de trabajo manual, este alineamiento automático empezó a no funcionar más y en 2022 se interrumpió. Tras algunos meses, se pidió a los mantainer del registry Arduino que retiraran la librería. Esto significa que, desde entonces, la librería ya no está alineada con las últimas modificaciones realizadas al sistema TensorFlow Lite Micro y no está disponible desde el IDE Arduino para la instalación automática.
Para empeorar la situación para los devotos de Arduino, hay que destacar que los alineamientos automáticos efectuados entre 2019 y 2022 nunca modificaron el número de versión, que sigue siendo 2.0.4-ALPHA. Los tutoriales “Get Started With Machine Learning on Arduino” presentes en el sitio Arduino en la documentación oficial de la placa Arduino Nano 33 BLE Sense se habían mantenido alineados hasta la versión 2.0.4-ALPHA. Tras la eliminación de la librería del registry, el texto de los tutoriales se actualizó especificando que la librería debe descargarse del repositorio GitHub “oficial” e instalarse como archivo .zip. Lástima que la versión de la librería en el repositorio indicado ya no es la original 2.4.0-ALPHA, sino una versión más avanzada —aunque ya obsoleta— parada en 2022.
Por este motivo, quien intente seguir las instrucciones del tutorial termina su experimento inundado por errores de compilación.
Si queréis intentar viajar atrás en el tiempo y experimentar el tutorial como si estuvierais en el año 2019, podéis conseguir la verdadera versión 2.0.4-ALPHA descargándola de este enlace. Instalando la versión original de 2019 —y no la apuntada por el enlace dentro del tutorial— los sketches de ejemplo se compilarán correctamente y el experimento funcionará.
Si queréis empezar a experimentar con una versión reciente de TensorFlow Lite Micro sobre Arduino, podéis descargar cómodamente desde el IDE nuestra nueva librería Chirale_TensorFlowLite. La librería trae consigo el sketch de ejemplo “hello_world” que muestra cómo utilizar TensorFlow Lite dentro del sketch. Hemos generado un nuevo proyecto a partir de los archivos master actualizados y generado una nueva librería al estilo de la originaria Arduino_TensorFlowLite.
Sobre el Tiny Machine Learning hemos puesto a disposición la última lección de nuestro nuevo curso Arduino Unchained en un curso adquirible por separado. Podéis leer todos los detalles accediendo a la plataforma Accademia delle Arti Numeriche.
Curso de Tiny Machine Learning sobre Arduino
El estilo de la librería Arduino_TensorFlowLite —y por tanto de nuestra librería— no es al que están acostumbrados los entusiastas de Arduino.
En el código hay una sintaxis C++ muy técnica y se utilizan punteros y otros tipos de datos habitualmente evitados en los sketches Arduino.
Nuestro proyecto acaba de empezar y los próximos pasos serán precisamente los de hacer intuitiva y conforme al estándar Arduino esta librería, de modo que se facilite el acceso a esta importante tecnología a toda la community de creativos que opera con Arduino.