Descubriendo Llama 2: El revolucionario modelo de lenguaje de Meta

Imagínate que llega un nuevo jugador a la cancha, pero en lugar de competir por quién tiene el balón más grande, decide cambiar las reglas del juego. Eso es exactamente lo que ha hecho Meta con Llama 2.

Han entrado en el campo de los modelos de lenguaje y han dicho: “No estamos aquí para ver quién tiene el modelo más potente. Creemos que esto debería estar abierto para todos”. Y así, como quien no quiere la cosa, han roto el mercado, han traído su modelo y lo han hecho de código abierto. Así es, amigos, Llama 2 ha llegado y está aquí para quedarse, revolucionando el mundo de la inteligencia artificial con su enfoque abierto y accesible. ¿Estás listo para descubrirlo?

¿Qué es Llama 2?

Llama 2 es el nuevo modelo de lenguaje desarrollado por Meta. Este modelo se presenta en tres tamaños diferentes: 7B, 13B y 70B parámetros. Esta variedad permite adaptarse a diferentes necesidades y aplicaciones. Pero lo que realmente distingue a Llama 2 es su disponibilidad. Meta ha decidido ofrecer Llama 2 de forma gratuita para investigación y uso comercial. Esto significa que se puede acceder a él a través de proveedores como AWS y Hugging Face.

Además, Llama 2 ha sido optimizado para aplicaciones de diálogo. Para ello, se ha utilizado una técnica conocida como Aprendizaje por Refuerzo a partir de Retroalimentación Humana (RLHF).

RLHF en Llama 2

Vamos, que Llama 2 no solo es una mejora de su predecesor, sino que representa un cambio en la forma en que se comparte y utiliza la Inteligencia Artificial.

Las mejoras de Llama 2

Llama 2 representa un salto significativo en el desarrollo de modelos de lenguaje. En comparación con su predecesor, Llama 1, este nuevo modelo ha sido entrenado en 2 billones de tokens de texto, el doble que Llama 1. Además, la longitud de contexto de Llama 2 también se ha duplicado, lo que permite al modelo entender y generar textos más largos y complejos.

Los modelos de Llama 2 han sido afinados con más de 1 millón de anotaciones humanas, lo que mejora su capacidad para generar respuestas coherentes y relevantes. Además, Llama 2 ha sido optimizado para aplicaciones de diálogo, lo que lo hace ideal para su uso en chatbots y otros sistemas de conversación.

Llama 2

En términos de rendimiento, Llama 2 supera a otros modelos de lenguaje de código abierto en muchos benchmarks externos. Según los datos proporcionados por Meta y Hugging Face, Llama 2 destaca en pruebas de razonamiento, codificación, competencia y conocimiento. Esto demuestra que Llama 2 no solo es más grande y más potente que su predecesor, sino que también es más inteligente y versátil.

Puedes encontrar algunos Benchmarks aquí:

Llama 2 vs GPT

Cuando hablamos de modelos de lenguaje, es inevitable comparar Llama 2 con GPT-3.5, uno de los más populares en el mercado. Pero, ¿cómo se comparan realmente? ¿Cuándo deberías usar uno sobre el otro? Vamos a desglosarlo.

Primero, hablemos de los tokens. En el mundo de los modelos de lenguaje, un token puede ser una palabra, una letra, un número, o incluso un signo de puntuación. Cuando interactúas con estos modelos, tanto las preguntas que haces (prompt request tokens) como las respuestas que recibes (completion response tokens) se cuentan en tokens.

Llama 2, y en particular su versión de 70B de parámetros, brilla cuando se trata de tareas que dependen mucho de las preguntas que haces, como la clasificación de textos. En estos casos, Llama 2 puede ser más eficiente y económico que GPT-3.5. Sin embargo, si tu tarea implica generar mucho texto (muchos tokens de respuesta), GPT-3.5 podría ser una opción más rápida y barata.

Pero, ¿qué pasa si tu tarea no implica hacer preguntas o si estás procesando grandes cantidades de texto a la vez? Pues que es aquí es donde Llama 2 puede tener una ventaja. Aunque generar respuestas con Llama 2 puede ser más lento y costoso que con GPT-3.5, el procesamiento de las preguntas es realmente eficiente. De hecho, puede ser hasta tres veces más barato que con GPT-3.5.

Además, es importante tener en cuenta que los modelos de código cerrado como GPT-3.5 utilizan varios métodos para acelerar drásticamente la inferencia, como la cuantización, la mezcla de expertos, el muestreo especulativo y trucos sofisticados para la inferencia a escala. Sin embargo, para tareas pesadas en indicaciones, los modelos de código abierto como Llama 2 pueden ser una opción más eficiente.

