entrenamiento distribuido de MoE en GPUs utilizando PyTorch + DeepSpeed

Simulación de entrenamiento distribuido de MoE en GPUs utilizando PyTorch + DeepSpeed.

Objetivo:

  • Entrenar un modelo Transformer con MoE en múltiples GPUs.
  • Distribuir expertos usando Paralelismo de Expertos (EP).
  • Optimizar memoria con DeepSpeed ZeRO + FP16.

 Instalación de Dependencias

Si aún no tienes DeepSpeed instalado, instálalo con:

pip install deepspeed torch transformers

Código Completo: MoE Distribuido en GPUs

import torch
import torch.nn as nn
import deepspeed
from deepspeed.moe.layer import MoE

# Modelo Transformer con MoE
class MoETransformer(nn.Module):
    def __init__(self, model_dim=512, num_experts=8, top_k=2):
        super().__init__()
        self.moe_layer = MoE(
            hidden_size=model_dim,
            expert=self.expert_fn,  # Definimos los expertos
            num_experts=num_experts,
            ep_size=4,  # 4 GPUs distribuyendo expertos
            k=top_k  # Solo activamos 2 expertos por batch
        )
        self.fc_out = nn.Linear(model_dim, model_dim)  # Capa final
        
    def expert_fn(self):
        """Cada experto es una simple capa lineal"""
        return nn.Sequential(nn.Linear(512, 512), nn.ReLU())

    def forward(self, x):
        x = self.moe_layer(x)  # Paso por MoE
        return self.fc_out(x)

# Configuración de DeepSpeed para entrenamiento distribuido
ds_config = {
    "train_batch_size": 64,
    "gradient_accumulation_steps": 2,
    "fp16": {"enabled": True},  # Entrenamiento en 16 bits
    "zero_optimization": {
        "stage": 2,  # Optimización ZeRO Stage 2
        "offload_optimizer": {"device": "cpu"},  # Reduce uso de memoria en GPU
    },
    "moe": {
        "enabled": True,
        "num_experts": 8,
        "top_k": 2,  # Solo activamos 2 expertos por batch
        "expert_parallel_group_size": 4,  # Expertos distribuidos en 4 GPUs
    }
}

#  Inicializar modelo y DeepSpeed
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = MoETransformer().to(device)

# DeepSpeed maneja la paralelización en GPUs
model, optimizer, _, _ = deepspeed.initialize(
    model=model, config=ds_config
)

#  Simulación de entrenamiento en múltiples GPUs
def train_step(model, optimizer, batch):
    optimizer.zero_grad()
    outputs = model(batch)
    loss = outputs.mean()  # Simulación de pérdida
    model.backward(loss)  # Backpropagation distribuido con DeepSpeed
    optimizer.step()
    return loss.item()

#  Entrenar el modelo con datos ficticios
num_steps = 10
for step in range(num_steps):
    batch = torch.randn(64, 512).to(device)  # Batch aleatorio
    loss = train_step(model, optimizer, batch)
    print(f"Paso {step+1}/{num_steps}, Pérdida: {loss:.4f}")

print("✅ Entrenamiento distribuido con MoE completado 🚀")

Explicación del Código

🔹 1. Definir el Modelo MoE

  • Usamos 8 expertos, pero solo 2 se activan por batch (top_k = 2).
  • Cada experto es una red neuronal simple (Linear + ReLU).
  • Los expertos se distribuyen en 4 GPUs.

🔹 2. Configuración de DeepSpeed

  • FP16 activado → Usa menos memoria en GPU.
  • Zero Optimization Stage 2 → Reduce la carga en GPUs dividiendo pesos y gradientes.
  • Distribución de expertos en GPUs → Los expertos se asignan dinámicamente para balancear la carga.

🔹 3. Entrenamiento Distribuido

  • DeepSpeed maneja automáticamente la sincronización de GPUs.
  • Se usa backpropagation distribuido para optimizar la memoria.
  • Se ejecutan 10 pasos de entrenamiento con datos simulados.

 ¿Cómo Escalar Esto a Clusters Más Grandes?

Si queremos entrenar en más GPUs, basta con modificar:

🔹 Aumentar «ep_size» en la configuración de DeepSpeed:

"moe": {
    "expert_parallel_group_size": 8  # Si tenemos 8 GPUs en el cluster
}

🔹 Ejecutar en múltiples nodos con deepspeed

deepspeed --num_nodes=2 --num_gpus=8 train_moe.py

Esto distribuirá los expertos y los datos entre 8 GPUs en 2 servidores diferentes.


 Conclusión: MoE Distribuido en Clusters de GPU

MoE es altamente escalable y permite entrenar modelos enormes sin un costo prohibitivo.
DeepSpeed facilita la paralelización, optimizando memoria y balanceando carga.
Ejecutar en clusters de GPUs es sencillo, gracias a deepspeed --num_nodes=X --num_gpus=Y.

Usado en:

  • GPT-4 MoE
  • DeepSeek (China)
  • Google Gemini

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *