Saltar al contenido principal

Llama.cpp Tutorial: Una Guía Completa para la Inferencia e Implementación Eficiente del LLM

Esta completa guía sobre Llama.cpp te guiará a través de los aspectos esenciales de la configuración de tu entorno de desarrollo, la comprensión de sus funcionalidades básicas y el aprovechamiento de sus capacidades para resolver casos de uso del mundo real.
Actualizado 11 dic 2024  · 11 min de lectura

Los grandes modelos lingüísticos (LLM) están revolucionando diversos sectores. Desde los chatbots de atención al cliente hasta las sofisticadas herramientas de análisis de datos, las capacidades de esta potente tecnología están remodelando el panorama de la interacción digital y la automatización.

Sin embargo, las aplicaciones prácticas de los LLM pueden verse limitadas por la necesidad de una informática de gran potencia o la necesidad de tiempos de respuesta rápidos. Estos modelos suelen requerir un hardware sofisticado y amplias dependencias, lo que puede dificultar su adopción en entornos más restringidos.

Aquí es donde LLaMa.cpp (o LLaMa C++) viene al rescate, proporcionando una alternativa más ligera y portátil a los frameworks pesados.

Llama.cpp logo

Llama.cpp logo(fuente)

Desarrollar aplicaciones de IA

Aprende a crear aplicaciones de IA utilizando la API OpenAI.
Empieza a hacer Upskilling gratis

¿Qué es Llama.cpp?

Llama.cpp fue desarrollado por Georgi Gerganov. Implementa la arquitectura LLaMa de Meta en C/C++ eficiente, y es una de las comunidades de código abierto más dinámicas en torno a la inferencia LLM, con más de 900 colaboradores, más de 69000 estrellas en el repositorio oficial de GitHub y más de 2600 versiones.

Algunas ventajas clave de utilizar LLama.cpp para la inferencia LLM

Algunas ventajas clave de utilizar LLama.cpp para la inferencia LLM

  • Compatibilidad universal: El diseño de Llama.cpp como biblioteca C++ que da prioridad a la CPU implica una menor complejidad y una integración perfecta en otros entornos de programación. Esta amplia compatibilidad aceleró su adopción en diversas plataformas.

  • Amplia integración de funciones: Actuando como repositorio de las características críticas de bajo nivel, Llama.cpp refleja el enfoque de LangChain para las capacidades de alto nivel, agilizando el proceso de desarrollo aunque con posibles retos futuros de escalabilidad.

  • Optimización focalizada: Llama.cpp se centra en un único modelo de arquitectura, lo que permite mejoras precisas y eficaces. Su apuesta por los modelos Llama a través de formatos como el GGML y el GGUF ha supuesto un aumento sustancial de la eficacia.

Con este conocimiento de Llama.cpp, las siguientes secciones de este tutorial recorren el proceso de implementación de un caso de uso de generación de texto. Empezaremos explorando los fundamentos de LLama.cpp, comprendiendo el flujo de trabajo global de principio a fin del proyecto que nos ocupa y analizando algunas de sus aplicaciones en distintos sectores.

Llama.cpp Architecture

La columna vertebral de Llama.cpp son los modelos originales de Llama, que también se basan en la arquitectura de transformadores. Los autores de Llama aprovecharon varias mejoras que se propusieron posteriormente y utilizaron distintos modelos, como el PaLM.

Diferencia entre los Transformers y la arquitectura Llama (Arquitectura Llama por Umar Jamil)

Diferencia entre los Transformers y la arquitectura Llama (Arquitectura Llama por Umar Jamil)

La principal diferencia entre la arquitectura LLaMa y la de los transformadores:

  • Prenormalización (GPT3): se utiliza para mejorar la estabilidad del entrenamiento normalizando la entrada de cada subcapa transformadora utilizando el enfoque RMSNorm en lugar de normalizar la salida.
  • Función de activación SwigGLU (PaLM): la función de activación no lineal original ReLU se sustituye por la función de activación SwiGLU, que mejora el rendimiento.
  • Incrustaciones rotacionales (GPTNeao): las incrustaciones posicionales rotacionales (RoPE) se añadieron en cada capa de la red tras eliminar las incrustaciones posicionales absolutas.