Podríamos concluir que si necesitas procesar mucho texto o hacer muchas preguntas, Llama 2 es una buena opción. Pero para generar grandes cantidades de texto nuevo, GPT-3.5 puede funcionar mejor. Depende de tus necesidades específicas.

Instrucciones; ¿Cómo hablar con Llama 2?

Una de las ventajas menos conocidas de los modelos de acceso abierto como Llama 2 es que tienes control total sobre el prompt del sistema en las aplicaciones de chat. Esto es esencial para especificar el comportamiento de tu asistente de chat e incluso para infundirle algo de personalidad, algo que no es posible en los modelos servidos detrás de las APIs.

El formato de prompt se vería así:

<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_message }} [/INST]

Este formato sigue el procedimiento de entrenamiento del modelo, como se describe en el paper de Llama 2. Puedes usar cualquier system_prompt que quieras, pero es crucial que el formato coincida con el utilizado durante el entrenamiento.

Para explicarlo con total claridad, esto es lo que se envía realmente al modelo de lenguaje cuando introduces algún texto (por ejemplo, “Hay una llama en mi jardín 😱 ¿Qué debería hacer?”) para iniciar un chat:

<s>[INST] <<SYS>>
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe.  Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.

If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
<</SYS>>

There's a llama in my garden 😱 What should I do? [/INST]

Como puedes ver, las instrucciones entre los tokens especiales <<SYS>> proporcionan contexto al modelo para que sepa cómo se espera que responda. Esto funciona porque exactamente el mismo formato se utilizó durante el entrenamiento con una amplia variedad de prompts de sistema destinados a diferentes tareas.

A medida que avanza la conversación, todas las interacciones entre el humano y el “bot” se añaden al prompt anterior, encerradas entre delimitadores [INST]. La plantilla utilizada durante las conversaciones de varios turnos sigue esta estructura:

<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>

{{ user_msg_1 }} [/INST] {{ model_answer_1 }} </s><s>[INST] {{ user_msg_2 }} [/INST]

Es importante tener en cuenta que Llama 2, al igual que otros modelos de lenguaje, no tiene memoria interna de las interacciones anteriores. Cada vez que interactúas con el modelo, es como si fuera la primera vez. Por eso es importante proporcionar todo el contexto de la conversación cada vez que interactúas con el modelo. Esta es la razón por la que la longitud del contexto es un parámetro muy importante para maximizar, ya que permite conversaciones más largas y mayores cantidades de información para ser utilizadas.

En los modelos basados en API, la gente recurre a trucos en un intento de anular el prompt del sistema y cambiar el comportamiento predeterminado del modelo. Por muy imaginativas que sean estas soluciones, esto no es necesario en los modelos de acceso abierto: cualquiera puede usar un prompt diferente, siempre y cuando siga el formato descrito anteriormente. Esto puede ser una herramienta importante para los investigadores para estudiar el impacto de los prompts tanto en las características deseadas como en las no deseadas.

En Hugging Face, por ejemplo, puedes explorar fácilmente esta característica al revelar la interfaz de usuario de “Opciones avanzadas” y simplemente escribir tus instrucciones deseadas. También puedes duplicar esas demos y usarlas de forma privada para divertirte o investigar.

¿Cómo usar Llama 2 en local?

