Saltar al contenido principal

Sistemas distribuidos y TPU

El éxito de AlphaGo no es solo una victoria algorítmica, sino también una victoria de ingeniería. Para entrenar una IA de Go que supere a los humanos en un tiempo razonable, se necesita un sistema distribuido cuidadosamente diseñado y el soporte de hardware especializado.

Este artículo analizará en profundidad la arquitectura del sistema detrás de AlphaGo, incluyendo el proceso de entrenamiento, la arquitectura de inferencia, MCTS paralelo y el papel crucial de las TPU.


Visión general de la arquitectura de entrenamiento

Arquitectura de entrenamiento del AlphaGo original

El entrenamiento del AlphaGo original (la versión que derrotó a Lee Sedol) se dividió en múltiples etapas, cada una usando diferentes configuraciones de recursos:

Arquitectura de entrenamiento de AlphaGo Zero

AlphaGo Zero simplificó enormemente el proceso de entrenamiento, usando un único ciclo de entrenamiento de extremo a extremo:

Las ventajas de esta arquitectura:

  1. Aprendizaje continuo: Self-play y Training ocurren simultáneamente, sin necesidad de esperar
  2. Eficiencia de recursos: Todos los recursos hacen trabajo útil
  3. Iteración rápida: La red se usa inmediatamente para generar nuevos datos después de actualizarse

Estaciones de auto-juego (Self-play Workers)

Asignación de tareas

Los Self-play Workers son responsables de realizar auto-juego con la red más fuerte actual, produciendo datos de entrenamiento.

ConfiguraciónAlphaGo Zero
Número de WorkersDecenas
Por Worker1-4 TPU
MCTS por partida1600 simulaciones
Producción diaria~100,000 partidas

Flujo de trabajo

El flujo de trabajo de cada Self-play Worker:

while True:
# 1. Descargar los pesos de red más recientes
network = download_latest_checkpoint()

# 2. Realizar múltiples auto-juegos
for game in range(batch_size):
positions = []
board = EmptyBoard()

while not board.is_terminal():
# Ejecutar MCTS
mcts = MCTS(network, board)
policy = mcts.search(num_simulations=1600)

# Elegir movimiento
action = sample(policy)

# Registrar
positions.append((board.state, policy))

# Jugar
board = board.play(action)

# 3. Obtener resultado del juego
result = board.get_result()

# 4. Subir datos
upload_to_replay_buffer(positions, result)

Balanceo de carga

Múltiples Workers necesitan balanceo de carga:

  • Sincronización de red: Todos los Workers usan la misma versión de la red
  • Balance de datos: Asegurar que los datos de diferentes Workers sean usados
  • Manejo de errores: El fallo de un Worker no afecta el entrenamiento general

Estaciones de entrenamiento (Training Workers)

Asignación de tareas

Los Training Workers son responsables de muestrear datos del Replay Buffer y entrenar la red neuronal.

ConfiguraciónAlphaGo Zero
Número de Workers1-4
Por Worker4 TPU
Batch Size2048 (512 por TPU)
Pasos de entrenamientoDecenas de miles por día

Entrenamiento distribuido

El entrenamiento a gran escala usa paralelismo de datos (Data Parallelism):

Cada TPU procesa diferentes mini-batches, calcula gradientes locales, luego los agrega para actualizar parámetros globales.

Actualización síncrona vs. asíncrona

Tipo de actualizaciónVentajasDesventajas
SíncronaEstable, reproducibleWorkers deben esperar al más lento
AsíncronaAlto throughputLos gradientes pueden estar obsoletos

AlphaGo Zero usa actualización síncrona para asegurar la estabilidad del entrenamiento.


El papel de las TPU

¿Qué es una TPU?

TPU (Tensor Processing Unit) es un acelerador diseñado por Google específicamente para deep learning:

CaracterísticaTPUGPUCPU
Objetivo de diseñoOperaciones matricialesParalelismo generalComputación general
PrecisiónOptimizado FP16/BF16FP32/FP16FP64/FP32
ConsumoRelativamente bajoMás altoEl más alto
LatenciaBajaMediaAlta

Arquitectura de las TPU

El núcleo de las TPU es la MXU (Matrix Multiply Unit):

Arquitectura TPU v2/v3:

ComponenteEspecificacion
MXU (Matrix Multiply Unit)128 x 128 = 16K MACs/ciclo
Vector UnitOperaciones vectoriales
HBM (High Bandwidth Memory)16-32 GB

