Paralelismo de datos (DP): cada GPU tiene una copia completa del modelo, procesa un mini-batch diferente y los gradientes se promedian entre GPUs. Simple y eficiente para modelos que caben en una GPU. Paralelismo de tensores (TP): las capas individuales se dividen entre GPUs, con cada GPU calculando parte de cada multiplicación de matrices. Necesario cuando los pesos de una sola capa no caben en una GPU. Paralelismo de pipeline (PP): diferentes capas se ejecutan en diferentes GPUs, con micro-batches fluyendo a través del pipeline.
Fully Sharded Data Parallel (FSDP, de PyTorch) y DeepSpeed ZeRO (de Microsoft) fragmentan los parámetros del modelo, gradientes y estados del optimizador entre GPUs. Cada GPU solo almacena una fracción del modelo, y los parámetros se reúnen bajo demanda para el cálculo, luego se liberan. Esto permite entrenar modelos mucho más grandes que la memoria de una sola GPU. DeepSpeed ZeRO tiene tres etapas: la Etapa 1 fragmenta los estados del optimizador, la Etapa 2 agrega los gradientes, la Etapa 3 agrega los parámetros.
El desafío fundamental del entrenamiento distribuido es la comunicación: las GPUs deben sincronizar gradientes (en paralelismo de datos) o intercambiar activaciones (en paralelismo de modelo/pipeline). Esta comunicación ocurre a través de NVLink (dentro de un nodo, 900 GB/s) o InfiniBand (entre nodos, 400 Gb/s). La eficiencia del entrenamiento cae cuando las GPUs pasan más tiempo esperando la comunicación que calculando. Las configuraciones óptimas minimizan la comunicación entre nodos manteniendo las operaciones estrechamente acopladas (como el paralelismo de tensores) dentro de un nodo y las operaciones poco acopladas (como el paralelismo de datos) entre nodos.