Si bien Llama 2 está disponible a través de proveedores como Hugging Face, también puedes optar por usarlo en tu propia máquina. ¿No te parece increíble? Aviso a navegantes, el proceso es algo técnico, pero espero haberlo descrito de forma que puedas seguirlo sin problema. ¡Vamos a por ello!

  • Clona el repositorio: El primer paso es clonar el repositorio de Llama 2 desde GitHub. Para hacerlo, abre una terminal y escribe el siguiente comando: git clone https://github.com/ggerganov/llama.cpp.git. Esto descargará el código fuente de Llama 2 en tu máquina local.
  • Compila el código: Una vez que hayas clonado el repositorio, necesitarás compilar el código.
    • Usando Make
      • En Linux o MacOS:
        make
      • En Windows:
        • Descarga la última versión de fortran de w64devkit.
        • Extrae w64devkit en tu PC.
        • Ejecuta w64devkit.exe.
        • Usa el comando cd para llegar a la carpeta llama.cpp.
        • Desde aquí puedes ejecutar: make
    • Usando CMake
      • Instalar CMake: CMake es una herramienta de compilación de código abierto. Si estás en Linux, puedes instalarlo con el siguiente comando: sudo apt-get install cmake. Si estás en macOS, puedes instalarlo usando Homebrew con el comando: brew install cmake. Si ya tienes CMake instalado, puedes omitir este paso. Si estás en Windows… lo siento. No hombre, aun puedes descargar el instalador de CMake desde su página oficial de descargas. Ejecuta el archivo descargado y sigue las instrucciones del asistente de instalación.
      • Aquí están los comandos que necesitas:

        cd llama.cpp
        mkdir build
        cd build
        cmake ..
        cmake --build . --config Release

        Estos comandos crean un directorio de compilación, navegan a ese directorio, generan los archivos de compilación usando CMake y luego compilan el código.
  • Descarga los modelos: Para poder ejecutar el LLM, primero necesitas tener los modelos en tu local. Para ello, debes solicitar su descarga rellenando este formulario de Meta.

    Al hacerlo recibirás un correo como este

    Donde te indicarán cómo debes proceder para descargar los modelos. El proceso es algo tedioso, para serte sincero, pero si lees el email y el README.md del repositorio al que se refieren deberías ser capaz de hacerlo.

    Te dejo los pasos que hice yo:

    – Clonar el repositorio: git clone https://github.com/facebookresearch/llama.git
    – Dar permisos de ejecución al fichero download.sh: chmod +x download.sh
    – Descargar wget: brew install wget
    – Ejecutar el proceso: ./download.sh desde la raíz del proyecto.
    – Introducir la url que se pide y que te envió Meta en su email.
    – Seleccionar el/los modelos a descargar (en mi caso sólo el 7B). Y… va para rato. ¡Tiempo de ir a por un café!


    Al terminar, deberías tener un fichero checklist.chk, otro consolidated.00.pth y otro params.json, en un directorio llamado llama-2-7b.
  • Convierte el modelo 7B a formato ggml FP16: El formato original de LLaMA que se descarga no es directamente compatible. Por ello este paso es necesario. Además con este paso se reduce el tamaño del modelo a la mitad (de unos 13 GB a unos 6.5 GB), manteniendo una precisión bastante buena. Además es una preparación también necesaria para la cuantización.

    Podríamos decir que no es un paso obligatorio, y lo podrías saltar, pero el impacto en precisión y rendimiento sería mayor.

    Para llevarlo a cabo, necesitarás ejecutar python3 convert.py models/7B/ Estando situado en la raíz del proyecto, y teniendo en el directorio models/7B ya los 3 ficheros del modelo que has descargado en el punto anterior. Además necesitarás el fichero tokenizer.model. Lo puedes copiar del proyecto llama que usaste para descargar el modelo. Está situado en la raíz.

    Al terminar este punto, deberías tener un fichero ggml-model-f32.bin en tu directorio models/7B.
  • Cuantiza el modelo a 4 bits (usando el método q4_0): El paso de cuantizar el modelo a 4 bits es muy importante porque permite reducir drásticamente el tamaño del modelo sin afectar demasiado la precisión. Es un paso crítico que hace viable ejecutar LLaMA 7B en tu ordenador. Sin cuantización, muy pocos tendrían la capacidad computacional para usarlo.

    Para llevar a cabo la cuantización, ejecuta ./quantize ./models/7B/ggml-model-f32.bin ./models/7B/ggml-model-q4_0.bin q4_0 desde la raíz del proyecto.

    Al final el proceso, deberías tener un fichero ggml-model-q4_0.bin q4_0 en tu directorio models/7B.

    Algunos beneficios de la cuantización a 4 bits:
    • Reduce el tamaño del modelo de 6.5GB (en FP16) a solo 3.5GB. Mucho más manejable.
    • Permite que el modelo quepa en memoria y se ejecute en computadoras comunes. De otra forma se necesitarían servidores potentes.
    • Mejora el rendimiento de inferencia, ya que los cálculos con números enteros de 4 bits son más rápidos.
    • Habilita ejecutar modelos grandes en dispositivos con recursos limitados como teléfonos, RPi, etc.
  • Ejecutar Llama 2: Puedes ejecutar Llama 2 de distintas maneras. En el README.md de su proyecto encontrarás las distintas opciones. Aquí te voy a dejar 2 de ellas.
    • ./main -m ./models/7B/ggml-model-q4_0.bin -n 128
      Genera texto basado en un prompt inicial. No maneja más contexto que lo que se indique en ese prompt. A mi parecer creo que se puede usar para generación de texto simple.
    • ./examples/chat.sh
      Esto inicia una sesión interactiva con el modelo de 7B preguntándole cosas y permitiendo una conversación más natural.

      El modo interactivo es genial para probar diferentes prompts y ver cómo responde el modelo. Además, maneja el contexto de la conversación.
  • Interactuar con Llama 2: ¡Ahora puedes interactuar con Llama 2 directamente desde la línea de comandos! Entiendo que el modelo irá más o menos rápido dependiendo de los recursos de tu máquina. ¡Espero que tengas más suerte que yo en eso! Como ves en el vídeo de abajo, en mi caso la velocidad de respuesta deja bastante que desear… jeje. ¡Pero funciona! Un LLM ejecutando en un M1 de hace unos añitos y sin demasiados recursos 👏.