Configurar el entorno

Los requisitos previos para empezar a trabajar con LLama.cpp son:

  • Python: para poder ejecutar pip, que es el gestor de paquetes de Python
  • Llama-cpp-python: el enlace Python para llama.cpp

Crear un entorno virtual

Se recomienda crear un entorno virtual para evitar cualquier problema relacionado con el proceso de instalación, y conda puede ser un buen candidato para la creación del entorno.

Todos los comandos de esta sección se ejecutan desde un terminal. Utilizando la sentencia conda create, creamos un entorno virtual llamado llama-cpp-env.

conda create --name llama-cpp-env

Una vez creado con éxito el entorno virtual, lo activamos mediante la sentencia conda activate, como se indica a continuación de:

conda activate llama-cpp-env

La declaración anterior debería mostrar el nombre de la variable de entorno entre paréntesis al principio del terminal, como se indica a continuación:

Nombre del entorno virtual tras la activación

Nombre del entorno virtual tras la activación

Ahora, podemos instalar el paquete llama-cpp-python del siguiente modo:

pip install llama-cpp-python
or
pip install llama-cpp-python==0.1.48

La ejecución correcta de llama_cpp_script.py significa que la biblioteca está correctamente instalada.

Para asegurarnos de que la instalación se realiza correctamente, vamos a crear y añadir la declaración import y, a continuación, a ejecutar el script.

  • Primero, añade el from llama_cpp import Llama al archivo llama_cpp_script.py, y luego
  • Ejecuta el archivo python llama_cpp_script.py. Si la biblioteca no se importa, se produce un error; por lo tanto, necesita un diagnóstico más detallado para el proceso de instalación.

Comprender los conceptos básicos de Llama.cpp

En esta fase, el proceso de instalación debería ser satisfactorio. Vamos a sumergirnos en la comprensión de los fundamentos de LLama.cpp.

La clase Llama importada anteriormente es el constructor principal que se aprovecha al utilizar Llama.cpp, y toma varios parámetros y no se limita a los que se indican a continuación. La lista completa de parámetros figura en la documentación oficial:

  • model_path: La ruta al archivo del modelo Llama que se está utilizando
  • prompt: El mensaje de entrada al modelo. Este texto se tokeniza y se pasa al modelo.
  • device: El dispositivo que se utilizará para ejecutar el modelo Llama; dicho dispositivo puede ser una CPU o una GPU.
  • max_tokens: El número máximo de fichas que se generarán en la respuesta del modelo
  • stop: Una lista de cadenas que harán que se detenga el proceso de generación del modelo
  • temperature: Este valor oscila entre 0 y 1. Cuanto menor sea el valor, más determinista será el resultado final. Por otra parte, un valor más alto conduce a una mayor aleatoriedad y, por tanto, a una producción más diversa y creativa.
  • top_p: Se utiliza para controlar la diversidad de las predicciones, lo que significa que selecciona los tokens más probables cuya probabilidad acumulada supere un umbral determinado. Partiendo de cero, un valor más alto aumenta la probabilidad de encontrar un resultado mejor, pero requiere cálculos adicionales.
  • echo: Un booleano utilizado para determinar si el modelo incluye la indicación original al principio (Verdadero) o no la incluye (Falso).

Por ejemplo, consideremos que queremos utilizar un gran modelo lingüístico llamado almacenado en el directorio de trabajo actual. El proceso de instanciación será así:

# Instanciate the model
my_aweseome_llama_model = Llama(model_path="./MY_AWESOME_MODEL")


prompt = "This is a prompt"
max_tokens = 100
temperature = 0.3
top_p = 0.1
echo = True
stop = ["Q", "\n"]


