El Señor de las Palabras: los dos Frameworks
En la PyCon 2023 en España hemos explorado un mundo fascinante de Inteligencia Artificial a través de la lente de los Transformers: estos modelos han revolucionado la forma en la que entendemos y trabajamos con el Procesamiento del Lenguaje Natural (NLP), e incluso otros campos, y en esta keynote, nos sumergimos en su arquitectura, los avances en el campo, la exploración dentro la tarea de traducción, y la emocionante comparación de dos de los principales frameworks de IA de código abierto: Tensorflow y Pytorch, dentro del contexto de la librería de Transformers de HuggingFace.
Transformers: más allá de las palabras
El Transformer trae consigo una innovación subyacente clave: el mecanismo de autoatención. Esto nos permite entender mejor el contexto dentro de una frase y dota al modelo de capacidad de foco.
Fig1. En esta frase, encontramos que la palabra “right” significa cosas distintas dependiendo de su contexto. El mecanismo de autoatención hace que se pueda diferenciar entre la correccion de “right” y la direccion de “right” hacia dónde se encuentra Moria exactamente.
Mas allá de las numerosas demostraciones y pequeños proyectos, estamos siendo testigos de la liberación de modelos preentrenados a través del código abierto y de la adopción masiva de la IA en productos de software, donde técnicas tanto de desarrollo como de IA se están estandarizando mediante nuevas herramientas y procesos.
Estamos siendo testigos de la liberación de modelos preentrenados a través del código abierto y de la adopción masiva de la IA en productos de software, donde técnicas de desarrollo e Inteligencia Artificial se están estandarizando mediante nuevas herramientas y procesos.
Como guía en esta exploración, utilizamos la valiosa librería de Transformers de HuggingFace, que se ha convertido en el “Rivendel del Machine Learning”: como Frodo y Sam aventurándose hacia el monte del destino, nosotros también nos aventuramos en la ingeniería de modelos lingüísticos preentrenados. Pero en lugar de un anillo, llevamos con nosotros la capacidad de cargar modelos preentrenados para usarlos en diversas tareas.
Exploramos en la PyCon experimentos con la librería en el contexto de dos frameworks soportados diferentes: Tensorflow y Pytorch. Aunque existen similitudes a nivel conceptual, la verdadera belleza radica en las diferencias sintácticas entre los frameworks, que reflejan cómo se implementan los mismos conceptos de manera única.
Como los personajes de El Señor de los Anillos que se encuentran con diferentes razas y culturas en su viaje, nosotros también descubriremos las peculiaridades de estos dos mundos de IA.
Diferencias a nivel de grafo
En Tensorflow, las operaciones se definen antes de ejecutar el grafo con tensores y operaciones, y para ejecutarse iniciamos una sesión con tf.Session()
para optimizar los cálculos. En Pytorch, las operaciones se ejecutan inmediatamente a media que se definen, lo que facilita el desarrollo iterativo. Cabe destacar, aun así, cómo Tensorflow ha evolucionado para incorporar la ejecución “eager” imitando a Pytorch.
Fig2. En Tensorflow, tenemos que iniciar un grafo con tf.Session()
. El framework también ha mutado hacia el modo eager. En Pytorch, desde su concepción, no necesitamos una sesión.
Diferencias a nivel de cálculo de operaciones
La diferenciación automática en Tensorflow se logra a través de un contexto de cinta con tf.GradienTape()
, mientras que en Pytorch es inherente al marco de trabajo gracias a Autograd. Esto significa que en Pytorch, la diferenciación automática ocurre sin necesidad de un contexto adicional. Como el flujo de poder entre Saruman y Gandalf, el proceso de diferenciación se manifiesta de manera diferente en estos dos frameworks.
Fig3. En Tensorflow, tenemos que iniciar un grafo con tf.Session()
. El framework también ha mutado hacia el modo eager. En Pytorch, desde su concepción, no necesitamos una sesión.
Gestión de Dispositivos
Tensorflow utiliza tf.device()
para especificar el dispositivo en el que se ejecutara un bloque de código, mientras que Pytorch utiliza .to(device)
para mover objetos a un dispositivo especifico. Ambos enfoques ofrecen control sobre el dispositivo, pero varían en la forma en que se implementan. Como la elección de armas en una batalla épica, la elección de dispositivos en estos frameworks puede determinar el resultado de la batalla por el rendimiento.
Fig4. Pytorch asigna el dispositivo como objeto.
Administración de Memoria
PyTorch ofrece una administración más flexible de la memoria GPU, permitiendo un uso incremental y proporcionado con métodos como memory_allocated()
y memory_reserved()
. Tensorflow, por otro lado, asigna toda la GPU por defecto. Pese a que la flexibilidad de Pytorch brinda un control más granular sobre los recursos, Tensorflow parece estar explorando estas características con la clase tf.config.experimental
.
Fig5. En TensorFlow, utilizamos la clase de configuración para conocer más acerca de la memoria.
Conclusiones del viaje
Pese a que la librería soporta los dos frameworks, parece que se apuesta por Pytorch como framework nativo: la definición de muchas de sus clases con Pytorch, el hecho de que desde Pytorch se apunte directamente a HuggingFace, y la abrumadora cantidad de modelos en Pytorch (100K) frente a aproximadamente 10K en Tensorflow -pese a que muchos de los modelos preentrenados estén en ambos frameworks- dan fe de cómo la librería parece haberse integrado en armonía con el framework.
A lo largo de nuestra exploración, hemos descubierto que del tutorial al script de ejemplo hay un salto significativo. Si bien el tutorial tiene una mentalidad comparativa muy útil entre los dos frameworks y es extremadamente didáctico, la carpeta de ejemplos en el repositorio de la librería en GitHub es sin duda un recurso sólido. La estructura de los scripts y la semántica con respecto a los dos frameworks resulta bastante similar.
Además, es esencial revisar la documentación en el README.md de las tareas en la librería de Transformers de HuggingFace para comprender los modelos y los datasets de los ejemplos, así como verificar qué framework admite el modelo en el Hub. Además, hemos notado que la integración con plataformas de experimentación en PyTorch está exhaustivamente documentada y proporciona flags que facilitan el cambio de modelos y datasets.
Fig6. Resultados. 192 descargas totales desde el Hub de los modelos preentrenados, resultado de la exploración. El mejor modelo según la métrica BLEU parece ir para el modelo que traduce del inglés al hebreo.
La magia del Open Source
El preparar la charla y explorar la librería en los dos frameworks ha servido también para contribuir a un ejemplo en un docstring de python a una de las clases de la librería dentro de una good first issue, en la que he podido aprender acerca de la evolución de una clase en el contexto del Open Source, conociendo a increíbles contribuidores -mi eterna gratitud para ti, nablabits- y a preparar contribuciones para la librería, así como analizar posibles casos de uso.
Fig7. Cómo cerramos una issue es igual de importante a cómo la abrimos.
Contribuir al código abierto no solo es un acto generoso, sino también una inversión valiosa en el crecimiento personal y profesional. En el mundo del software de código abierto, hay una danza constante entre dar y recibir. Muchos de nosotros utilizamos código abierto y construimos nuestras soluciones y modelos mentales sobre el trabajo de otros, lo que me ha hecho reflexionar a muchos niveles sobre el deber de devolver a la comunidad. Al colaborar en proyectos de código abierto, compartimos nuestro conocimiento y habilidades con la comunidad, contribuyendo al avance de la tecnología y creando soluciones más robustas y confiables. A cambio, obtenemos la oportunidad de aprender de otros, mejorar nuestras propias habilidades y formar parte de una comunidad global de mentes creativas. Este equilibrio entre dar y recibir recuerda a La Comunidad del Anillo, donde cada miembro aporta su habilidad única para lograr un objetivo común, y en este proceso, todos se fortalecen y avanzan hacia la victoria sobre las fuerzas de la oscuridad. Del mismo modo, al dar, podemos contribuir a forjar un futuro tecnológico más brillante y resistente.