Inteligencia artificial

Comprensión de los parámetros y requisitos de memoria de los grandes modelos de lenguaje: Un análisis en profundidad

mm
Calculating Parameters in Transformer-based LLMs

Los grandes modelos de lenguaje (LLM) han experimentado avances notables en los últimos años. Modelos como GPT-4, Google’s Gemini y Claude 3 están estableciendo nuevos estándares en capacidades y aplicaciones. Estos modelos no solo están mejorando la generación de texto y la traducción, sino que también están abriendo nuevos caminos en el procesamiento multimodal, combinando texto, imagen, audio y video para proporcionar soluciones de inteligencia artificial más completas.

Por ejemplo, el GPT-4 de OpenAI ha demostrado mejoras significativas en la comprensión y generación de texto similar al humano, mientras que los modelos Gemini de Google destacan en el manejo de diferentes tipos de datos, incluyendo texto, imágenes y audio, lo que permite interacciones más fluidas y contextualmente relevantes. De manera similar, los modelos Claude 3 de Anthropic se destacan por sus capacidades multilingües y un rendimiento mejorado en tareas de inteligencia artificial.

A medida que el desarrollo de los LLM continúa acelerándose, entender las complejidades de estos modelos, particularmente sus parámetros y requisitos de memoria, se vuelve crucial. Esta guía tiene como objetivo desmitificar estos aspectos, ofreciendo una explicación detallada y fácil de entender.

Los conceptos básicos de los grandes modelos de lenguaje

¿Qué son los grandes modelos de lenguaje?

Los grandes modelos de lenguaje son redes neuronales entrenadas en conjuntos de datos masivos para comprender y generar lenguaje humano. Se basan en arquitecturas como los Transformadores, que utilizan mecanismos como la autoatención para procesar y producir texto.

Importancia de los parámetros en los LLM

Los parámetros son los componentes básicos de estos modelos. Incluyen pesos y sesgos, que el modelo ajusta durante el entrenamiento para minimizar errores en las predicciones. La cantidad de parámetros a menudo se correlaciona con la capacidad y el rendimiento del modelo, pero también influye en sus requisitos computacionales y de memoria.

Comprensión de la arquitectura Transformer

Transformers-architecture

Arquitectura de los Transformadores

Visión general

La arquitectura Transformer, introducida en el artículo “Attention Is All You Need” de Vaswani et al. (2017), se ha convertido en la base para muchos LLM. Está compuesta por un codificador y un decodificador, cada uno formado por varias capas idénticas.

Componentes del codificador y decodificador

  • Codificador: Procesa la secuencia de entrada y crea una representación consciente del contexto.
  • Decodificador: Genera la secuencia de salida utilizando la representación del codificador y los tokens generados anteriormente.

Bloques de construcción clave

  1. Atención multi-cabeza: Permite que el modelo se concentre en diferentes partes de la secuencia de entrada simultáneamente.
  2. Redes neuronales feed-forward: Agrega no linealidad y complejidad al modelo.
  3. Normalización de capas: Estabiliza y acelera el entrenamiento al normalizar las salidas intermedias.

Cálculo del número de parámetros

Transformer Training

Modelos preentrenados para el entrenamiento eficiente de Transformadores

Cálculo de parámetros en LLM basados en Transformadores

Desglosemos el cálculo de parámetros para cada componente de un LLM basado en Transformadores. Utilizaremos la notación del artículo original, donde d_model representa la dimensión de los estados ocultos del modelo.

  1. Capa de incrustación:
    • Parámetros = vocab_size * d_model
  2. Atención multi-cabeza:
    • Para h cabezas, con d_k = d_v = d_model / h:
    • Parámetros = 4 * d_model^2 (para Q, K, V y proyecciones de salida)
  3. Red neuronal feed-forward:
    • Parámetros = 2 * d_model * d_ff + d_model + d_ff
    • Dónde d_ff es típicamente 4 * d_model
  4. Normalización de capas:
    • Parámetros = 2 * d_model (para escala y sesgo)

Parámetros totales para una capa de Transformador:

  • Parámetros_capa = Parámetros_atención + Parámetros_ffn + 2 * Parámetros_layernorm

Para un modelo con N capas:

  • Parámetros totales = N * Parámetros_capa + Parámetros_incrustación + Parámetros_salida

Ejemplo de cálculo