¿Cómo usar Llama 2 de forma profesional en una empresa?

Llama 2 no solo es una herramienta potente para los entusiastas de la IA y los investigadores, sino que también es una solución viable para las empresas que buscan incorporar modelos de lenguaje avanzados en sus operaciones. Varias plataformas de nube ya han incorporado Llama 2 en sus catálogos de modelos de IA, lo que facilita su implementación en entornos empresariales.

Microsoft anunció en su conferencia Microsoft Inspire que Llama 2 está disponible en el catálogo de modelos de IA de Azure. Los desarrolladores ahora pueden usar LLaMA en el cloud de Microsoft. Llama 2 también está disponible en el hub Amazon SageMaker Jumpstart de AWS, con otros proveedores que llegarán en el futuro.

Además, se anunció la introducción de un ecosistema abierto entre Microsoft y Meta para marcos de IA intercambiables. El trabajo se remonta a 2017 cuando Meta (entonces Facebook) introdujo el estándar Open Neural Network Exchange (ONNX) para modelos de aprendizaje profundo. Ambas empresas se comprometieron a apoyar el desarrollo de la IA abierta, incluyendo el proporcionar un mayor acceso a las tecnologías de IA fundamentales “en beneficio de las empresas a nivel mundial”.

En términos de responsabilidad en su uso, Meta ha dicho que los modelos de Llama 2 son “red-teamed”, donde el personal se encarga de encontrar brechas dentro de la arquitectura de seguridad del modelo y asegurarse de que son seguros de usar. Se han puesto esfuerzos en generar “prompts adversarios” para ayudar a afinar el modelo, y hacerlo más seguro.

Los usuarios de Llama 2 tienen que aceptar una política de ‘uso aceptable’, que prohíbe ciertos casos de uso, incluyendo el uso del modelo para generar contenido terrorista, permitir la distribución ilegal de información o materiales a menores, y crear código malicioso.

Vamos, que Llama 2 se presenta como una opción viable y potente para las empresas que buscan aprovechar los modelos de lenguaje de última generación en sus operaciones. Con el apoyo de plataformas de nube como Azure y AWS, su implementación y uso en un entorno empresarial se vuelve aún más accesible para entornos profesionales.

Si estás buscando una documentación más práctica al respecto, yo aún no he podido jugar con ello, pero sí que he leído al respecto, y te recomiendo que eches un vistazo a este artículo de Philipp Smith, en el que se guía paso a paso para realizar un afinamiento del modelo 70B usando el Cloud de AWS.

En esta otra guía oficial de Swati Gharse, puedes ver una introducción sobre cómo empezar a usar Llama 2 en Azure.

¿Cómo afinar Llama 2?

Una de las grandes ventajas de Llama 2 es que, al ser de código abierto, cualquiera puede afinar el modelo para necesidades específicas. Esto se logra entrenando el modelo en nuevos datos relevantes para la tarea deseada.

Por ejemplo, si te apeteciera que Llama 2 resumiera diálogos, podrías entrenarlo con un dataset de conversaciones y sus correspondientes resúmenes. De esta forma, el modelo aprendería a generar resúmenes precisos de diálogos.

