Haciendo LLMs más ligeros con AutoGPTQ y transformers

LLMs más ligeros con AutoGPTQ y transformers

Los grandes modelos de lenguaje han demostrado capacidades notables en comprender y generar texto similar al humano, revolucionando aplicaciones en diversos campos. Sin embargo, las demandas que estos modelos tienen en el hardware de los consumidores para entrenamiento y despliegue se han vuelto cada vez más difíciles de satisfacer.

🤗 La misión principal de Hugging Face es democratizar el buen aprendizaje automático, y esto incluye hacer que los modelos grandes sean lo más accesibles posible para todos. En el mismo espíritu de nuestra colaboración bitsandbytes, acabamos de integrar la biblioteca AutoGPTQ en Transformers, lo que permite a los usuarios cuantizar y ejecutar modelos con una precisión de 8, 4, 3 o incluso 2 bits utilizando el algoritmo GPTQ (Frantar et al. 2023). Existe una degradación de precisión insignificante con una cuantización de 4 bits, con una velocidad de inferencia comparable a la referencia fp16 para tamaños de lote pequeños. Tenga en cuenta que el método GPTQ difiere ligeramente de los métodos de cuantización posterior al entrenamiento propuestos por bitsandbytes, ya que requiere pasar un conjunto de datos de calibración.

Esta integración está disponible tanto para GPUs Nvidia como para GPUs AMD con tecnología RoCm.

Tabla de contenidos

  • Recursos
  • Un resumen conciso del artículo GPTQ
  • Biblioteca AutoGPTQ: la biblioteca todo en uno para aprovechar eficientemente GPTQ en LLMs
  • Soporte nativo de modelos GPTQ en 🤗 Transformers
  • Cuantificación de modelos con la biblioteca Optimum
  • Ejecución de modelos GPTQ a través de Inferencia de Generación de Texto
  • Ajuste fino de modelos cuantizados con PEFT
  • Espacio para mejoras
    • Modelos compatibles
  • Conclusión y palabras finales
  • Agradecimientos

Recursos

Este blogpost y lanzamiento vienen con varios recursos para comenzar con la cuantización GPTQ:

  • Artículo original
  • Notebook de Google Colab para uso básico: este notebook muestra cómo cuantizar su modelo de Transformers con el método GPTQ, cómo realizar inferencia y cómo realizar ajuste fino con el modelo cuantizado.
  • Documentación de integración de Transformers
  • Documentación de integración de Optimum
  • Repositorios de Bloke con modelos GPTQ compatibles.

Un resumen conciso del artículo GPTQ

Los métodos de cuantización generalmente pertenecen a una de dos categorías:

  1. Cuantización Post-Entrenamiento (PTQ): Cuantizamos un modelo pre-entrenado utilizando recursos moderados, como un conjunto de datos de calibración y algunas horas de cálculo.
  2. Entrenamiento con Conciencia de Cuantización (QAT): La cuantización se realiza antes del entrenamiento o ajuste fino adicional.

GPTQ se encuentra en la categoría PTQ y esto es particularmente interesante para modelos masivos, para los cuales el entrenamiento completo del modelo o incluso el ajuste fino pueden ser muy costosos.

Específicamente, GPTQ adopta un esquema de cuantización mixto int4/fp16 donde los pesos se cuantizan como int4 mientras que las activaciones permanecen en float16. Durante la inferencia, los pesos se descuantizan sobre la marcha y el cálculo real se realiza en float16.

Los beneficios de este esquema son dos:

  • Ahorro de memoria cercano a x4 para la cuantización int4, ya que la descuantización ocurre cerca de la unidad de cálculo en un kernel fusionado, y no en la memoria global de la GPU.
  • Posibles aceleraciones gracias al tiempo ahorrado en la comunicación de datos debido al menor ancho de bits utilizado para los pesos.

El artículo GPTQ aborda el problema de compresión por capa:

Dada una capa lll con matriz de pesos WlW_{l}Wl​ y entrada de capa XlX_{l}Xl​, queremos encontrar una versión cuantizada del peso W^l\hat{W}_{l}W^l​ que minimice el error cuadrático medio (MSE):