Consideremos un modelo con las siguientes especificaciones:

  • d_model = 768
  • h (número de cabezas de atención) = 12
  • N (número de capas) = 12
  • vocab_size = 50,000
  1. Capa de incrustación:
    • 50,000 * 768 = 38,400,000
  2. Atención multi-cabeza:
    • 4 * 768^2 = 2,359,296
  3. Red neuronal feed-forward:
    • 2 * 768 * (4 * 768) + 768 + (4 * 768) = 4,719,616
  4. Normalización de capas:
    • 2 * 768 = 1,536

Parámetros totales por capa:

  • 2,359,296 + 4,719,616 + (2 * 1,536) = 7,081,984

Parámetros totales para 12 capas:

  • 12 * 7,081,984 = 84,983,808

Parámetros totales del modelo:

  • 84,983,808 + 38,400,000 = 123,383,808

Este modelo tendría aproximadamente 123 millones de parámetros.

Tipos de uso de memoria

Al trabajar con LLM, debemos considerar dos tipos principales de uso de memoria:

  1. Memoria del modelo: La memoria necesaria para almacenar los parámetros del modelo.
  2. Memoria de trabajo: La memoria necesaria durante la inferencia o el entrenamiento para almacenar activaciones intermedias, gradientes y estados del optimizador.

Cálculo de la memoria del modelo

La memoria del modelo está directamente relacionada con el número de parámetros. Cada parámetro se almacena típicamente como un número de punto flotante de 32 bits, aunque algunos modelos utilizan entrenamiento de precisión mixta con números de punto flotante de 16 bits.

Memoria del modelo (bytes) = Número de parámetros * Bytes por parámetro

Para nuestro modelo de ejemplo con 123 millones de parámetros:

  • Memoria del modelo (32 bits) = 123,383,808 * 4 bytes = 493,535,232 bytes ≈ 494 MB
  • Memoria del modelo (16 bits) = 123,383,808 * 2 bytes = 246,767,616 bytes ≈ 247 MB

Estimación de la memoria de trabajo

Los requisitos de memoria de trabajo pueden variar significativamente según la tarea específica, el tamaño del lote y la longitud de la secuencia. Una estimación aproximada para la memoria de trabajo durante la inferencia es:

Memoria de trabajo ≈ 2 * Memoria del modelo

Esto cuenta para almacenar tanto los parámetros del modelo como las activaciones intermedias. Durante el entrenamiento, los requisitos de memoria pueden ser aún mayores debido a la necesidad de almacenar gradientes y estados del optimizador:

Memoria de entrenamiento ≈ 4 * Memoria del modelo

Para nuestro modelo de ejemplo:

  • Memoria de trabajo de inferencia ≈ 2 * 494 MB = 988 MB ≈ 1 GB
  • Memoria de entrenamiento ≈ 4 * 494 MB = 1,976 MB ≈ 2 GB

Uso de memoria en estado estable y uso de memoria pico

Al entrenar grandes modelos de lenguaje basados en la arquitectura Transformer, entender el uso de memoria es crucial para la asignación eficiente de recursos. Desglosemos los requisitos de memoria en dos categorías principales: uso de memoria en estado estable y uso de memoria pico.

Uso de memoria en estado estable

El uso de memoria en estado estable comprende los siguientes componentes:

  1. Pesos del modelo: Copias de 32 bits de los parámetros del modelo, que requieren 4N bytes, donde N es el número de parámetros.
  2. Estados del optimizador: Para el optimizador Adam, esto requiere 8N bytes (2 estados por parámetro).
  3. Gradientes: Copias de 32 bits de los gradientes, que requieren 4N bytes.
  4. Datos de entrada: Asumiendo entradas de 64 bits, esto requiere 8BD bytes, donde B es el tamaño del lote y D es la dimensión de entrada.

El uso total de memoria en estado estable se puede aproximar por:

  • M_stable = 16N + 8BD bytes

Uso de memoria pico

El uso de memoria pico ocurre durante el paso hacia atrás cuando se almacenan activaciones para el cálculo de gradientes. Los principales contribuyentes al uso de memoria pico son:

  1. Normalización de capas: Requiere 4E bytes por normalización de capas, donde E = BSH (B: tamaño del lote, S: longitud de la secuencia, H: tamaño oculto).
  2. Bloque de atención:
    • Cálculo QKV: 2E bytes
    • Matriz de atención: 4BSS bytes (S: longitud de la secuencia)
    • Salida de atención: 2E bytes
  3. Bloque de red neuronal feed-forward:
    • Primera capa lineal: 2E bytes
    • Activación GELU: 8E bytes
    • Segunda capa lineal: 2E bytes
  4. Pérdida de entropía cruzada:
    • Logits: 6BSV bytes (V: tamaño del vocabulario)

