Optimización del entrenamiento variable con Dynamic Context Parallelism en Megatron Core

Este artículo presenta el enfoque de Dynamic Context Parallelism (Dynamic-CP), utilizado en el Megatron Core de NVIDIA para el post-entrenamiento de LLM o el pre-entrenamiento de DiT. Este método selecciona dinámicamente el tamaño de CP por micro-batch para manejar eficientemente secuencias de longitud variable, logrando hasta 1.48x de aceleración en conjuntos de datos reales.

En el entrenamiento de modelos a gran escala, una limitación frecuentemente pasada por alto es la variabilidad en la longitud de las secuencias de los conjuntos de datos. Tanto el entrenamiento de LLM como la generación de videos a gran escala presentan distribuciones de longitud de secuencia que son claramente desiguales. Un pequeño porcentaje de muestras extremadamente largas representa una parte desproporcionada de la carga computacional y el consumo de memoria.

Desafíos en el entrenamiento de LLM

En el entrenamiento de LLM, esto se traduce en una amplia variedad de longitudes de secuencias de texto en los lotes. En la generación de video, videos de alta resolución y varios segundos pueden abarcar decenas de miles de tokens. Esto provoca un uso desigual de FLOPs y memoria a nivel de muestra entre los grupos de datos paralelos, modalidades y micro-batches, dificultando la programación y utilización eficiente de los recursos.

Para gestionar entradas de longitud variable, los sistemas de entrenamiento comúnmente emplean empaquetamiento a nivel de muestra, que combina múltiples secuencias cortas en un solo micro-batch cuya longitud total de tokens está limitada por una longitud de secuencia objetivo. En la Figura 1, las secuencias se empaquetan a una longitud igual.

Figura 1. Comparación entre secuencias no empaquetadas y empaquetadas

Problemas de carga computacional

A pesar de que las tres muestras empaquetadas son de la misma longitud, sus cargas computacionales no son equivalentes, como se muestra en la Figura 2, debido a la naturaleza cuadrática de la atención por producto punto. Esta variación en la carga computacional entre muestras empaquetadas se conoce como desbalance computacional a nivel de datos paralelos. Esto provoca inactividad en la GPU, ya que algunos grupos de DP esperan a otros con cargas computacionales más altas para realizar la sincronización de gradientes.

La carga de trabajo de atención por muestra en secuencias empaquetadas varía, lo que lleva a inactividad en la GPU.
Figura 2. Desbalance de atención entre secuencias empaquetadas

En la Figura 3, el perfil de NVIDIA Nsight Systems captura un desequilibrio en el entrenamiento de VLM. Diferentes muestras de imágenes/video tienen longitud de secuencia variable, y se emplea el empaquetamiento. La captura muestra la sobrecarga de sincronización entre diferentes grupos de DP.

Este diagrama muestra la captura de la línea de tiempo del perfil de Nsight System, con sobrecarga de sincronización causada por un desequilibrio en longitudes de secuencia variables.
Figura 3. Sobrecarga de sincronización entre diferentes grupos de DP

Necesidad de un enfoque dinámico

Al utilizar el paralelismo de contexto, el tamaño del sharding de CP se determina por la secuencia más larga en el lote para evitar errores de falta de memoria en las GPUs. Como resultado, las secuencias más cortas que no requieren paralelismo de contexto se dividen. A pesar de que estas secuencias caben en una única GPU, se dividen debido a una secuencia más larga en el mismo lote, lo que genera una sobrecarga innecesaria de comunicación de CP.

Normalmente, el cálculo oculta la comunicación de CP. Sin embargo, cuando los tamaños de CP son grandes, especialmente cuando la comunicación abarca dominios de InfiniBand (IB), la sobrecarga de comunicación puede hacerse evidente cuando las secuencias empaquetadas son más cortas y la carga computacional es menor. Esto representa una ineficiencia computacional de CP.

Los siguientes ejemplos demuestran la necesidad de un enfoque dinámico para el paralelismo de contexto. En lugar de fijar estáticamente el tamaño de CP a la secuencia más larga en un micro-batch, este enfoque adapta el tamaño de CP utilizando la estrategia de empaquetamiento por micro-batch. Trabajos relevantes, como ByteScale y WLB-LLM, abordan problemas similares.

Diagrama que muestra la captura de la línea de tiempo del perfil de Nsight System con un gran CP para todas las secuencias. Para algunas muestras, el kernel relacionado con NCCL es más largo que el kernel de cómputo relacionado con cuDNN. La comunicación de CP no puede ser ocultada por el proceso de cómputo.
Figura 4. Insuficiente cómputo para ocultar la comunicación de CP bajo empaquetamiento

Ventajas de Dynamic-CP

Estas observaciones resaltan la necesidad de un enfoque dinámico al paralelismo de contexto. Este método permite seleccionar el tamaño de CP en función de la estrategia de empaquetamiento por micro-batch. Cambiar el tamaño de CP requiere re-particionar las porciones de secuencia y re-formar los grupos de comunicación de CP utilizados por las operaciones de atención. En comparación con otros esquemas de paralelismo dinámico, como la adaptación de tamaños tensor-paralelos o pipelínicos basados en la longitud de la secuencia, Dynamic-CP agrega una sobrecarga mínima.

El solucionador está diseñado para, dado un conjunto de secuencias de longitud variable, determinar cómo empaquetarlas y seleccionar el tamaño de CP para maximizar la eficiencia computacional sin exceder los límites de memoria de la GPU. Su función es calcular el empaquetamiento óptimo y el tamaño de CP mientras maximiza la eficiencia computacional y respeta estrictamente las limitaciones de memoria de la GPU.