La MXU puede ejecutar 16K operaciones de multiplicación-acumulación por ciclo, crucial para la multiplicación de matrices de redes neuronales.

¿Por qué AlphaGo necesita TPU?

El cuello de botella computacional de la IA de Go está en la inferencia de red neuronal:

OperaciónProporción
Forward pass de red neuronal~95%
Operaciones del árbol MCTS~4%
Otros~1%

Cada paso de MCTS requiere 1600 inferencias de red neuronal. El alto throughput de las TPU hace esto posible.

Evolución del uso de TPU

VersiónTPU de entrenamientoTPU de inferencia
AlphaGo Lee50 GPU48 TPU (v1)
AlphaGo Master4 TPU (v2)4 TPU (v2)
AlphaGo Zero4 TPU (v2)4 TPU (v2) (escalable)

El número de TPU usadas por AlphaGo Zero se redujo significativamente, gracias a arquitecturas más eficientes y versiones más nuevas de TPU.


MCTS paralelo y Virtual Loss

El desafío de la paralelización

La implementación estándar de MCTS es serial:

for i in range(num_simulations):
1. Selection: Seleccionar hacia abajo desde la raíz
2. Expansion: Expandir nodo hoja
3. Evaluation: Evaluación con red neuronal
4. Backup: Retropropagar actualizaciones

Pero la evaluación de red neuronal es una operación por lotes amigable para GPU/TPU. ¿Cómo hacer que múltiples simulaciones ocurran simultáneamente?

Paralelización de hojas (Leaf Parallelization)

El método de paralelización más simple: ejecutar múltiples simulaciones completas simultáneamente, luego fusionar resultados.

Problema: Cada simulación comienza desde la raíz, explorando repetidamente los mismos caminos.

Virtual Loss

DeepMind adoptó la técnica de Virtual Loss para implementar paralelismo de árbol (Tree Parallelization).

Concepto básico

Cuando un hilo está explorando un nodo, reduce temporalmente el valor de ese nodo, haciendo que otros hilos elijan otros caminos.

UCB normal: Q(s,a) + c * P(s,a) * sqrt(N(s)) / (1 + N(s,a))

Con virtual loss:
(Q(s,a) * N(s,a) - v * n_virtual) / (N(s,a) + n_virtual) + c * P(s,a) * sqrt(N(s)) / (1 + N(s,a) + n_virtual)

Donde:

  • n_virtual es el número de hilos actualmente explorando ese nodo
  • v es el valor del virtual loss (usualmente 1 o valor correspondiente a tasa de victoria)

Flujo de operación

Tiempo T1:
Thread 1 elige camino A → B → C
Nodo C recibe virtual loss -1

Tiempo T2:
Thread 2 elige camino A → B → D (porque C fue "penalizado")
Nodo D recibe virtual loss -1

Tiempo T3:
Thread 1 completa evaluación, actualiza valor real de C, remueve virtual loss
Thread 3 ahora puede elegir C (si el valor real es suficientemente bueno)

Efecto del virtual loss

AspectoEfecto
Diversidad de exploraciónFuerza exploración de diferentes caminos
Eficiencia de lotesPuede evaluar múltiples hojas simultáneamente
ConvergenciaEl virtual loss es finalmente cubierto por valores reales, no afecta convergencia

Evaluación de red neuronal por lotes

A través del virtual loss, se pueden recoger múltiples nodos hoja pendientes de evaluación para inferencia por lotes:

La eficiencia de inferencia por lotes de TPU es mucho mayor que inferencia uno por uno, haciendo posible el MCTS paralelo.


Arquitectura de inferencia

Configuración durante competencias

Arquitectura de inferencia de AlphaGo en competencias oficiales:

VersiónConfiguración de hardware
AlphaGo Fan176 GPU
AlphaGo Lee48 TPU + múltiples servidores
AlphaGo Master4 TPU
AlphaGo Zero4 TPU (escalable)

Flujo de inferencia distribuida

Flujo de inferencia durante competencias (ejemplo de AlphaGo Lee):

Gestión del tiempo de pensamiento

Estrategia de gestión de tiempo de AlphaGo:

PosiciónTiempo de pensamientoSimulaciones MCTS
Apertura (con joseki)Más corto~10,000
Medio juego (complejo)Más largo~100,000
Posición simpleMás corto~5,000
ByoyomiFijo~1,600

Más simulaciones MCTS generalmente significan mejor calidad de movimiento.


Comunicación y sincronización

Formato de datos