# Define the parameters
model_output = my_aweseome_llama_model(
       prompt,
       max_tokens=max_tokens,
       temperature=temperature,
       top_p=top_p,
       echo=echo,
       stop=stop,
   )
final_result = model_output["choices"][0]["text"].strip()

El código se explica por sí mismo y puede entenderse fácilmente a partir de las viñetas iniciales que indican el significado de cada parámetro.

El resultado del modelo es un diccionario que contiene la respuesta generada junto con algunos metadatos adicionales. El formato de la salida se explora en las siguientes secciones del artículo.

Tu primer proyecto Llama.cpp

Ahora, es el momento de empezar con la ejecución del proyecto de generación de texto. Iniciar un nuevo proyecto Llama.El cpp no tiene más que seguir la plantilla de código Python anterior, que explica todos los pasos desde la carga del gran modelo lingüístico de interés hasta la generación de la respuesta final.

El proyecto aprovecha la versión GGUF del Zephyr-7B-Beta de Hugging Face. Es una versión perfeccionada del mistralai/Mistral-7B-v0.1 que se entrenó con una mezcla de conjuntos de datos sintéticos de acceso público mediante la Optimización de Preferencia Directa (OPD).

Nuestra Introducción al uso de Transformadores y Cara de Abrazo proporciona una mejor comprensión de los Transformadores y de cómo aprovechar su poder para resolver problemas de la vida real. También tenemos un tutorial de Mistral 7B.

Modelo Zephyr de Hugging Face

Modelo Zephyr de Hugging Face(fuente)

Una vez descargado el modelo localmente, podemos moverlo a la ubicación del proyecto en la carpeta model. Antes de sumergirnos en la aplicación, entendamos la estructura del proyecto:

La estructura del proyecto

La estructura del proyecto

El primer paso es cargar el modelo utilizando el constructor Llama. Como se trata de un modelo grande, es importante especificar el tamaño máximo del contexto del modelo que se va a cargar. En este proyecto concreto, utilizamos 512 fichas.

from llama_cpp import Llama


# GLOBAL VARIABLES
my_model_path = "./model/zephyr-7b-beta.Q4_0.gguf"
CONTEXT_SIZE = 512


# LOAD THE MODEL
zephyr_model = Llama(model_path=my_model_path,
                    n_ctx=CONTEXT_SIZE)

Una vez cargado el modelo, el siguiente paso es la fase de generación de texto, utilizando el modelo de código original, pero en su lugar utilizamos una función de ayuda llamada generate_text_from_prompt.

def generate_text_from_prompt(user_prompt,
                             max_tokens = 100,
                             temperature = 0.3,
                             top_p = 0.1,
                             echo = True,
                             stop = ["Q", "\n"]):




   # Define the parameters
   model_output = zephyr_model(
       user_prompt,
       max_tokens=max_tokens,
       temperature=temperature,
       top_p=top_p,
       echo=echo,
       stop=stop,
   )


   return model_output

Dentro de la cláusula __main__, la función puede ejecutarse utilizando un indicador dado.

if __name__ == "__main__":


   my_prompt = "What do you think about the inclusion policies in Tech companies?"


   zephyr_model_response = generate_text_from_prompt(my_prompt)


   print(zephyr_model_response)

A continuación se ofrece la respuesta del modelo:

La respuesta del modelo

La respuesta del modelo

La respuesta generada por el modelo es y la respuesta exacta del modelo está resaltada en el recuadro naranja.

  • El aviso original tiene 12 fichas
  • Las fichas de respuesta o finalización tienen 10 fichas y,
  • El total de fichas es la suma de las dos fichas anteriores, que es 22

Aunque esta salida completa puede ser útil para usos posteriores, puede que sólo nos interese la respuesta textual del modelo. Podemos formatear la respuesta para obtener dicho resultado seleccionando el campo “text” del elemento "choices” de la siguiente manera:

final_result = model_output["choices"][0]["text"].strip()

La función strip() se utiliza para eliminar los espacios en blanco iniciales y finales de una cadena y el resultado es:

Tech companies want diverse workforces to build better products.

Llama.CPP Aplicaciones en el Mundo Real

Esta sección recorre una aplicación real de LLama.cpp y proporciona el problema subyacente, la posible solución y las ventajas de utilizar Llama.cpp.

Problema

Imagina ETP4Africa, una startup tecnológica que necesita un modelo lingüístico que pueda funcionar eficazmente en varios dispositivos para su aplicación educativa sin causar retrasos.

Solución con Llama.cpp

Implementan Llama.cpp, aprovechando su rendimiento optimizado para CPU y la capacidad de interactuar con su backend basado en Go.

Beneficios

  • Portabilidad y velocidad: El diseño ligero de Llama.cpp garantiza respuestas rápidas y compatibilidad con muchos dispositivos.
  • Personalización: Las funciones de bajo nivel adaptadas permiten a la aplicación proporcionar una ayuda eficaz para la codificación en tiempo real.

La integración de Llama.cpp permite a la aplicación ETP4Africa ofrecer una guía de programación inmediata e interactiva, mejorando la experiencia y el compromiso del usuario.

La Ingeniería de Datos es un componente clave de cualquier proyecto de Ciencia de Datos e IA, y nuestro tutorial Introducción a LangChain para la Ingeniería de Datos y Aplicaciones de Datos proporciona una guía completa para incluir la IA de grandes modelos lingüísticos dentro de las canalizaciones y aplicaciones de datos.

Conclusión

En resumen, este artículo ha proporcionado una visión global de la configuración y utilización de grandes modelos lingüísticos con LLama.cpp.

Se proporcionaron instrucciones detalladas para ayudarte a comprender los fundamentos de Llama.cpp, configurar el entorno de trabajo, instalar la biblioteca necesaria e implementar un caso de uso de generación de texto (respuesta a preguntas).

Por último, se proporcionaron ideas prácticas para una aplicación del mundo real y cómo puede utilizarse Llama.cpp para abordar eficazmente el problema subyacente.

¿Estás listo para sumergirte más profundamente en el mundo de los grandes modelos lingüísticos? Mejora tus habilidades con los potentes marcos de aprendizaje profundo LangChain y Pytorch utilizados por los profesionales de la IA con nuestro tutorial Cómo crear aplicaciones LLM con LangChain y Cómo entrenar un LLM con PyTorch.

Obtén una certificación superior en IA

Demuestra que puedes utilizar la IA de forma eficaz y responsable.

Preguntas frecuentes

¿En qué se diferencia Llama.cpp de otros marcos LLM ligeros?

Llama.cpp está optimizado específicamente para el uso de la CPU, lo que lo diferencia de otros marcos que podrían depender en gran medida de la aceleración de la GPU. Esto lo hace muy adecuado para entornos con recursos de hardware limitados.

¿Cuáles son los requisitos del sistema para ejecutar Llama.cpp eficazmente?

Aunque Llama.cpp está diseñado para ser ligero, aún así se beneficia de tener una CPU multinúcleo moderna y suficiente RAM para manejar modelos más grandes. Los requisitos exactos dependen del tamaño del modelo con el que trabajes.

¿Se puede integrar Llama.cpp con otros lenguajes de programación además de Python?

Sí, el diseño de Llama.cpp como biblioteca C++ permite la integración en distintos entornos de programación más allá de Python, aunque habría que implementar enlaces específicos para cada lenguaje.

¿Qué son los formatos GGML y GGUF mencionados en el contexto de los modelos Llama?

GGML (Georgi Gerganov Model Language) y GGUF son formatos utilizados para almacenar modelos Llama de forma eficiente, centrándose en reducir el tamaño de almacenamiento y mejorar la velocidad de carga.

¿Cómo gestiona Llama.cpp las actualizaciones y mejoras de los modelos LLaMa?

La comunidad de código abierto mantiene activamente Llama.cpp, asegurándose de que incorpora los últimos avances y optimizaciones en los modelos LLaMa, contribuyendo a su eficacia y a la mejora de su rendimiento.

¿Existen limitaciones o problemas conocidos con el uso de Llama.cpp?

Como cualquier software, Llama.cpp puede tener limitaciones, sobre todo en la escalabilidad con modelos muy grandes o flujos de trabajo complejos. Además, el hecho de estar optimizadas para la CPU puede no igualar el rendimiento de las soluciones basadas en la GPU en determinadas tareas.

¿Cómo influye el parámetro temperatura en la salida de Llama.cpp?

El parámetrotemperature afecta a la aleatoriedad en las respuestas del modelo. Los valores más bajos hacen que la salida sea más determinista, mientras que los valores más altos introducen variabilidad, que puede ser útil en aplicaciones creativas.


Zoumana Keita 's photo
Author
Zoumana Keita
LinkedIn
Twitter

Zoumana desarrolla herramientas de IA LLM para ayudar a las empresas a llevar a cabo la diligencia debida en materia de sostenibilidad y evaluaciones de riesgos. Anteriormente trabajó como científico de datos e ingeniero de aprendizaje automático en Axionable e IBM. Zoumana es la fundadora de la plataforma tecnológica educativa de aprendizaje entre iguales ETP4Africa. Ha escrito más de 20 tutoriales para DataCamp.

Temas

¡Comienza hoy tu viaje a la IA!

Programa

AI Fundamentals

10hrs hr
Discover the fundamentals of AI, dive into models like ChatGPT, and decode generative AI secrets to navigate the dynamic AI landscape.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

Tutorial

Ajuste fino de LLaMA 2: Guía paso a paso para personalizar el modelo de lenguaje grande

Aprende a ajustar Llama-2 en Colab utilizando nuevas técnicas para superar las limitaciones de memoria y computación y hacer más accesibles los grandes modelos lingüísticos de código abierto.
Abid Ali Awan's photo

Abid Ali Awan

12 min

Tutorial

Guía introductoria para el ajuste preciso de los LLM

El ajuste preciso de los grandes modelos lingüísticos (LLM) ha revolucionado el procesamiento del lenguaje natural (PLN) y ofrece capacidades sin precedentes en tareas como la traducción lingüística, el análisis del sentimiento y la generación de textos. Este enfoque transformador aprovecha modelos preentrenados como el GPT-2 y mejora su rendimiento en dominios específicos mediante el proceso de ajuste preciso.
Josep Ferrer's photo

Josep Ferrer

11 min

Tutorial

Guía para principiantes de LlaMA-Factory WebUI: Ajuste de los LLM

Aprende a afinar los LLM en conjuntos de datos personalizados, evaluar el rendimiento y exportar y servir modelos sin problemas utilizando el marco de trabajo de bajo/ningún código de LLaMA-Factory.
Abid Ali Awan's photo

Abid Ali Awan

12 min

Tutorial

RAG Con Llama 3.1 8B, Ollama y Langchain: Tutorial

Aprende a crear una aplicación RAG con Llama 3.1 8B utilizando Ollama y Langchain, configurando el entorno, procesando documentos, creando incrustaciones e integrando un recuperador.
Ryan Ong's photo

Ryan Ong

12 min

Tutorial

Guía para principiantes de la API de OpenAI: Tutorial práctico y prácticas recomendadas

Este tutorial te presenta la API de OpenAI, sus casos de uso, un enfoque práctico para utilizar la API y todas las prácticas recomendadas que debes seguir.
Arunn Thevapalan's photo

Arunn Thevapalan

13 min

Tutorial

Tutorial Mistral 7B: Guía paso a paso para utilizar y ajustar Mistral 7B

El tutorial cubre el acceso, la cuantización, el ajuste fino, la fusión y el almacenamiento de este potente modelo lingüístico de código abierto con 7300 millones de parámetros.
Abid Ali Awan's photo

Abid Ali Awan

12 min

Ver másVer más