Vamos a ver un ejemplo práctico de cómo realizar este proceso de fine-tuning:

  1. Descarga el modelo Llama 2 de 7B parámetros y conviértelo al formato de Hugging Face. Esto permite aprovechar sus librerías para el entrenamiento.
    • Clona el repositorio de inferencia de Llama 2 e instala las dependencias: git clone https://github.com/facebookresearch/llama.git
    • Ejecuta el script de descarga bash download.sh e introduce la URL que te envió Meta por mail para obtener el modelo 7B.
    • Convierte el modelo con el script convert_llama_weights_to_hf.py. Esto genera un modelo en formato HF en models_hf/7B.
  2. Clona el repositorio llama-recipes que contiene notebooks de entrenamiento.
    • git clone https://github.com/facebookresearch/llama-recipes.git
  3. Ejecuta el notebook quickstart.ipynb cambiando la ruta al modelo convertido. Esto entrenará Llama 2 en la tarea de resumir diálogos con el dataset samsum.
    • En el notebook quickstart.ipynb, configura model_id con la ruta a tu modelo HF.
    • Ejecuta todas las celdas para entrenar el modelo. Esto puede durar varias horas incluso en GPU.
  4. Guarda los pesos del modelo ya entrenado (adapters) para usarlos luego.
    • El notebook guardará los adapters entrenados en un directorio que indicamos, por ejemplo /modelo_entrenado.
  5. Para hacer inferencia con el modelo afinado, carga los adapters en el modelo Llama 2 original de 7B. Esto permite aprovechar toda su capacidad.
    • Carga el modelo 7B con LlamaForCausalLM()
    • Carga los adapters con PeftModel() apuntando a donde los guardaste.
    • Ejemplo de código

      import torch
      from transformers import LlamaForCausalLM, LlamaTokenizer
      from peft import PeftModel, PeftConfig
      # Carga tokenizer y modelo base
      tokenizer = LlamaTokenizer.from_pretrained(model_id)
      model = LlamaForCausalLM.from_pretrained(model_id)
      # Carga los adapters entrenados
      model = PeftModel.from_pretrained(model, "/modelo_entrenado")
  6. Puedes probar pasándole un diálogo de ejemplo y verifica que el modelo genera un buen resumen relevante.
    • Prepara el input con el tokenizer
    • Genera el resumen con model.generate()
    • Revisa que el resumen refleje bien la esencia del diálogo de ejemplo.
    • Ejemplo de código:

      # Ejemplo de diálogo
      dialogo = """A: Hola Juan ¿estás ocupado mañana en la tarde?
      B: Creo que sí ¿qué pasa?
      A: ¿Puedes acompañarme al refugio de animales?
      B: ¿Qué quieres hacer?
      A: Quiero adoptar un cachorro para mi hijo
      B: Eso lo hará muy feliz
      A: Sí, ya lo hemos hablado varias veces. Creo que ya está listo
      """
      # Prepara el input
      input = tokenizer(dialogo, return_tensors="pt")
      # Genera el resumen
      resumen = model.generate(**input, max_new_tokens=50)
      # Revisa que el resumen refleje la idea principal del dialogo
      print(tokenizer.decode(resumen[0]))

¡Listo! De esta manera, entrenando a Llama 2 en tus propios datos, puedes adaptarlo fácilmente para cualquier aplicación. Las posibilidades son infinitas.

Espero que este ejemplo práctico te dé una idea de cómo empezar a explotar el potencial de fine-tuning con Llama 2. ¡Anímate a probarlo!

Recursos útiles

Conclusión

Pues bueno, amigos, después de todo este viaje, ¿qué pensamos de Llama 2? A mí me parece un auténtico pelotazo y un paso de gigante para la IA abierta.

Ejecutarlo en local, la verdad, no es trivial. Requiere unos cuantos pasos, conocimientos técnicos y, sobre todo, una buena máquina. Así que no apto para cualquiera. Pero poder hablar con un modelo de IA de este nivel en mi propio ordenador me parece alucinante.

A nivel de empresa, creo que abre muchas posibilidades nuevas. No me extraña que los gigantes tecnológicos se estén subiendo al carro. Tener acceso a modelos tan potentes para mejorar productos y servicios va a ser un gran valor.

Claro, no es perfecto. Aún tiene sus limitaciones de conocimiento y sesgos que hay que seguir puliendo. Pero es un gran paso adelante en términos de escala, accesibilidad y transparencia. En los datos queda reflejado que se ha convertido en el número 1 de los LLM open source.

Sin duda que es revolucionario y que ha entrado pisando fuerte en el campo de juego de la IA generativa marcando un nuevo estándar de apertura y colaboración. ¿Tú cómo lo ves?

Recuerda, el aprendizaje es un viaje, no un destino. Así que sigue explorando, sigue preguntando, sigue aprendiendo. Y mientras lo haces, no olvides disfrutar del viaje. Nos vemos en el próximo post, donde seguiremos desentrañando los misterios de la Ingeniería de Software juntos. ¡Hasta la próxima!