W^l∗=argminWl^∥WlX−W^lX∥22{\hat{W}_{l}}^{*} = argmin_{\hat{W_{l}}} \|W_{l}X-\hat{W}_{l}X\|^{2}_{2}W^l​∗=argminWl​^​​∥Wl​X−W^l​X∥22​

Una vez resuelto esto por capa, se puede obtener una solución al problema global combinando las soluciones por capa.

Para resolver este problema de compresión por capa, el autor utiliza el marco de cuantización cerebral óptima (Frantar et al 2022). El método OBQ parte de la observación de que la ecuación anterior puede escribirse como la suma de los errores al cuadrado, sobre cada fila de WlW_{l}Wl​.

∑i=0drow∥Wl[i,:]X−W^l[i,:]X∥22 \sum_{i=0}^{d_{row}} \|W_{l[i,:]}X-\hat{W}_{l[i,:]}X\|^{2}_{2} ∑i=0drow​​∥Wl[i,:]​X−W^l[i,:]​X∥22​

Esto significa que podemos cuantizar cada fila de forma independiente. Esto se llama cuantización por canal. Para cada fila Wl[i,:]W_{l[i,:]}Wl[i,:]​, OBQ cuantiza un peso a la vez mientras actualiza siempre todos los pesos aún no cuantizados, para compensar el error incurrido al cuantizar un solo peso. La actualización de los pesos seleccionados tiene una fórmula de forma cerrada, utilizando matrices Hessiana.

El documento GPTQ mejora este marco al introducir un conjunto de optimizaciones que reducen la complejidad del algoritmo de cuantización manteniendo la precisión del modelo.

En comparación con OBQ, el paso de cuantización en sí también es más rápido con GPTQ: se necesitan 2 horas de GPU para cuantizar un modelo BERT (336M) con OBQ, mientras que con GPTQ, un modelo Bloom (176B) puede cuantizarse en menos de 4 horas de GPU.

Para obtener más información sobre el algoritmo exacto y las diferentes pruebas de referencia sobre perplejidad y aceleración, consulte el documento original.

Biblioteca AutoGPTQ: la biblioteca de referencia para aprovechar eficientemente GPTQ para LLMs

La biblioteca AutoGPTQ permite a los usuarios cuantizar modelos 🤗 Transformers utilizando el método GPTQ. Si bien los esfuerzos comunitarios paralelos como GPTQ-for-LLaMa, Exllama y llama.cpp implementan métodos de cuantización estrictamente para la arquitectura Llama, AutoGPTQ ha ganado popularidad gracias a su cobertura completa de una amplia gama de arquitecturas de transformers.

Dado que la biblioteca AutoGPTQ tiene una mayor cobertura de modelos de transformers, decidimos proporcionar una API integrada de 🤗 Transformers para hacer que la cuantización de LLM sea más accesible para todos. En este momento hemos integrado las opciones de optimización más comunes, como los núcleos CUDA. Para opciones más avanzadas, como los núcleos Triton o la compatibilidad con atención fusionada, consulte la biblioteca AutoGPTQ.

Soporte nativo de modelos GPTQ en 🤗 Transformers

Después de instalar la biblioteca AutoGPTQ y optimum (pip install optimum), ejecutar modelos GPTQ en Transformers es tan simple como:

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("TheBloke/Llama-2-7b-Chat-GPTQ", torch_dtype=torch.float16, device_map="auto")

Consulte la documentación de Transformers para obtener más información sobre todas las características.

Nuestra integración de AutoGPTQ tiene muchas ventajas:

  • Los modelos cuantizados son serializables y se pueden compartir en el Hub.
  • GPTQ reduce drásticamente los requisitos de memoria para ejecutar LLMs, mientras que la latencia de inferencia es comparable a la inferencia con FP16.
  • AutoGPTQ admite núcleos Exllama para una amplia gama de arquitecturas.
  • La integración cuenta con soporte nativo de RoCm para GPU AMD.
  • Está disponible el ajuste fino con PEFT.