La memoria total de activación se puede estimar como:

  • M_act = L * (14E + 4BSS) + 6BSV bytes

Donde L es el número de capas de Transformador.

Uso total de memoria pico

El uso de memoria pico durante el entrenamiento se puede aproximar combinando la memoria en estado estable y la memoria de activación:

  • M_peak = M_stable + M_act + 4BSV bytes

El término adicional de 4BSV cuenta para una asignación extra al comienzo del paso hacia atrás.

Al entender estos componentes, podemos optimizar el uso de memoria durante el entrenamiento y la inferencia, asegurando una asignación eficiente de recursos y un mejor rendimiento de los grandes modelos de lenguaje.

Leyes de escalado y consideraciones de eficiencia

Leyes de escalado para LLM

La investigación ha demostrado que el rendimiento de los LLM tiende a seguir ciertas leyes de escalado a medida que aumenta el número de parámetros. Kaplan et al. (2020) observaron que el rendimiento del modelo mejora como una ley de potencia del número de parámetros, el presupuesto de cómputo y el tamaño del conjunto de datos.

La relación entre el rendimiento del modelo y el número de parámetros se puede aproximar por:

Rendimiento ∝ N^α

Donde N es el número de parámetros y α es un exponente de escalado que suele ser de aproximadamente 0,07 para tareas de modelado de lenguaje.

Esto implica que para lograr una mejora del 10% en el rendimiento, necesitamos aumentar el número de parámetros en un factor de 10^(1/α) ≈ 3,7.

Técnicas de eficiencia

A medida que los LLM siguen creciendo, los investigadores y practicantes han desarrollado varias técnicas para mejorar la eficiencia:

a) Entrenamiento de precisión mixta: Utilizar números de punto flotante de 16 bits o incluso 8 bits para ciertas operaciones para reducir el uso de memoria y los requisitos computacionales.

b) Paralelismo de modelo: Distribuir el modelo en varias GPU o TPU para manejar modelos más grandes de los que caben en un solo dispositivo.

c) Puntos de control de gradientes: Intercambiar cálculo por memoria al volver a calcular ciertas activaciones durante el paso hacia atrás en lugar de almacenarlas.

d) Podado y cuantización: Eliminar pesos menos importantes o reducir su precisión después del entrenamiento para crear modelos más pequeños y eficientes.

e) Destilación: Entrenar modelos más pequeños para imitar el comportamiento de modelos más grandes, preservando gran parte del rendimiento con menos parámetros.

Ejemplo práctico y cálculos

GPT-3, uno de los modelos de lenguaje más grandes, tiene 175 mil millones de parámetros. Utiliza la parte del decodificador de la arquitectura Transformer. Para entender su escala, desglosemos el recuento de parámetros con valores hipotéticos:

  • d_model = 12288
  • d_ff = 4 * 12288 = 49152
  • Número de capas = 96

Para una capa de decodificador:

Parámetros totales = 8 * 12288^2 + 8 * 12288 * 49152 + 2 * 12288 ≈ 1.1 mil millones

Parámetros totales para 96 capas:
1.1 mil millones * 96 = 105.6 mil millones

Los parámetros restantes provienen de la incrustación y otros componentes.

Conclusión

Entender los parámetros y los requisitos de memoria de los grandes modelos de lenguaje es crucial para diseñar, entrenar y desplegar estas herramientas poderosas de manera efectiva. Al desglosar los componentes de la arquitectura Transformer y examinar ejemplos prácticos como GPT, obtenemos una visión más profunda de la complejidad y la escala de estos modelos.

Para profundizar en los últimos avances en los grandes modelos de lenguaje y sus aplicaciones, consulte estas guías completas:

He dedicado los últimos cinco años sumergiéndome en el fascinante mundo de Machine Learning y Deep Learning. Mi pasión y experiencia me han llevado a contribuir a más de 50 proyectos de ingeniería de software diversos, con un enfoque particular en AI/ML. Mi curiosidad en curso también me ha llevado hacia el Procesamiento de Lenguaje Natural, un campo que estoy ansioso por explorar más a fondo.