El tan esperado liberar del lote de Llama de tercera generación de Meta está aquí, y quiero asegurarme de que sepa cómo implementar este LLM de última generación (SoTA) de manera óptima. En este tutorial, nos centraremos en realizar una cuantificación de solo peso (WOQ) para comprimir el modelo de parámetros 8B y mejorar la latencia de inferencia, pero primero, analicemos Meta Llama 3.
Hasta la fecha, la familia Llama 3 incluye modelos que van desde los parámetros 8B hasta 70B, y habrá más versiones en el futuro. Los modelos vienen con un permisivo Meta Llama 3. licencia, le recomendamos que los revise antes de aceptar los términos necesarios para utilizarlos. Esto marca un capítulo emocionante para la familia de modelos Llama y la IA de código abierto.
Arquitectura
Llama 3 es un LLM autorregresivo basado en un transformador solo decodificador. En comparación con Llama 2, el equipo Meta ha realizado las siguientes mejoras notables:
- Adopción de atención de consultas agrupadas (GQA), que mejora la eficiencia de la inferencia.
- Tokenizador optimizado con un vocabulario de 128K tokens diseñado para codificar el lenguaje de manera más eficiente.
- Entrenado con un conjunto de datos de tokens de 15 billones, es 7 veces más grande que el conjunto de datos de entrenamiento de Llama 2 e incluye 4 veces más código.
La siguiente figura (Figura 1) es el resultado de print(model)
dónde model
es meta-llama/Meta-Llama-3–8B-Instruct. En esta figura, podemos ver que el modelo comprende 32 LlamaDecoderLayers compuestos por componentes de autoatención de Llama Attention. Además, cuenta con LlamaMLP, LlamaRMSNorm y un cabezal Lineal. Esperamos aprender más una vez que se publique el artículo de investigación de Llama 3.
Rendimiento del modelado del lenguaje
El modelo se evaluó en varios puntos de referencia de modelado de lenguajes estándar de la industria, como MMLU, GPQA, HumanEval, GSM-8K, MATH y más. A los efectos de este tutorial, revisaremos el rendimiento de los «Modelos ajustados por instrucciones» (Figura 2). El aspecto más notable de estas cifras es que el modelo de parámetros Llama 3 8B supera al Llama 2 70B entre un 62% y un 143% en los puntos de referencia informados, ¡y es un modelo un 88% más pequeño!
El mayor rendimiento del modelado de lenguaje, las licencias permisivas y las eficiencias arquitectónicas incluidas en esta última generación de Llama marcan el comienzo de un capítulo muy emocionante en el espacio de la IA generativa. Exploremos cómo podemos optimizar la inferencia en las CPU para implementaciones escalables y de baja latencia de Llama 3.
en un Artículo anterior, cubrí la importancia de la compresión de modelos y la optimización general de la inferencia en el desarrollo de aplicaciones basadas en LLM. En este tutorial, nos centraremos en aplicar la cuantificación de solo peso (WOQ) a meta-llama/Meta-Llama-3–8B-Instruct. WOQ ofrece un equilibrio entre rendimiento, latencia y precisión, con opciones para cuantificar a int4 o int8. Un componente clave de WOQ es el paso de descuantización, que convierte los pesos int4/in8 a bf16 antes del cálculo.
Configuración del entorno
Necesitará aproximadamente 60 GB de RAM para realizar WOQ en Llama-3-8B-Instruct. Esto incluye ~30 GB para cargar el modelo completo y ~30 GB para la memoria máxima durante la cuantificación. El WOQ Llama 3 solo consumirá ~10 GB de RAM, lo que significa que podemos liberar ~50 GB de RAM liberando el modelo completo de la memoria.
Puedes ejecutar este tutorial en el entorno gratuito JupyterLab*. Este entorno ofrece un Intel de 4ta generación.® Xeón® CPU con 224 hilos y 504 GB de memoria, más que suficiente para ejecutar este código.
Si ejecuta esto en su propio IDE, es posible que necesite abordar dependencias adicionales como instalar Jupyter y/o configurar un entorno conda/python. Antes de comenzar, asegúrese de tener instaladas las siguientes dependencias.
intel-extension-for-pytorch==2.2
transformers==4.35.2
torch==2.2.0
huggingface_hub
Accediendo y configurando Llama 3
Necesitará una cuenta de Hugging Face* para acceder al modelo y al tokenizador de Llama 3.
Para hacerlo, seleccione «Tokens de acceso» en su menú de configuración (Figura 4) y cree un token.
Copie su token de acceso y péguelo en el campo «Token» generado dentro de su celda de Jupyter después de ejecutar el siguiente código.
from huggingface_hub import notebook_login, Repository# Login to Hugging Face
notebook_login()
Ir a meta-llama/Meta-Llama-3–8B-Instruct y evalúe cuidadosamente los términos y la licencia antes de proporcionar su información y enviar la solicitud de acceso a Llama 3. Aceptar los términos del modelo y proporcionar tu información es tuyo y sólo tuyo.
Cuantización de Llama-3–8B-Instruct con WOQ
Aprovecharemos el Extensión Intel® para PyTorch* para aplicar WOQ a Llama 3. Esta extensión contiene las últimas optimizaciones de PyTorch para hardware Intel. Siga estos pasos para cuantificar y realizar inferencias con un modelo Llama 3 optimizado:
- Modelo Llama 3 y Tokenizador: Importe los paquetes necesarios y utilice el
AutoModelForCausalLM.from_pretrained()
yAutoTokenizer.from_pretrained()
métodos para cargar el tokenizador y los pesos específicos de Llama-3–8B-Instruct.
import torch
import intel_extension_for_pytorch as ipex
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamerModel = 'meta-llama/Meta-Llama-3-8B-Instruct'
model = AutoModelForCausalLM.from_pretrained(Model)
tokenizer = AutoTokenizer.from_pretrained(Model)
2. Configuración de receta de cuantificación: Configure la receta de cuantificación WOQ. Podemos configurar el weight_dtype
variable a los tipos de datos en memoria deseados, eligiendo entre torch.quint4x2
o torch.qint8
para int4 e in8, respectivamente. Además podemos utilizar lowp_model
para definir la precisión de la descuantización. Por ahora, mantendremos esto como ipex.quantization.WoqLowpMode.None
para mantener la precisión de cálculo predeterminada de bf16.
qconfig = ipex.quantization.get_weight_only_quant_qconfig_mapping(
weight_dtype=torch.quint4x2, # or torch.qint8
lowp_mode=ipex.quantization.WoqLowpMode.NONE, # or FP16, BF16, INT8
)
checkpoint = None # optionally load int4 or int8 checkpoint# PART 3: Model optimization and quantization
model_ipex = ipex.llm.optimize(model, quantization_config=qconfig, low_precision_checkpoint=checkpoint)
del model
Usamos ipex.llm.optimize()
para aplicar WOQ y luego del model
para eliminar el modelo completo de la memoria y liberar ~30 GB de RAM.
3. Incitando a Llama 3: Llama 3, al igual que LLama 2, tiene una plantilla de indicaciones predefinida para sus modelos ajustados por instrucciones. Con esta plantilla, los desarrolladores pueden definir instrucciones específicas de comportamiento del modelo y proporcionar indicaciones al usuario e historial de conversaciones.
system= """\n\n You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. If you don't know the answer to a question, please don't share false information."""
user= "\n\n You are an expert in astronomy. Can you tell me 5 fun facts about the universe?"
model_answer_1 = 'None'llama_prompt_tempate = f"""
<|begin_of_text|>\n<|start_header_id|>system<|end_header_id|>{system}
<|eot_id|>\n<|start_header_id|>user<|end_header_id|>{user}
<|eot_id|>\n<|start_header_id|>assistant<|end_header_id|>{model_answer_1}<|eot_id|>
"""
inputs = tokenizer(llama_prompt_tempate, return_tensors="pt").input_ids
Proporcionamos los campos obligatorios y luego usamos el tokenizador para convertir toda la plantilla en tokens para el modelo.
4. Llama 3 Inferencia: Para la generación de texto, aprovechamos TextStreamer
para generar un flujo de inferencia en tiempo real en lugar de imprimir el resultado completo de una vez. Esto da como resultado una experiencia de generación de texto más natural para los lectores. Proporcionamos el transmisor configurado para model_ipex.generate()
y otros parámetros de generación de texto.
with torch.inference_mode():
tokens = model_ipex.generate(
inputs,
streamer=streamer,
pad_token_id=128001,
eos_token_id=128001,
max_new_tokens=300,
repetition_penalty=1.5,
)
Al ejecutar este código, el modelo comenzará a generar resultados. Tenga en cuenta que se trata de salidas sin filtrar ni protegidas. Para casos de uso del mundo real, deberá realizar consideraciones adicionales de posprocesamiento.
Eso es todo. Con menos de 20 líneas de código, ahora tiene una versión optimizada para CPU de baja latencia del último SoTA LLM del ecosistema.
Consideraciones para la implementación
Dependiendo de su estrategia de implementación del servicio de inferencia, hay algunas cosas que deberá considerar:
- Si implementa instancias de Llama 3 en contenedores, WOQ ofrecerá una huella de memoria más pequeña y le permitirá ofrecer múltiples servicios de inferencia del modelo en un solo nodo de hardware.
- Al implementar múltiples servicios de inferencia, debe optimizar los subprocesos y la memoria reservada para cada instancia de servicio. Deje suficiente memoria adicional (~4 GB) y subprocesos (~4 subprocesos) para manejar procesos en segundo plano.
- Considere guardar la versión WOQ del modelo y almacenarla en un registro de modelos para eliminar la necesidad de volver a cuantificar el modelo por implementación de instancia.
La familia Llama 3 LLM de Meta ofrece mejoras notables con respecto a generaciones anteriores con una amplia gama de configuraciones (8B a 70B). En este tutorial, exploramos la mejora de la inferencia de la CPU con cuantificación de solo peso (WOQ), una técnica que minimiza la latencia y preserva la precisión.
Al integrar la nueva generación de LLM Llama 3 orientados al rendimiento con técnicas de optimización como WOQ, los desarrolladores pueden desbloquear nuevas posibilidades para GenAI aplicaciones. Esta combinación simplifica los requisitos de hardware para lograr resultados de alta fidelidad y baja latencia de los LLM integrados en sistemas nuevos y existentes.
Algunas cosas interesantes para probar a continuación serían:
- Experimente con niveles de cuantificación: Debe probar la cuantificación int4 e int8 para identificar el mejor compromiso entre rendimiento y precisión para sus aplicaciones específicas.
- Supervisión del rendimiento: Es crucial evaluar continuamente el rendimiento y la precisión del modelo Llama 3 en diferentes escenarios del mundo real para garantizar que la cuantificación mantenga la efectividad deseada.
- Prueba más Llamas: Explore toda la familia Llama 3 y evalúe el impacto de WOQ y otros PyTorch recetas de cuantificación.