Puede comprobar en el Hub si su modelo favorito ya ha sido cuantizado. TheBloke, uno de los principales colaboradores de Hugging Face, ha cuantizado muchos modelos con AutoGPTQ y los ha compartido en el Hugging Face Hub. Trabajamos juntos para asegurarnos de que estos repositorios funcionen de manera óptima con nuestra integración.

Este es un ejemplo de prueba para el caso de tamaño de lote = 1. La prueba se realizó en una sola GPU NVIDIA A100-SXM4-80GB. Utilizamos una longitud de inicio de 512 y generamos exactamente 512 nuevos tokens. La primera fila es la referencia sin cuantizar en fp16, mientras que las otras filas muestran el consumo de memoria y el rendimiento utilizando diferentes núcleos de AutoGPTQ.

Una referencia reproducible más completa está disponible aquí.

Quantizar modelos con la biblioteca Optimum

Para integrar perfectamente AutoGPTQ en Transformers, utilizamos una versión minimalista de la API de AutoGPTQ que está disponible en Optimum, la herramienta de Hugging Face para entrenamiento y optimización de inferencia. Siguiendo este enfoque, logramos una integración fácil con Transformers, al tiempo que permitimos a las personas utilizar la API de Optimum si desean cuantizar sus propios modelos. ¡Consulta la documentación de Optimum si quieres cuantizar tus propios LLM!

La cuantización de los modelos de Transformers 🤗 con el método GPTQ se puede hacer en pocas líneas de código:

from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset="c4", tokenizer=tokenizer)

model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=quantization_config)

La cuantización de un modelo puede llevar mucho tiempo. Ten en cuenta que para un modelo de 175B, se requieren al menos 4 horas de GPU si se utiliza un conjunto de datos grande (por ejemplo, `”c4″`). Como se mencionó anteriormente, muchos modelos GPTQ ya están disponibles en el Hugging Face Hub, lo que evita la necesidad de cuantizar un modelo tú mismo en la mayoría de los casos de uso. Sin embargo, también puedes cuantizar un modelo utilizando tu propio conjunto de datos adecuado para el dominio particular en el que estás trabajando.

Ejecución de modelos GPTQ a través de Inferencia de Generación de Texto

Paralelamente a la integración de GPTQ en Transformers, se agregó soporte para GPTQ a la biblioteca de Inferencia de Generación de Texto (TGI), diseñada para servir modelos de lenguaje grandes en producción. Ahora se puede utilizar GPTQ junto con características como el batching dinámico, la atención paginada y la atención flash para una amplia gama de arquitecturas.

Como ejemplo, esta integración permite servir un modelo de 70B en una sola GPU A100-80GB. Esto no es posible utilizando un checkpoint fp16, ya que excede la memoria GPU disponible.

Puedes obtener más información sobre el uso de GPTQ en TGI en la documentación.

Ten en cuenta que el kernel integrado en TGI no escala muy bien con tamaños de lote más grandes. Aunque este enfoque ahorra memoria, se esperan ralentizaciones con tamaños de lote más grandes.

Ajuste fino de modelos cuantizados con PEFT

No puedes entrenar aún más un modelo cuantizado utilizando los métodos regulares. Sin embargo, aprovechando la biblioteca PEFT, ¡puedes entrenar adaptadores adicionales! Para hacerlo, congelamos todas las capas del modelo cuantizado y agregamos los adaptadores entrenables. Aquí tienes algunos ejemplos de cómo usar PEFT con un modelo GPTQ: cuaderno de Colab y script de ajuste fino.

Espacio para mejoras

Nuestra integración de AutoGPTQ ya ofrece beneficios impresionantes a un costo reducido en la calidad de la predicción. Aún queda espacio para mejoras, tanto en las técnicas de cuantización como en las implementaciones del kernel.

En primer lugar, aunque AutoGPTQ se integra (según nuestro conocimiento) con el kernel W4A16 más eficiente en términos de rendimiento (pesos como int4, activaciones como fp16) de la implementación exllama, existe una buena posibilidad de que el kernel aún pueda mejorarse. Ha habido otras implementaciones prometedoras de Kim et al. y del MIT Han Lab que parecen ser prometedoras. Además, según nuestras pruebas internas, aún no hay un kernel W4A16 de código abierto y eficiente en términos de rendimiento escrito en Triton, lo que podría ser una dirección a explorar.

En cuanto a la cuantización, hay que enfatizar nuevamente que este método solo cuantiza los pesos. Se han propuesto otros enfoques para la cuantización de LLM que pueden cuantizar tanto los pesos como las activaciones con un costo reducido en la calidad de la predicción, como LLM-QAT donde se puede utilizar un esquema mixto de int4/int8, así como la cuantización de la caché clave-valor. Una de las ventajas importantes de esta técnica es la capacidad de utilizar aritmética entera real para los cálculos, con, por ejemplo, los Tensor Cores de Nvidia que admiten cálculos int8. Sin embargo, según nuestro conocimiento, no hay kernels de cuantización W4A8 de código abierto disponibles, pero esta podría ser una dirección interesante para explorar.

En el lado del kernel, diseñar kernels W4A16 de alto rendimiento para tamaños de batch más grandes sigue siendo un desafío abierto.

Modelos compatibles

En esta implementación inicial, solo se admiten modelos de lenguaje grandes con una arquitectura de solo decodificador o solo codificador. Esto puede parecer un poco restrictivo, pero abarca la mayoría de los modelos de lenguaje de última generación como Llama, OPT, GPT-Neo, GPT-NeoX.

Actualmente no se admiten modelos de visión, audio y multimodales muy grandes.

Conclusión y palabras finales

En esta publicación de blog hemos presentado la integración de la biblioteca AutoGPTQ en Transformers, lo que permite cuantizar modelos de lenguaje de última generación con el método GPTQ para hacerlos más accesibles para cualquier persona en la comunidad y capacitarlos para construir herramientas y aplicaciones emocionantes con estos modelos.

Esta integración está disponible tanto para GPU Nvidia como para GPU AMD con tecnología RoCm, lo cual es un gran avance hacia la democratización de los modelos cuantizados para arquitecturas de GPU más amplias.

La colaboración con el equipo de AutoGPTQ ha sido muy fructífera y estamos muy agradecidos por su apoyo y su trabajo en esta biblioteca.

Esperamos que esta integración facilite el uso de modelos de lenguaje de última generación en aplicaciones y estamos ansiosos por ver qué construirán con ella.

No te pierdas los recursos útiles compartidos arriba para comprender mejor la integración y cómo comenzar rápidamente con la cuantización GPTQ.

  • Documento original
  • Notebook básico de uso en Google Colab: Este notebook muestra cómo cuantizar tu modelo de Transformers con el método GPTQ, cómo hacer inferencia y cómo hacer ajuste fino con el modelo cuantizado.
  • Documentación de integración de Transformers
  • Documentación de integración de Optimum
  • Repositorios de The Bloke con modelos GPTQ compatibles.

Agradecimientos

Queremos agradecer a William por su apoyo y su trabajo en la increíble biblioteca AutoGPTQ y por su ayuda en la integración. También queremos agradecer a TheBloke por su trabajo en la cuantización de muchos modelos con AutoGPTQ y por compartirlos en el Hub y por su ayuda con la integración. También queremos agradecer a qwopqwop200 por sus continuas contribuciones a la biblioteca AutoGPTQ y su trabajo en la ampliación de la biblioteca para CPU, que se lanzará en las próximas versiones de AutoGPTQ.

Por último, queremos agradecer a Pedro Cuenca por su ayuda en la redacción de esta publicación de blog.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

50+ Nuevas Herramientas de Inteligencia Artificial (IA) de Vanguardia (noviembre de 2023)

Las herramientas de IA están aumentando rápidamente su desarrollo, con nuevas herramientas que se presentan regularme...

Ciencias de la Computación

El perro robot detecta mejor los nidos invasores de hormigas de fuego que los humanos.

Científicos en China y Brasil están probando perros robóticos e inteligencia artificial (IA) para detectar nidos inva...

Inteligencia Artificial

Conoce a PoisonGPT Un método de IA para introducir un modelo malicioso en una cadena de suministro de LLM de otra manera confiable

En medio de todo el revuelo en torno a la inteligencia artificial, las empresas están comenzando a darse cuenta de la...