Pipeline Parallelism
El paralelismo de tuberías distribuye las capas consecutivas de un modelo entre distintas GPU y procesa minilotes en flujo a través de ellas, para poder entrenar modelos que superan la capacidad de una sola GPU.
El paralelismo de canalización es una técnica de entrenamiento distribuido que divide una red neuronal por profundidad en grupos consecutivos de capas llamados etapas, coloca cada etapa en su propia GPU y pasa las activaciones de una etapa a la siguiente. Para mantener ocupadas todas las GPU, cada lote se divide en microlotes más pequeños que recorren las etapas como piezas en una cadena de montaje. También se denomina paralelismo de modelo entre capas. Los investigadores de Google dirigidos por Yanping Huang popularizaron el método de microlotes con GPipe en noviembre de 2018: entrenaron una AmoebaNet de 557 millones de parámetros hasta alcanzar un 84,4 % de precisión top-1 en ImageNet y un Transformer multilingüe de traducción de 6.000 millones de parámetros y 128 capas.
Microlotes y la burbuja de la canalización#
Con un lote cada vez, solo funciona una etapa mientras las demás esperan: la etapa 2 no puede empezar hasta que termine la etapa 1 y, durante la retropropagación, el orden se invierte. Los microlotes permiten que la etapa 1 empiece el segundo microlote en cuanto entrega el primero a la etapa 2. Los intervalos inactivos que quedan mientras la canalización se llena y se vacía se llaman burbuja. Si se imprime una planificación de pasada hacia delante al estilo de GPipe para 4 etapas y 6 microlotes, se observa esta forma:
stages, micro_batches = 4, 6
steps = micro_batches + stages - 1 # time steps until the last micro-batch leaves the last stage
for stage in range(stages):
row = ""
for t in range(steps):
m = t - stage # stage s starts micro-batch m once stage s-1 hands it over
row += f" F{m}" if 0 <= m < micro_batches else " ."
print(f"GPU {stage}:{row}")
# Every stage idles for stages - 1 of the steps, in the forward and again in the backward pass
bubble = (stages - 1) / steps
print(f"Idle fraction: {bubble:.0%}")La salida tiene forma de escalera: la GPU 0 ejecuta pasadas hacia delante de F0 a F5 durante los seis primeros de nueve pasos y después espera; la GPU 3 espera tres pasos antes de empezar F0, y la última línea muestra Idle fraction: 33%. La fracción de burbuja es (etapas − 1) / (microlotes + etapas − 1), así que 24 microlotes en las mismas 4 etapas la reducen al 11 %. Los gradientes de todos los microlotes se suman antes de un único paso del optimizador, con la misma operación que la acumulación de gradientes, por lo que la actualización equivale a entrenar con el lote completo. GPipe también descarta las activaciones dentro de cada etapa y las vuelve a calcular durante la pasada hacia atrás, una forma de punto de control de gradientes.
Planificaciones de canalización#
Las planificaciones posteriores reordenan el mismo trabajo para ahorrar memoria o reducir la burbuja:
- 1F1B: Introducido por el sistema PipeDream en 2018, alterna un microlote hacia delante y uno hacia atrás por etapa una vez que la canalización está llena. Así, cada etapa conserva activaciones como máximo para tantos microlotes como etapas haya, en lugar de conservarlas para todos.
- 1F1B intercalado: Asigna a cada GPU varias etapas más pequeñas y no adyacentes. El equipo Megatron-LM de NVIDIA informó de un aumento del rendimiento superior al 10 % con este método y entrenó un modelo de un billón de parámetros a 502 petaFLOP/s en 3.072 GPU, un 52 % del máximo.
- Burbuja cero: Divide la pasada hacia atrás en el gradiente de la entrada de la etapa, que necesita la etapa anterior, y el gradiente de los pesos, que puede ocupar intervalos inactivos más adelante. Supera el rendimiento de 1F1B hasta en un 23 % con un presupuesto de memoria similar.
PyTorch ofrece estas opciones como ScheduleGPipe, Schedule1F1B, ScheduleInterleaved1F1B, ScheduleInterleavedZeroBubble y ScheduleDualPipeV en su API de canalización, que también divide un modelo en etapas. DualPipe procede de DeepSeek-V3, cuyo equipo ejecutó 16 etapas de canalización y lo utilizó para solapar el cálculo con la comunicación y reducir la burbuja.
Dónde encaja el paralelismo de canalización#
Las etapas solo intercambian las activaciones de sus límites, una vez por microlote, así que el paralelismo de canalización tolera mejor los enlaces más lentos entre servidores que el paralelismo de tensores, que se comunica dentro de cada capa. Por eso, las ejecuciones de entrenamiento a gran escala los combinan. Meta entrenó Llama 3 405B con paralelismo de tensores de 8 vías dentro de cada servidor de 8 GPU, 16 etapas de canalización entre servidores y paralelismo de datos en 64 a 128 réplicas; los motores de inferencia, como vLLM, utilizan la misma división cuando un modelo de lenguaje grande (LLM) necesita más de un nodo. La etapa más lenta marca el ritmo de toda la canalización, y las primeras y últimas etapas de un modelo de lenguaje también contienen la tabla de embeddings y la capa de salida, por lo que Llama 3 asignó una capa Transformer menos a cada una.
Los enfoques relacionados dividen el trabajo de otras formas:
- Paralelismo de tensores: Divide las matrices de pesos dentro de cada capa, de modo que todas las GPU participan en todas las capas.
- Paralelismo de contexto: Divide una secuencia de entrada larga entre varias GPU.
- Aprendizaje dividido: También divide una red por profundidad, pero entre organizaciones, de modo que el propietario de los datos nunca envía datos sin procesar al servidor que ejecuta las capas posteriores.
El paralelismo de datos mantiene todas las capas en cada GPU y, en su lugar, divide el lote; es todo lo que necesita un modelo cuando cabe en un solo dispositivo. Así entrena Ultralytics YOLO26 en varias GPU: con device=[0, 1, 2, 3] y batch=64 en modo de entrenamiento, cada GPU ejecuta el modelo completo de detección de objetos con 16 imágenes, y PyTorch DistributedDataParallel promedia los gradientes entre GPU después de cada pasada hacia atrás.










