Llama 1 y 2: las creaciones de Meta AI
Rubén Rodríguez Abril
La serie Llama es la respuesta de Meta AI, la división de inteligencia artificial de Meta Inc (multinacional propietaria de Facebook y WhatsApp) a los avances en procesamiento natural de lenguaje realizados por Google y Open AI. En este artículo estudiaremos las principales particularidades de sus modelos.
Uno de los grandes inconvenientes que plantean los grandes modelos de lenguaje es que consumen una extraordinaria cantidad de FLOPs no sólo durante su fase de entrenamiento, sino también durante la inferencia. Sólo es factible su ejecución, pues, en grandes centros de datos en los que decenas o centenares de GPU trabajan en paralelo interconectadas por una red. Todo ello está conduciendo a una suerte de concentración de poder en el ciberespacio, siguiendo una tendencia exactamente inversa a la que representó el surgimiento de Internet (red en la que no existe jerarquía de nodos) y la tecnología DLT (que supone la replicación de información en múltiples servidores).
Llama 1: el modelo original
Los investigadores de Meta AI pretendieron paliar este problema mediante la creación de modelos relativamente ligeros, que se pudieran ejecutar durante la fase de inferencia en computadores de tamaño mediano. El resultado fue el modelo LLaMA, cuya versión con 13.000 millones de parámetros (LLaMA 13-B) resultó ser más eficiente que GPT-3 en la inmensa mayoría de los benchmarks, a pesar de ser 10 veces inferior en tamaño y ser ejecutable en una única GPU.
Las innovaciones de LLaMA, en términos de arquitectura, son prácticamente nulas. El modelo es un descodificador como el original descrito en Vaswani et al, con algunas modificaciones, introducidos previamente ya en otros modelos anteriores:
–Byte Pair Encoding: Cada token representa un par de bytes. Como mecanismo de codificación de caracteres a bytes se usa UTF-8.
–Prenormalización (procedente de GPT-3): La entrada (y no la salida) de cada módulo transformer es sometida a normalización.
-Función de activación SwiGLU (procedente de PaLM) en lugar de ReLU.
–Codificación posicional rotaria (Rotary Positional Embedding – RoPE, procedente de GPTNeo).
Los datos utilizados para el preentrenamiento procedían de fuentes estrictamente públicas, entre las que podemos citar English CommonCrawl (67%), C4 (15%), GitHub (4,5%), Wikiipedia (4,5%), el Proyecto Gutenberg (4,5%) o Arxiv (2,5%).
Tal y como se muestra en la imagen, los autores del trabajo entrenaron cuatro versiones de diferentes tamaños: Las versiones de 7B y 13B fueron entrenados sobre 1T tokens, mientras que las versiones de 33B y 65B lo fueron sobre 1,4T tokens.
Figura 1: Conforme avanza el entrenamiento, la función de pérdida (medida en fase de testeo) desciende en todos los modelos, incluso en el más pequeño. Fuente: Fuente: LLaMA, Open and Efficient Foundation Language Models – Touvron et al (2023).
El mayor de los modelos, LlaMA-65B, fue entrenado durante 21 días sobre 2048 GPUs A100, con 80GBs de memoria RAM, y a una ratio de 380 tokens/seg/GPU. Tras este proceso de aprendizaje, fue sometido a diversas pruebas de razonamiento de sentido común y en casi todas ellas mostró una mayor eficiencia que otros modelos competidores, como PaLM, GPT-3, Gopher o Chinchilla, particularmente en aquellas tareas en las cuales no había visto ejemplos anteriormente (zero-shot).
Los pesos sinápticos de LLaMA fueron filtrados en Marzo de 2023.
Llama 2
La segunda versión del modelo, Llama 2 fue presentada por Meta en Julio de 2023. La arquitectura es similar a la de la versión 1. La única diferencia sustancial entre ambos modelos fundacionales es la duración del entrenamiento que en el segundo modelo se alarga hasta los 1,4T de tokens (un incremento del 40%).
Llama 2 incorpora dos versiones afinadas (fine-tuned): Llama 2-Chat y Code Llama . Como su propio nombre sugiere, la primera está especializada en conversar con el usuario, y la segunda en la redacción de código de programación.
Llama 2-Chat
Llama 2-Chat fue el fruto de meses de investigaciones, en los que los investigadores de Meta perfeccionaron métodos de alineamiento (la capacidad de un modelo de seguir instrucciones), entrenamiento y aprendizaje supervisado.
El afinamiento de Llama 2-Chat se articuló en dos fases:
a) afinamiento autosupervisado, consistente en la utilización de pares instrucción-respuesta.
b) aprendizaje reforzado, en el que la red es puntuada.
En lugar de utilizar ingentes cantidades de datos, durante el primero de los procesos se emplearon tan sólo unos pocos de miles de pares de instrucciones y respuestas, siendo descartadas millones de fuentes de baja calidad. Se confirmaron las conclusiones de otros estudios previos que afirmaban que bastaba el uso de un relativamente reducido numero de instrucciones durante el entrenamiento para obtener resultados de alto nivel.
Figura 2. Diagrama del proceso de entrenamiento de Llama 2-Chat. El proceso de afinamiento se compone de una primera fase de afinamiento supervisado, en la que el modelo es presentado con pares instrucción-respuesta y una segunda fase de entrenamiento reforzado (RLHF). Fuente: Llama 2 – Touvron et al (2023).
Durante el proceso de aprendizaje reforzado, las respuestas del chat fueron sometidas a puntuación por parte de observadores humanos (Reinforcement Learning with Human Feedback, RLHF), utilizando dos criterios diferentes: seguridad (safety reward model) y utilidad (helpful reward model). Los pesos sinápticos se actualizaban mediante el proceso de optimización PPO (Proximal Policy Optimisation).
Code Llama
La familia Code LLaMA se divide en varios submodelos, cada uno de ellos de diferentes tamaños:
-Code LLaMA, el modelo con capacidades generales de programación.
-Code LLaMA-Python, especializado en programar Python.
-Code LLaMA-Instruct, especializado en seguir instrucciones zero-shot (es decir, nunca vistas en el entrenamiento) del usuario.
Figura 3. En el diagrama se muestran el proceso de entrenamiento de los modelos de Code Llama. El modelo fundacional (Llama 2) es preentrenado con código (en morado), usando los sistemas de predicción del siguiente token y de rellenado (infilling). Tras ello, procede un afinamiento (en verde) con pares instrucción-respuesta. Code Llama-Python presenta la particularidad de que es preentrenado también con otros 100.000 tokens de código Python. Code Llama-Instruct es afinado con una base de datos sintética (en amarillo). Fuente: Code Llama, Open Foundation Models for Code.
Las características más reseñables del entrenamiento de dichos modelos son las siguientes:
-A diferencia de otros modelos de lenguaje especializados en programación, que sólo son entrenados con código, Code Llama es entrenado a partir del modelo fundacional generalista de Llama 2, que tiene capacidades expresivas en lenguajes naturales.
-Este modelo fundacional es consiguientemente preentrenado (entrenamiento autorregresivo) con código extraído de fuentes públicas como GitHub y Stack Overflow. Después es afinado con el objetivo de que siga instrucciones dadas por el usuario. Y además, se le entrena para rellenar (infilling) código sobrante en un entorno de desarrollo (IDE).
-El sistema de codificación posicional RoPE es modificado de tal manera que la atención se expanda desde los 4096 tokens a casi 100.000.
Para entrenar a Code LLaMA-Instruct, los investigadores crearon un nuevo sistema de afinamiento, denominado self-instruct (autoinstrucción), a partir de una base de datos sintéticos. La nueva base de datos sintética fue creada del siguiente modo:
-Tras una petición (prompt), LLaMA 2 genera 65.000 cuestiones de programación, que son sometidas a Code LLaMA.
-Para cada una de estas cuestiones, Code LLaMA crea a su vez diez soluciones en Python, así como pruebas unitarias para el problema. La primera solución que apruebe el test unitario es incorporada a la base de datos.
Code Llama en todas sus variedades ofreció resultados análogos a lo del estado de la técnica en diferentes benchmarks (conjuntos de pruebas) como HumanEval, MBPP o APPS, consistentes en completar código Python. En pruebas multilingües, los resultados fueron aun superiores.