En nuestra cuarta y última entrada (en la parte inferior del artículo se reflejan las anteriores), vamos a tratar la técnica que hemos utilizado para desarrollar AgroChat: fine-tuning («ajuste fino» en español). Esta técnica se usa para mejorar la precisión de un modelo ya creado para un dominio concreto. Es decir, partiendo de un modelo preentrenado, esta técnica permite ajustarlo específicamente para tareas o dominios de interés adicionales. De este modo se mejora el rendimiento del LLM para tareas particulares, sin necesidad de entrenar un modelo desde cero.
Esta técnica es distinta al reentrenamiento, donde se vuelve a entrenar el modelo desde cero: al dataset original se añaden los nuevos datos y se realiza el proceso de entrenamiento del modelo desde cero, calculando todos los pesos de la red para que estén actualizados.
Por si este es el primer contacto que tenéis con nosotros, antes de empezar resumimos en qué consiste nuestro proyecto:
AgroChat es una herramienta tecnológica diseñada para brindar apoyo y asesoramiento, a través de un chat en lenguaje natural, a los agricultores en sus tareas diarias en el campo. Para ello, se ha utilizado una IA, en concreto un LLM (Large Lenguaje Model): Llama2, un modelo de código abierto desarrollado por Meta.
Llama2 son varios modelos entrenados desde 7 mil millones (7B) hasta 70 mil millones (70B) de parámetros. Su versatilidad y potencial fue lo que nos llamó la atención. Para nuestro caso, hemos utilizado la versión de 7B, ya que es la que menos recursos hardware necesita, y hemos aplicado la técnica de fine-tuning para reentrenarla para el dominio de agricultura ecológica.
Ahora bien, ¿por qué utilizar un modelo ya creado y no entrenarlo de cero con nuestros propios datos? Reutilizar un LLM ya entrenado supone una gran ventaja, como es utilizar menos recursos computacionales, que también impactan económicamente y en el medio. Además, requiere menos tiempo de entrenamiento y no necesita GPU con tantas necesidades de RAM. Conseguir los millones de datos de entrenamiento genéricos y libres que requiere entrenar un modelo desde cero también sería un problema. Con la técnica de fine-tuning usada podemos emplear menos datos, centrándonos en los datos que nos interesan para nuestro propósito específico.
La información sobre agricultura especializada no es abundante, y hay todavía menos datasets especializados en el tema. Estos conjuntos de datos, además, deben estar formateados según la entrada del modelo y, aunque se pueda automatizar gracias a otras herramientas de IA, la labor de recopilación y revisión de los datos es tediosa y proclive a errores.
Seguramente ya conozcáis cuál es el funcionamiento del aprendizaje automático al que se someten estos LLM, pero nunca viene mal repasarlos brevemente:
- Se pasan unos datos de entrada y de la salida esperada, y se procesan, «tokenizándolos»: se estandariza el texto para convertirlo en vectores numéricos (los «tokens») para su posterior procesamiento.
- Las capas internas de la red neuronal adaptan sus pesos para, dados los datos de entrada, adaptarse a la salida esperada. Cada capa puede considerarse una fase del aprendizaje: cuanto más cerca esté de la salida, más específica y especializada será.
- El proceso de entrenamiento se repite un número de iteraciones, en las que se actualizan los pesos de la red. Estos pesos son de utilidad para, posteriormente, encontrar la siguiente palabra más probable, como ya mencionamos en la entrada anterior.
- Una vez terminado el entrenamiento, se procede a la fase de evaluación del modelo. Aquí es donde se determina su porcentaje de aciertos y de fallos.
Las capas mencionadas en la fase de entrenamiento son las que permiten el fine-tuning. Las más cercanas a la entrada son las encargadas de extraer la información más general, como puede ser aprender un idioma a nivel básico. Al estar a tan bajo nivel, se pueden reutilizar fácilmente en otros modelos, lo que permite ahorrar recursos en calcular los pesos para las primeras capas.
Por otro lado, las capas más externas (las más cercanas a la salida) distinguen características de un mayor nivel de abstracción y complejidad. Un ejemplo intuitivo se ve al procesar imágenes: las primeras capas distinguen formas y colores, y las más externas ya pueden distinguir si se trata de un perro o de un gato.
Para el caso de AgroChat, el fine-tuning nos permite enseñarle a Llama2 información adicional sobre el tema que nos interesa: la agricultura. Se puede ejemplificar esta situación como si le estuviéramos dando clases del sector agrícola a un estudiante que ya tiene conocimientos previos sobre cómo expresarse en nuestro lenguaje.
Podemos llevar a cabo el fine-tuning para AgroChat de dos formas distintas. En ambas el modelo se logra adaptar mejor a la información proporcionada, evitando definir la estructura de la red neuronal y entrenarla desde cero, ahorrando tiempo y recursos:
- Tenemos muchos datos y añadimos capas extra al modelo preentrenado, congelando sus pesos para no modificarlos. De esta forma, es como si le enseñáramos a nuestro estudiante una ampliación de un tema específico que ya conoce.
- No tenemos demasiados datos, por lo que solo congelamos los pesos de las capas más internas. Así solo se ajustarán los pesos de las capas más externas, que son las de mayor abstracción. Por seguir con el símil del estudiante, sería como enfatizar en los detalles más sutiles del tema.
Antes de continuar, hay que recalcar que en casos en los que el dataset sea excesivamente reducido, entre otros motivos, podría ocurrir lo que se denomina como overfitting. Esto se debe a que el modelo se especializa tanto en los datos del entrenamiento que no es capaz de procesar correctamente las peticiones de entrada.
Aprovechando esta entrada, nos gustaría explicar varios conceptos que permiten optimizar recursos y por lo tanto correr el modelo, en nuestro caso AgroChat, en hardware con recursos más limitados y de menor coste y consumo.
El primer concepto es el concepto de LoRA (Low-Rank Adaptation), ya que es una técnica de fine-tuning: se añaden algunas capas y el modelo original se mantiene congelado. Entonces ¿qué es lo que lo hace especial? Pues los LoRA son intercambiables: se pueden entrenar varios LoRA sobre un mismo modelo, e ir eligiendo en cada momento cuál (o cuáles) nos conviene más usar para una determinada tarea.
No debemos confundir LoRA con los MoE (Mixture of Experts) que vimos en la entrada anterior: nosotros como usuarios podemos elegir cuándo utilizar un LoRA dependiendo del contexto, mientras que un MoE es un modelo que elige por sí mismo la mejor respuesta de las que le dan sus expertos. Ilustramos la diferencia con un ejemplo: podemos entrenar varios LoRA para cultivos específicos: uno para tomates, otro para olivos, etc., y que el agricultor elija los LoRA que mejor se adapten a su producción. Pero un MoE le proporciona la «mejor» salida sin que el usuario tenga que intervenir.
Dada la complejidad y necesidades de RAM de los LLM, es habitual superar el límite de la memoria RAM necesaria para hacer funcionar el modelo. Aunque utilicemos pocos datos, la forma de representarlos ocupa espacio y, cuanto mayor sea, más recursos de la RAM necesitaremos. Para estos casos, existe la técnica de «cuantificación». Normalmente se utilizan datos de 32 bits para almacenar el peso de cada nodo de la red. La cuantificación propone reducir estos 32 bits a 16, 8, 4… bits, requiriendo menos memoria para el procesamiento. En concreto para AgroChat, podemos realizar el fine-tuning si cuantificamos los datos a 4 bits con aproximadamente 5,5 GB de RAM. Esto no solo permitiría hacer el fine-tuning en local, sino también usar p.ej. la GPU gratuita que ofrece Google Colab.
Sin embargo, no todo es de color de rosa y la cuantización tiene un coste: cuantos menos bits se utilizan, peor es la precisión del modelo. Es cuestión del ingeniero, acorde a los requisitos del proyecto, estudiar y balancear precisión y recursos necesarios. Como ya resaltamos en anteriores entradas, las soluciones software no son universales: a cada problema van asociadas unas necesidades específicas que lo vuelven único.
Hace casi un año que comenzamos el proyecto de AgroChat y nos gustaría agradecer a la Cátedra Telefónica de la Universidad de Extremadura por el soporte y el apoyo que hemos recibido. Gracias a todos los que han seguido el desarrollo de nuestro proyecto. Esperamos que lo hayáis disfrutado tanto como nosotros.
Consulta también las demás publicaciones sobre este proyecto: