Implementación de modelos de lenguaje grandes (LLM)
Vivimos en una época asombrosa de modelos de lenguajes grandes como ChatGPT, GPT-4 y Claude que pueden realizar múltiples tareas asombrosas. Prácticamente en todos los campos, desde la educación, la atención médica hasta las artes y los negocios, se están utilizando modelos de lenguaje grandes para facilitar la eficiencia en la prestación de servicios. Durante el año pasado, se lanzaron muchos modelos de lenguajes grandes de código abierto brillantes, como Llama, Mistral, Falcon y Gemma. Estos LLM de código abierto están disponibles para que todos los utilicen, pero implementarlos puede ser un gran desafío, ya que pueden ser muy lentos y requerir mucha potencia de procesamiento de GPU para ejecutarse en una implementación en tiempo real. Se han creado diferentes herramientas y enfoques para simplificar la implementación de modelos de lenguaje grandes.
Se han creado muchas herramientas de implementación para ofrecer a los LLM una inferencia más rápida, como vLLM, c2translate, TensorRT-LLM y llama.cpp. Las técnicas de cuantificación también se utilizan para optimizar las GPU para cargar modelos de lenguaje muy grandes. En este artículo, explicaré cómo implementar modelos de lenguajes grandes con vLLM y cuantificación.
Latencia y rendimiento
Algunos de los principales factores que afectan el rendimiento de la velocidad de un modelo de lenguaje grande son los requisitos de hardware de la GPU y el tamaño del modelo. Cuanto mayor sea el tamaño del modelo, más potencia de cálculo de GPU se necesitará para ejecutarlo. Las métricas de referencia comunes utilizadas para medir el rendimiento de la velocidad de un modelo de lenguaje grande son Latencia y Rendimiento.
Latencia: Este es el tiempo necesario para que un modelo de lenguaje grande genere una respuesta. Generalmente se mide en segundos o milisegundos.
Rendimiento: Esta es la cantidad de tokens generados por segundo o milisegundo a partir de un modelo de lenguaje grande.
Instalar los paquetes necesarios
A continuación se muestran los dos paquetes necesarios para ejecutar un modelo de lenguaje grande: Hugging Face transformadores y acelerar.
pip3 install transformers
pip3 install accelerate
¿Qué es Phi-2?
fi-2 es un modelo básico de última generación de Microsoft con 2.700 millones de parámetros. Fue entrenado previamente con una variedad de fuentes de datos, desde códigos hasta libros de texto. Aprender más acerca de fi-2 de aquí.
Evaluación comparativa de la latencia y el rendimiento de LLM con Hugging Face Transformers
Salida generada
Latency: 2.739394464492798 seconds
Throughput: 32.36171766303386 tokens/second
Generate a python code that accepts a list of numbers and returns the sum. (1, 2, 3, 4, 5)
A: def sum_list(numbers):
total = 0
for num in numbers:
total += num
return totalprint(sum_list((1, 2, 3, 4, 5)))
Desglose del código paso a paso
Línea 6–10: Cargado fi-2 modelo y tokenizó el mensaje “Genere un código Python que acepte una lista de números y devuelva la suma.“
Línea 12-18: Generó una respuesta del modelo y obtuvo el latencia calculando el tiempo necesario para generar la respuesta.
Línea 21–23: Obtuvo la longitud total de tokens en la respuesta generada, dividiéndola por el latencia y calculó el rendimiento.
Este modelo se ejecutó en un A1000 (GPU de 16 GB) y logra un latencia de 2,7 segundos y un rendimiento de 32 fichas/segundo.
vLLM es una biblioteca LLM de código abierto para ofrecer modelos de lenguaje grandes a bajo costo. latencia y alta rendimiento.
Cómo funciona vLLM
El transformador es el componente básico de los modelos de lenguajes grandes. La red de transformadores utiliza un mecanismo llamado mecanismo de atención, que es utilizado por la red para estudiar y comprender el contexto de las palabras. El mecanismo de atención se compone de un montón de cálculos matemáticos de matrices conocidas como claves y valores de atención. La memoria utilizada por la interacción de estas claves y valores de atención afecta la velocidad del modelo. vLLM introdujo un nuevo mecanismo de atención llamado Atención paginada que gestiona eficientemente la asignación de memoria para las claves y valores de atención del transformador durante la generación de tokens. La eficiencia de la memoria de vLLM ha demostrado ser muy útil para ejecutar modelos de lenguaje grandes con baja latencia y alto rendimiento.
Esta es una explicación de alto nivel de cómo funciona vLLM. Para conocer detalles técnicos más detallados, visite la documentación de vLLM.
Instalar vLLM
pip3 install vllm==0.3.3
Ejecute Phi-2 con vLLM
Salida generada
Latency: 1.218436622619629seconds
Throughput: 63.15334836428132tokens/second
(1, 2, 3, 4, 5)
A: def sum_list(numbers):
total = 0
for num in numbers:
total += num
return totalnumbers = (1, 2, 3, 4, 5)
print(sum_list(numbers))
Desglose del código paso a paso
Línea 1–3: Paquetes requeridos importados de vLLM para ejecutar fi-2.
Línea 5–8: Cargado fi-2 con vLLM, definió el mensaje y estableció parámetros importantes para ejecutar el modelo.
Línea 10-16: Generó la respuesta del modelo usando llm.generar y calculó el latencia.
Línea 19–21: Obtuve la longitud total de los tokens generados a partir de la respuesta, dividí la longitud de los tokens por la latencia para obtener el rendimiento.
Línea 23–24: Obtuvo el texto generado.
yo corrí fi-2 con vLLM en el mismo mensaje, “Genere un código Python que acepte una lista de números y devuelva la suma”. En la misma GPU, una A1000 (GPU de 16 GB), vLLM produce una latencia de 1,2 segundos y un rendimiento de 63 fichas/segundoen comparación con los transformadores Hugging Face latencia de 2,85 segundos y un rendimiento de 32 fichas/segundo. La ejecución de un modelo de lenguaje grande con vLLM produce el mismo resultado preciso que usar Hugging Face, con una latencia mucho menor y un mayor rendimiento.
Nota: Las métricas (latencia y rendimiento) que obtuve para vLLM son puntos de referencia estimados para el rendimiento de vLLM. La velocidad de generación del modelo depende de muchos factores, como la duración del mensaje de entrada y el tamaño de la GPU. Según el informe oficial de vLLM, ejecutar un modelo LLM en una GPU potente como la A100 en un entorno de producción con vLLM logra Rendimiento 24 veces mayor que abrazar la cara de Transformers.
Evaluación comparativa de latencia y rendimiento en tiempo real
La forma en que calculé la latencia y el rendimiento para ejecutar Phi-2 es experimental e hice esto para explicar cómo vLLM acelera el rendimiento de un modelo de lenguaje grande. En el caso de uso real de los LLM, como un sistema basado en chat donde el modelo genera un token a medida que se genera, medir la latencia y el rendimiento es más complejo.
Un sistema basado en chat se basa en tokens de salida de transmisión. Algunos de los principales factores que afectan las métricas de LLM son Tiempo hasta el primer token (el tiempo necesario para que un modelo genere el primer token), Tiempo por token de salida (el tiempo invertido por token de salida generado), la longitud de la secuencia de entrada, la salida esperada, el total de tokens de salida esperadosy el tamaño del modelo. En un sistema basado en chat, la latencia suele ser una combinación de Tiempo hasta el primer token y Tiempo por token de salida multiplicado por el total de tokens de salida esperados.
Cuanto más larga sea la longitud de la secuencia de entrada pasada a un modelo, más lenta será la respuesta. Algunos de los enfoques utilizados para ejecutar LLM en tiempo real implican agrupar las solicitudes de entrada de los usuarios o solicitudes para realizar inferencias sobre las solicitudes simultáneamente, lo que ayuda a mejorar el rendimiento. Generalmente, utilizar una GPU potente y ofrecer LLM con herramientas eficientes como vLLM mejora tanto la latencia como el rendimiento en tiempo real.
Ejecute la implementación de vLLM en Google Colab
La cuantización es la conversión de un modelo de aprendizaje automático de una precisión más alta a una precisión más baja reduciendo los pesos del modelo a bits más pequeños, generalmente 8 bits o 4 bits. Las herramientas de implementación como vLLM son muy útiles para realizar inferencias de modelos de lenguajes grandes con muy baja latencia y alto rendimiento. somos capaces de correr fi-2 con Hugging Face y vLLM convenientemente en la GPU T4 en Google Colab porque es un LLM más pequeño con 2,7 mil millones de parámetros. Por ejemplo, un modelo de 7 mil millones de parámetros como Mistral 7B no se puede ejecutar en Colab ni con Hugging Face ni con vLLM. La cuantificación es mejor para gestionar los requisitos de hardware de GPU para modelos de lenguaje grande. Cuando la disponibilidad de GPU es limitada y necesitamos ejecutar un modelo de lenguaje muy grande, la cuantificación es el mejor enfoque para cargar LLM en dispositivos restringidos.
bitsybytes
Es una biblioteca de Python construida con funciones de cuantificación personalizadas para reducir los pesos del modelo a bits más bajos (8 bits y 4 bits).
Instalar BitsandBytes
pip3 install bitsandbytes
Cuantización del modelo Mistral 7B
Mistral 7B, un modelo de 7 mil millones de parámetros de MistralAI, es uno de los mejores modelos de lenguajes grandes de código abierto de última generación. Seguiré un proceso de ejecución paso a paso. Mistral 7B con diferentes técnicas de cuantificación que se pueden ejecutar en la GPU T4 en Google Colab.
Cuantización con precisión de 8 bits: Esta es la conversión del peso de un modelo de aprendizaje automático a una precisión de 8 bits. bitsybytes se ha integrado con los transformadores Hugging Face para cargar un modelo de lenguaje usando el mismo código de Hugging Face, pero con modificaciones menores para la cuantización.
Línea 1: Se importaron los paquetes necesarios para ejecutar el modelo, incluido el Configuración de bits y bytes biblioteca.
Línea 3–4: Definí la configuración de cuantificación y establecí el parámetro. cargar_en_8bit a verdadero para cargar los pesos del modelo en 8 bits precisión.
Línea 7–9: Pasó la configuración de cuantificación a la función para cargar el modelo, configuró el parámetro mapa_dispositivo para bits y bytes para asignar automáticamente la memoria GPU adecuada para cargar el modelo. Finalmente cargué los pesos del tokenizador.
Cuantización con precisión de 4 bits: Esta es la conversión del peso de un modelo de aprendizaje automático en 4-bit precisión.
El código para cargar. Mistral 7B en precisión de 4 bits es similar a la de 8 bits precisión excepto por algunos cambios:
- cambió cargar_en_8bit a cargar_en_4bit.
- Un nuevo parámetro bnb_4bit_compute_dtipo se introduce en el Configuración de bits y bytes para realizar el cálculo del modelo en bfloat16. bfloat16 es un tipo de datos de cálculo para cargar los pesos del modelo para una inferencia más rápida. Se puede utilizar con ambos 4 bits y 8 bits precisiones. si esta en 8 bits solo necesitas cambiar el parámetro de bnb_4bit_compute_dtype a bnb_8bit_compute_dtype.
NF4 (flotante normal de 4 bits) y Doble Cuantización
NF4 (flotante normal de 4 bits) de QLoRA es un enfoque de cuantificación óptimo que produce mejores resultados que la cuantificación estándar de 4 bits. Está integrado con doble cuantificación, donde la cuantificación ocurre dos veces; Los pesos cuantificados de la primera etapa de cuantificación se pasan a la siguiente etapa de cuantificación, lo que produce valores de rango flotante óptimos para los pesos del modelo. Según el informe del periódico QLoRA, NF4 con doble cuantificación no sufre una caída en el rendimiento de precisión. Lea más detalles técnicos detallados sobre NF4 y la doble cuantificación en el documento QLoRA:
Línea 4–9: Se establecieron parámetros adicionales Configuración de BitsandBytes:
- carga_4bit: El modelo de carga con precisión de 4 bits se establece en verdadero.
- bnb_4bit_quant_type: El tipo de cuantificación se establece en nf4.
- bnb_4bit_use_double_quant: La cuantización doble está configurada en Verdadero.
- bnb_4_bit_compute_dtype: bfloat16 El tipo de datos de cálculo se utiliza para una inferencia más rápida.
Línea 11-13: Cargué los pesos y el tokenizador del modelo.
Código completo para la cuantización del modelo
Salida generada
<s> (INST) What is Natural Language Processing? (/INST) Natural Language Processing (NLP) is a subfield of artificial intelligence (ai) and
computer science that deals with the interaction between computers and human language. Its main objective is to read, decipher,
understand, and make sense of the human language in a valuable way. It can be used for various tasks such as speech recognition,
text-to-speech synthesis, sentiment analysis, machine translation, part-of-speech tagging, name entity recognition,
summarization, and question-answering systems. NLP technology allows machines to recognize, understand,
and respond to human language in a more natural and intuitive way, making interactions more accessible and efficient.</s>
La cuantización es un enfoque muy bueno para optimizar la ejecución de modelos de lenguaje muy grandes en GPU más pequeñas y se puede aplicar a cualquier modelo, como Llama 70B, Falcon 40B y mpt-30b. Según informes del Documento LLM.int8, los modelos de lenguaje muy grandes sufren menos caídas de precisión cuando se cuantifican en comparación con los más pequeños. La cuantificación se aplica mejor a modelos de lenguaje muy grandes y no funciona bien para modelos más pequeños debido a la pérdida de precisión.
Ejecute la cuantización Mixtral 7B en Google Colab
Conclusión
En este artículo, proporcioné un enfoque paso a paso para medir el rendimiento de la velocidad de un modelo de lenguaje grande, expliqué cómo funciona vLLM y cómo se puede utilizar para mejorar la latencia y el rendimiento de un modelo de lenguaje grande. Finalmente, expliqué la cuantificación y cómo se usa para cargar modelos de lenguaje grandes en GPU de pequeña escala.
Comuníquese conmigo a través de:
Correo electrónico: [email protected]
Linkedin: https://www.linkedin.com/in/ayoola-olafenwa-003b901a9/
Referencias