El siguiente ejemplo muestra el beneficio de utilizar Dynamic-CP. Antes de aplicar el balanceo de carga, el desbalance lleva a burbujas de tubería entre diferentes micro-batches, lo que causa un desbalance de DP entre los rangos de DP. Después del balanceo, las burbujas entre micro-batches y rangos de DP se reducen.

Este diagrama muestra las ventajas del método Dynamic-CP. Anteriormente, las burbujas desbalanceadas ocurrían entre rangos de datos paralelos (DP) y micro-batches, y se amplificaban aún más a lo largo de la tubería. El método Dynamic-CP reduce estas burbujas de manera efectiva.
Figura 5. Ventajas del método Dynamic-CP

Modificaciones en el marco de Megatron Core para soportar Dynamic-CP

Esta sección introduce el proceso de integración de Dynamic CP en Megatron Core.

Una figura que muestra cómo se integra Dynamic-CP en Megatron-Core.
Figura 6. Integración de Dynamic-CP en Megatron Core

Construcción de múltiples grupos de contexto paralelo por rango

Con el paralelismo de contexto estándar, cada rango pertenece a un solo grupo (cp_group) con un cp_size fijo que se determina estáticamente durante la inicialización. Sin embargo, el paralelismo de contexto dinámico tiene un cp_size diferente entre iteraciones y micro-batches.

Para soportar esto, un solo rango debe participar en múltiples grupos de CP de diferentes tamaños. Se construyen múltiples grupos de CP durante la inicialización, con cp_size que varía desde 1 hasta dp × cp, restringido a potencias de dos.

Reprogramación dinámica y empaquetado de datos

A diferencia del preentrenamiento, que típicamente utiliza el formato Batch × Sequence × Head × Dim (BSHD), Dynamic-CP opera en un formato THD. En este formato, las secuencias de longitud variable se empaquetan bajo una restricción de longitud, colapsando la dimensión original BS en una dimensión de tokens T.

Como consecuencia, el número de micro-batches ya no es estático. En el formato BSHD, el número de micro-batches se calcula como num_micro_batches = global_batch_size/dp_size/micro_batch_size. Con el empaquetamiento THD, el número de secuencias originales contenidas en cada secuencia empaquetada no es fijo, lo que provoca que num_micro_batches varíe entre iteraciones.

Difusión entre etapas de tubería y extensión de packedSeqParams

Dado que num_micro_batches varía y solo el rango TP 0, así como las primeras y últimas etapas de PP manejan la programación en Megatron Core, el marco transmite num_micro_batches, max_seqlen, y cu_seqlens a todos los rangos de PP relevantes. Esto asegura una ejecución consistente a través de las etapas de la tubería bajo programación dinámica de micro-batch.

Cálculo de pérdida y cálculo de FLOPs

Dadas las secuencias de longitud variable y el formato THD, diferentes secuencias contribuyen a diferentes números de tokens válidos. Por ello, el cálculo de pérdida se realiza a nivel de token: loss = loss_over_valid_tokens / total_number_valid_tokens, evitando sesgos introducidos por tokens de relleno.

Modelado del programador de datos

La carga de trabajo del transformador escala cuadráticamente con la longitud de la secuencia S mathrm{O}(S^2). Al mismo tiempo, la memoria de activación crece linealmente mathcal{O}(S), lo que significa que incluso pequeñas variaciones pueden llevar a grandes desbalances en cómputo y memoria entre rangos de DP y micro-batches.

Colaboración del modelo de costos, solucionador y simulador

Un flujo de trabajo completo del programador consiste en tres componentes: 

  1. El modelo de costos estima el tiempo de ejecución para cada muestra en función de su longitud de secuencia, modelando la carga de trabajo por muestra a través de las operaciones del transformador.
  2. El solucionador utiliza la salida del modelo de costos como entrada y aplica un algoritmo heurístico para determinar una estrategia de empaquetamiento casi óptima para cada muestra.
  3. El simulador evalúa estos micro-batches bajo el programa de paralelismo de tuberías distribuidas, seleccionando el plan con el tiempo de ejecución mínimo.

Resultados de benchmarks

Con todas las mejoras introducidas, las burbujas de desbalance causadas por distribuciones de secuencias de longitud variable pueden reducirse sustancialmente.

En la Tabla 1, Dynamic CP se evalúa contra una línea base de empaquetamiento puro bajo la configuración: llama-13B, tamaño de lote global 2048, PP=8, CP=8, y recomputación completa. Se ejecutan 10 iteraciones, descartándose la primera como calentamiento, y el tiempo de iteración se promedia sobre las 9 restantes. Dynamic CP logra 1.48x y 1.25x de aceleración en los conjuntos de datos de GitHub y CommonCrawl, respectivamente.

Tamaño del Modelo Tipo de Conjunto de Datos Método TFLOPS/GPU
Llama 13B GitHub Solo Empaquetamiento 195.88
Llama 13B GitHub Dynamic CP 289.32
Llama 13B Commoncrawl Solo Empaquetamiento 139.17
Llama 13B Commoncrawl Dynamic CP 174.39

Tabla 1. Comparación de métodos Dynamic CP y empaquetamiento puro en diferentes conjuntos de datos.

Aprende más

Este artículo demostró que Dynamic CP con el backend de Megatron Core mejora el rendimiento de entrenamiento para secuencias de longitud variable en comparación con el método de CP fijo. Con empaquetamiento de secuencias, paralelismo 4D y núcleos optimizados para GPU, Dynamic CP garantiza una alta eficiencia de entrenamiento a través de escalas de modelos.

Comienza con:

  • Megatron Core en GitHub para comenzar a entrenar tu modelo con secuencias de longitud variable usando optimizaciones de Megatron Core.
  • El scheduler, que también está en GitHub.

Agradecemos a todos los colegas por sus contribuciones a este proyecto.

Ilustración de un hombre mayor con auriculares y chaqueta