Formato de transmisión de datos de entrenamiento:

message TrainingExample {
// Estado del tablero (17 × 19 × 19)
repeated float board_planes = 1;

// Resultado de búsqueda MCTS (362)
repeated float mcts_policy = 2;

// Resultado del juego (1 = actual gana, -1 = actual pierde)
float game_result = 3;
}

Requisitos de ancho de banda

Flujo de datosTamañoFrecuencia
Muestra de entrenamiento~10 KB/muestraMiles de muestras/segundo
Pesos de red~200 MBVarias veces/hora
Mensajes de control< 1 KBContinuo

Requisito total de ancho de banda: ~100 Mbps (red interna suficiente)

Manejo de fallos

Manejo de fallos en sistemas distribuidos:

Tipo de falloManejo
Worker caeReiniciar, continuar usando último checkpoint
Desconexión de redAlmacenar en búfer, retransmitir tras reconexión
Fallo de TPUCambio automático a TPU de respaldo
Corrupción de datosDescartar tras verificación, regenerar

Análisis de costos

Estimación de costo de hardware

Estimación de costo de entrenamiento de AlphaGo Zero basada en precios de TPU de Google Cloud:

RecursoCantidadPrecio/horaPrecio total/día
TPU v2 Pod4~$32~$3,000
VM alta memoriaVarios~$5~$500
Almacenamiento10 TB~$0.02/GB~$200
Red-Incluido-

Aproximadamente 3,700/dıˊa,entrenamientocompleto(40dıˊas)aproximadamente3,700/día**, entrenamiento completo (40 días) aproximadamente **150,000.

Nota: Esta es una estimación de 2017, DeepMind como subsidiaria de Google puede tener descuentos internos.

Comparación con entrenamiento humano

AspectoAlphaGo ZeroJugador profesional humano
Alcanzar nivel profesional2 días10-15 años
Costo de entrenamiento~$7,500Millones (matrícula, gastos, costo de oportunidad)
Costo continuoElectricidadGastos de vida
ReplicabilidadPerfectaNo replicable

Por supuesto, esta comparación no es completamente justa: los humanos aprenden más que solo Go durante el proceso.

Costo de inferencia

Costo de inferencia en competencias oficiales:

ConfiguraciónCosto por partida
48 TPU (AlphaGo Lee)~$500
4 TPU (AlphaGo Zero)~$50
GPU única (KataGo)~$1

El costo de inferencia ha disminuido drásticamente con el progreso tecnológico.


Evolución tecnológica

De AlphaGo a AlphaZero

AspectoAlphaGo LeeAlphaGo ZeroAlphaZero
TPU entrenamiento50+ GPU → TPU4 TPU4 TPU
TPU inferencia48 TPU4 TPU4 TPU
MCTS/movimiento~100,000~1,600~800
Tiempo de entrenamientoMeses40 díasHoras-días

Mejora de eficiencia de aproximadamente 100 veces.

Impacto en la comunidad de código abierto

La arquitectura de AlphaGo inspiró múltiples proyectos de código abierto:

ProyectoCaracterísticas
Leela ZeroEntrenamiento distribuido comunitario, replica AlphaGo Zero
KataGoEntrenamiento eficiente en una sola GPU, supera AlphaGo Zero
ELF OpenGoCódigo abierto de Facebook, usa PyTorch
MinigoCódigo abierto de Google, usa TensorFlow

Estos proyectos permiten a investigadores ordinarios entrenar IA de Go potentes.


Correspondencia con animaciones

Conceptos centrales de este artículo y números de animación:

NúmeroConceptoCorrespondencia física/matemática
🎬 C9MCTS paraleloProblema de muchos cuerpos
🎬 E9Entrenamiento distribuidoComputación distribuida
🎬 C5Virtual lossPotencial de repulsión
🎬 D15Inferencia por lotesCálculo vectorizado

Lecturas adicionales


Referencias

  1. Silver, D., et al. (2017). "Mastering the game of Go without human knowledge." Nature, 550, 354-359.
  2. Jouppi, N., et al. (2017). "In-Datacenter Performance Analysis of a Tensor Processing Unit." ISCA 2017.
  3. Dean, J., et al. (2012). "Large Scale Distributed Deep Networks." NeurIPS 2012.
  4. Chaslot, G., et al. (2008). "Parallel Monte-Carlo Tree Search." CIG 2008.
  5. Segal, R. (2010). "On the Scalability of Parallel UCT." CIG 2010.