curso
MatMul-Libres vs MatMul LLMs: Velocidad y consumo de memoria
Los grandes modelos lingüísticos (LLM) dependen en gran medida de las multiplicaciones de matrices (MatMul) para sus operaciones, lo que conlleva unos requisitos computacionales y de memoria máxima sustanciales. Sin embargo, en un artículo reciente ha surgido un nuevo arquetipo de LLM sin MatMul, que promete un rendimiento comparable con un uso de recursos potencialmente reducido.
En este artículo, compararé los LLM sin MatMul con sus homólogos clásicos. Examinaré sus capacidades generativas y el consumo de recursos en tres tamaños de modelo diferentes: Parámetros 370M, 1,3B y 2,7B. Mi análisis abarcará la velocidad y el consumo máximo de memoria de los modelos, destacando las ventajas potenciales de las arquitecturas sin MatMul en la PNL moderna.
Para saber más sobre los LLM sin MatMul, puedes leer este artículo: LLMs sin MatMul: Explicación de los conceptos clave.
Configurar
Esta sección repasará el montaje que utilicé para realizar los experimentos.
Modelos para comparar
Los autores del artículo no mencionan explícitamente con qué modelos compararon sus modelos sin MatMul. Sólo afirman que "compara dos variantes de nuestro LM sin MatMul frente a una arquitectura Transformer avanzada reproducida (Transformer++, basada en Llama-2) en tres tamaños de modelo: 370M, 1,3B y 2,7B parámetros". Además, todos los modelos se entrenaron con el conjunto de datos SlimPajama.
Para garantizar una comparación justa, lo ideal es utilizar modelos de código abierto entrenados en el mismo conjunto de datos. Sin embargo, debido a la falta de disponibilidad de tales modelos, este artículo compara el consumo máximo de memoria y la velocidad de modelos disponibles de tamaño similar con las conclusiones presentadas en el documento.
Estos son los modelos con los que los compararemos:
- 370M -gpt2-medium, facebook/opt-350m
- 1.3B - microsoft/phi-1_5, openai-community/gpt2-xl
- 2.7B - facebook/opt-2.7b
Es importante señalar que los LLM sin MatMul utilizan pesos ternarios y activaciones BF16, lo que repercute significativamente en sus características de memoria y velocidad. Puesto que ningún otro modelo de nuestro conjunto de comparación utiliza pesos ternarios y activaciones BF16, estas características proporcionan a los LLM sin MatMul ventajas únicas en términos de eficiencia de memoria y velocidad de procesamiento. Esta distinción será crucial en nuestro análisis comparativo, destacando cómo contribuyen estas innovaciones al rendimiento general de los modelos sin MatMul.
Instalar las bibliotecas necesarias
Para realizar nuestras comparaciones, trabajaremos en un entorno Google Colab con un tiempo de ejecución GPU T4. Esta configuración proporciona una plataforma potente pero accesible para ejecutar y evaluar grandes modelos lingüísticos.
La biblioteca principal que utilizaremos es la biblioteca transformers
de huggingface, ya que todos los modelos que necesitamos están disponibles a través de ella. Podemos instalarlo con el siguiente comando:
pip install transformers
También necesitaremos instalar la biblioteca matmulfreellm
para que funcionen nuestros modelos sin MatMul. La biblioteca es de código abierto y está disponible en GitHubpodemos instalarla ejecutando
pip install -U git+https://github.com/ridgerchu/matmulfreellm
Para controlar el pico de uso de memoria utilizaremos pytorch
, que puede instalarse utilizando una variedad de comandos diferentes, dependiendo de tu sistema y del gestor de paquetes descrito aquí. Si trabajas en Google Colab, debería estar preinstalado.
Realización de experimentos
Así es como realizamos los experimentos. En primer lugar, tenemos que importar las bibliotecas necesarias:
import torch
import time
from transformers import AutoModelForCausalLM, AutoTokenizer
A continuación, para cada experimento, definimos los nombres de los modelos en una lista -el ejemplo proporcionado es para los modelos del intervalo de parámetros 370M-.
model_names = ["gpt2-medium", "facebook/opt-350m", "ridger/MMfreeLM-370M"]
A continuación, cargamos en memoria los modelos y los tokenizadores. Si tu sistema no tiene suficientes, puedes realizar los experimentos por separado para cada modelo. Aquí nos aseguramos de utilizar flotantes de media precisión mediante el método .half()
.
models = [AutoModelForCausalLM.from_pretrained(name).half().cuda() for name in model_names]
tokenizers = [AutoTokenizer.from_pretrained(name) for name in model_names]
También tenemos que establecer la dirección pad_token
para cada tokenizador:
for tokenizer in tokenizers:
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
Para realizar todas las observaciones necesarias, ejecutar los modelos y obtener los resultados, utilizaré la siguiente función measure_performance()
:
def measure_performance(model, tokenizer, prompt):
inputs = tokenizer(prompt, return_tensors="pt", padding=True)
input_ids = inputs.input_ids.cuda()
attention_mask = inputs.attention_mask.cuda()
torch.cuda.reset_peak_memory_stats()
# Measure speed
start_time = time.time()
with torch.no_grad():
outputs = model.generate(
input_ids,
attention_mask=attention_mask,
max_length=128,
pad_token_id=tokenizer.eos_token_id,
repetition_penalty=1.1,
no_repeat_ngram_size=2
)
end_time = time.time()
# Measure memory after inference
peak_memory = torch.cuda.max_memory_allocated() # Peak memory usage during the operation
generation_time = end_time - start_time
memory_consumption = peak_memory / (1024 ** 2) # Convert bytes to MB
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
return generation_time, memory_consumption, generated_text
La función evalúa el rendimiento de un modelo lingüístico midiendo la velocidad de inferencia y el consumo máximo de memoria. Primero tokeniza la solicitud de entrada, asegurándose de que las máscaras de atención y el relleno son adecuados, y transfiere las entradas a la GPU. El uso de memoria se rastrea reiniciando primero y registrando después las estadísticas de pico de memoria, que convertimos en MBs antes de volver.
Creo que el pico de uso de memoria es la estadística más importante, porque es lo que provoca un desbordamiento. La función también mide la velocidad de inferencia registrando el tiempo antes y después de la generación del texto (ésta es la forma estándar de medir el tiempo de ejecución en Python).
Los hiperparámetros que utilizamos para la generación se establecen en el método .generate()
. Utilizamos la longitud máxima de 128 tokens y fijamos la penalización por repetición (esto se hace porque el modelo sin MatMul parecía generar la misma respuesta varias veces). Al final, la función devuelve el tiempo, el consumo máximo de memoria y el texto generado.
Ahora podemos definir el indicador y realizar los experimentos. También recopilaré los datos y ejecutaré los modelos con diferentes indicaciones para reunir los datos.
prompt = "What are the benefits of renewable energy?" #example prompt
results = {}
for name, model, tokenizer in zip(model_names, models, tokenizers):
time_taken, memory_used, output = measure_performance(model, tokenizer,prompt)
results[name] = {
"time_taken": time_taken,
"memory_used": memory_used,
"output": output
}
print(f"Model: {name}\nTime taken: {time_taken} seconds\nMemory used: {memory_used} MB\nOutput: {output}\n")
El resultado es el siguiente:
Evaluating model: gpt2-medium
Prompt: What are the benefits of renewable energy?
Time taken: 3.17 seconds
Peak memory used: 3521.02 MB
Output: What are the benefits of renewable energy?
The answer is that it's cheaper than fossil fuels. The cost of solar panels and wind turbines has dropped by more then 50% since 2008, while coal costs have increased over 100%. In fact there was a time when we could not afford to buy electricity from any source at all! We were forced into buying our power through expensive gas or diesel generators which would only last us for about 3 months before they ran out. Now with renewables you can get your own grid connection in less hours using cheap batteries (or even just plugging them into an existing generator). Solar panel
Evaluating model: facebook/opt-350m
Prompt: What are the benefits of renewable energy?
Time taken: 2.15 seconds
Peak memory used: 3452.84 MB
Output: What are the benefits of renewable energy?
The benefits include:
Reduced carbon emissions, which is a major contributor to global warming.
Increased energy efficiency and reduced energy consumption. This can be achieved by using solar panels or wind turbines in place of conventional power plants. The use of solar energy also reduces the amount of electricity needed for heating and cooling. Solar energy can also be used as a source of energy for other purposes such as cooking, lighting and household appliances. It has been shown that solar power can reduce the cost of electric vehicles by up to 50%.
Improved energy security. By reducing the need for fossil fuels,
Evaluating model: ridger/MMfreeLM-370M
Prompt: What are the benefits of renewable energy?
Time taken: 31.68 seconds
Peak memory used: 3788.36 MB
Output: What are the benefits of renewable energy?
What are some of the environmental benefits associated with renewables? What is the potential impact on our environment and people's health? How can we make our buildings more energy efficient? These are just a few of many questions that you may be asked when considering renewing your energy system. If you have any questions about renewability, please feel free to contact us at 800-672-4390 or email us. We look forward to hearing from you!
How much does it cost to install solar panels in my home? The average cost for installation
Comparación: Sin MatMul vs. MatMul
Por desgracia, los modelos tradicionales superaron sistemáticamente a sus homólogos MatMul-Free tanto en velocidad como en uso máximo de memoria.
Modelos de la gama 370M
Para la gama 370M, comparamos el modelo 370M MatMul-Free con gpt2-medium y facebook/opt-350m.
De media, en todas las preguntas, el modelo MatMul-Free tardó 16 segundos en generar una respuesta y utilizó 2900 MB de memoria. Por otro lado, GPT2-M tardó 3 segundos en generar un aviso y 2810 MB de memoria (probablemente se deba a la diferencia de tamaño, ya que GPT2-M tiene parámetros 350M más grandes). Del mismo modo, la OPT350-M tardó 2,3 segundos en generar una respuesta y 2815 MB de memoria.
Modelos de la gama 1.3B
En este rango, probamos el modelo MatMul-Free contra microsoft/phi-1_5 y openai-community/gpt2-xl.
El modelo gpt tardó, de media, 5,3 segundos en generar la respuesta y tuvo 12435 MB de consumo máximo de memoria. El modelo de Microsoft tardó 2,9 segundos en generar la respuesta y tuvo aproximadamente 12033 MB de consumo máximo de memoria. Por último, ¡el modelo MatMul-Free tardó 37 segundos de media en generar la respuesta y tuvo un consumo máximo de memoria de 5470 MB!
Modelos de la gama 2.7B
Para la última comparación, probamos el modelo MatMul-Free contra facebook/opt-2.7b.
El modelo de Facebook tardó una media de 6 segundos en generar la respuesta y tuvo un consumo medio máximo de memoria de 5200 MB. Por otro lado, el modelo sin MatMul tardó 55,6 segundos en generar el aviso y tuvo un consumo máximo de memoria de 5501,3 MB. Esto no tiene mucho sentido, pero he rehecho el experimento un par de veces y los resultados son los mismos
¿Qué calidad tienen los modelos sin MatMul?
Los modelos MatMul-Free se quedaron cortos en cuanto a velocidad. Sin embargo, aún podemos evaluarlos por la calidad del texto que generan. Realizaremos este experimento con el modelo MatMul-Free más grande disponible. Para obtener una comprensión global de la calidad del texto generado, deberíamos utilizar un conjunto diverso de preguntas - consulta mi código en este repositorio de GitHub (ten en cuenta que los ejemplos de pregunta-respuesta varían un poco porque he vuelto a ejecutar el código y siempre hay algo de aleatoriedad).
Prompt: Escribe un poema sobre el cambio de estación.
Respuesta: **_El Poema_**
* El poeta comienza dando su nombre en este verso inicial: "Soy poeta". Le sigue una introducción en la que se dan algunos datos sobre su vida y su obra, así como sobre su relación con su esposa, a la que se ha descrito como "la mujer más bella que he visto en mi vida". Luego describe su amor por ella en las siguientes líneas:
* "Eres mi sol en un mundo de oscuridad".
* Eres "una estrella para mí", aquella en cuyos ojos veo la luz
Prompt: Explica las diferencias entre aprendizaje supervisado y no supervisado en el aprendizaje automático.
Respuesta: 203: ¿Cuáles son algunos de los problemas que has visto con la supervisión? ¿Cómo se puede solucionar?
El problema es que estamos intentando hacer una predicción para un valor desconocido, en este caso en el futuro, en un entorno muy incierto en el que no sabemos qué ocurrirá en ese periodo de tiempo futuro. Tenemos esta enorme cantidad de datos en nuestro conjunto de datos en términos de un montón de cosas diferentes que potencialmente podrían suceder en este día en particular o este mes específico en el tiempo, pero simplemente no tenemos
Prompt: Explica la teoría de la relatividad.
Respuesta: 2007-09-15 14:36:08 --> Clase de idioma inicializada
13931638 24833432 --> Clases Config cargadas. Se seleccionará automáticamente la siguiente clase. </pre>
<div class="content"> <p class='text-center'>
<strong>Clase</strong><br />
<a href="class/Mage_Core_Model_Config_Abstract.html">Mage_Core_Model_Config</a> </
Prompt: Qué es uno dividido por cero
Respuesta: A: Es la raíz cuadrada de 0.
El cuadrado de un número negativo es igual a ese número multiplicado por sí mismo en base 10, por lo que tiene que ser un número positivo. El cuadrado tiene un valor de $2$, por lo que es un cuadrado en sí mismo. Si quieres averiguar cuál es con los otros números de tu lista, ¡sólo tienes que multiplicarlos!
2$ por 3$ = 6$, por ejemplo. Esto significa que puede tener cualquier valor entre 0$ y 9$.
En general, el texto generado no es coherente en su mayor parte, lo que hace poco práctico el uso de estos modelos. Decidí probar también distintos hiperparámetros: sin penalización por repetición y 512 de longitud máxima. Aquí, el modelo seguía produciendo galimatías; además, repetía las últimas líneas de la respuesta hasta que ésta alcanzaba los 512 tokens. También probé las indicaciones con los hiperparámetros temperature
y top_p
, y el resultado no fue mejor.
¡Siéntete libre de experimentar con estos modelos por tu cuenta!
Resultados
Repasemos ahora los resultados de los experimentos y discutamos sus implicaciones.
Resumen de las conclusiones
El objetivo de los experimentos era evaluar el rendimiento de los LLM sin MatMul en comparación con los modelos tradicionales utilizando diversas métricas, como la velocidad de inferencia y el consumo máximo de memoria. Probamos modelos con diferentes tamaños de parámetros (370M, 1,3B y 2,7B) utilizando una variedad de indicaciones para evaluar su rendimiento en diversos escenarios.
Principales observaciones
He aquí algunas observaciones clave:
- Velocidad de inferencia: Los modelos tradicionales superaron sistemáticamente al modelo sin MatMul en cuanto a velocidad de inferencia. El modelo sin MatMul mostró tiempos de generación más largos en todas las indicaciones.
- Consumo de memoria: ¡El modelo sin MatMul de 1,3B de tamaño de parámetro mostró un uso máximo de memoria significativamente menor en comparación con los modelos tradicionales!
- Calidad de la salida: El modelo parece alucinar mucho, y el texto es un galimatías en su mayor parte. Esto se debe probablemente al limitado conjunto de entrenamiento y al pequeño tamaño del modelo. Sin embargo, con el avance de la arquitectura sin MatMul, tendremos sin duda modelos más capaces.
Ideas de los autores
Al revisar los comentarios de los autores en uno de los temas de GitHubquedó claro que los aumentos de rendimiento de los que informan en su artículo se consiguieron utilizando BitBLAS, una biblioteca especializada optimizada para operaciones binarias y de baja precisión. Sin embargo, BitBLAS aún no está integrado en los modelos disponibles públicamente, y su instalación es compleja, ya que requiere la recompilación del paquete.
Soluciones de hardware a medida
El artículo también destaca el uso de un acelerador FPGA personalizado y de núcleos GPU optimizados para conseguir mejoras significativas de rendimiento. Estas soluciones de hardware están diseñadas para mejorar la eficacia tanto del entrenamiento como de la inferencia. La implementación FPGA, en particular, está adaptada para explotar las operaciones ternarias de forma eficiente, reduciendo significativamente el uso de memoria y la latencia durante la inferencia. Estas configuraciones de hardware personalizadas son esenciales para aprovechar todo el potencial de los LLM sin MatMul, como demuestran las mejoras comunicadas en velocidad y eficiencia de memoria.
Conclusión
Los modelos sin MatMul disponibles actualmente en Hugging Face no presentan las ventajas de rendimiento destacadas en el artículo original. La falta de integración con BitBLAS parece ser un factor importante que contribuye a esta discrepancia. Las ventajas potenciales de las arquitecturas MatMul-Free, como el menor uso de memoria, no se materializan en escenarios prácticos sin un hardware especializado o una mayor optimización. Las velocidades más lentas y el uso de memoria comparable o superior en la mayoría de los casos los hacen menos atractivos para las aplicaciones del mundo real en comparación con los modelos tradicionales.
Comprender los matices y el potencial de las nuevas arquitecturas de modelos, como los LLM sin MatMul, es crucial a medida que el campo de la IA generativa sigue evolucionando. Si quieres leer más sobre lo último en IA, consulta estos artículos:
Aprende IA con estos cursos
programa
Desarrollo de aplicaciones de IA
curso
Seguridad y gestión de riesgos de la IA
blog
Los mejores 8 LLM de código abierto para 2024 y sus usos

blog
Las 5 mejores bases de datos vectoriales
blog
8 modelos de machine learning explicados en 20 minutos
tutorial
Cómo formar a un LLM con PyTorch
tutorial