Phase 10 - Lesson 22

Inferencia Asíncrona y Hogwild!

This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.

La decodificación especulativa (Fase 10 · 15) paraleliza tokens dentro de una sola secuencia. Los frameworks multiagente paralelizan a lo largo de secuencias enteras, pero fuerzan una coordinación explícita (votación, división de subtareas). La inferencia Hogwild! (Rodionov et al., arXiv:2504.06261) hace algo diferente: ejecuta N instancias del mismo LLM en paralelo contra una caché key-value COMPARTIDA. Cada worker ve instantáneamente los tokens generados por todos los demás workers. Los modelos de razonamiento modernos — QwQ, DeepSeek-R1 — pueden autocoordinarse a través de esa caché compartida sin ningún ajuste fino (fine-tuning). El enfoque es experimental, pero abre un eje completamente nuevo de paralelismo de inferencia que es ortogonal a la decodificación especulativa. Esta lección implementa un simulador Hogwild! de dos workers en Python stdlib y explica por qué la colaboración de caché compartida surge de las capacidades de razonamiento existentes del modelo.

Tipo: Construcción Idiomas: Python (stdlib) Prerrequisitos: Fase 10 · 12 (optimización de inferencia), Fase 10 · 15 (decodificación especulativa) Tiempo: ~60 minutos

Objetivos de Aprendizaje

  • Describir las tres topologías comunes de LLM en paralelo (votación, división de subtareas, Hogwild!) y nombrar a qué problemas apunta cada una.
  • Definir la configuración central de Hogwild!: múltiples workers, una caché KV compartida y coordinación emergente mediante autoinstrucción (self-prompting).
  • Calcular la aceleración (speedup) en tiempo real (wall-time) de Hogwild! como una función del número de workers N, el paralelismo a nivel de tarea p y el costo de coordinación (coordination overhead) c.
  • Implementar un simulador Hogwild! de dos workers en un problema de juguete y observar la división de tareas emergente.

El Problema

Los LLM modernos resuelven problemas difíciles al producir largas cadenas de razonamiento — 5,000 tokens de lógica paso a paso es común, y decenas de miles de tokens ocurren en problemas matemáticos complejos. A una velocidad de decodificación de 35 tokens/s en un modelo de 70B, 50,000 tokens equivalen a 24 minutos. El modelo definitivamente no es interactivo.

La decodificación especulativa (Fase 10 · 15) proporciona una aceleración de 3 a 5 veces al paralelizar la generación dentro de una sola secuencia. Más allá de eso, la dependencia secuencial de la decodificación autorregresiva es el límite intransponible. Cada nuevo token depende de todos los tokens anteriores.

La pregunta obvia es: ¿podemos paralelizar a lo largo de múltiples secuencias? ¿Ejecutar varias copias del mismo modelo en el mismo problema, dejar que cooperen y hacer que se dividan el trabajo?

Trabajos anteriores: ensembles de votación (ejecutar N modelos y elegir la respuesta mayoritaria), árbol de pensamientos (tree-of-thought, ramificando caminos de razonamiento y recombinándolos) y frameworks multiagente (asignar a cada agente una subtarea y usar un coordinador). Todos estos métodos ayudan en dominios de tareas específicos. Sin embargo, todos ellos también introducen mecanismos explícitos de coordinación — reglas de votación, lógica de ramificación y poda, y protocolos de mensajería de agente a agente.

La Inferencia Hogwild! adopta un enfoque diferente. N workers comparten una sola caché KV. Cada worker ve los tokens generados por todos los demás workers de inmediato, como si fueran su propio contexto. Los workers — sin ningún entrenamiento ni ajuste fino — descubren cómo dividir el trabajo. Los modelos de razonamiento modernos (QwQ, DeepSeek-R1, modo de razonamiento de la familia Claude) pueden leer la caché compartida y decir cosas como: "Veo que el worker 2 ya manejó el caso base, así que trabajaré en el paso inductivo".

La aceleración depende de la carga de trabajo y es experimental a partir de abril de 2026. Pero vale la pena conocer la idea porque abre un nuevo eje de paralelismo de inferencia.

El Concepto

La configuración

Inicialice N procesos workers, todos ejecutando el mismo LLM. En lugar de cachés KV por worker, mantenga UNA sola caché compartida. Cuando el worker i genera el token t_j, el token se escribe en la caché compartida en la siguiente posición. Cuando el worker k da su siguiente paso, lee el estado actual de la caché (que incluye todo lo que los N workers han generado hasta el momento).

En el momento del paso de generación, los workers compiten por escribir tokens. No hay un índice de posición por worker; la caché es una sola secuencia en crecimiento. El orden está determinado por el tiempo de llegada de la escritura.

Por qué surge la coordinación

Los workers comparten un prompt. Normalmente, algo como: "Eres una de N instancias que trabajan juntas en este problema. Cada instancia lee la memoria compartida y puede ver lo que han escrito las otras instancias. Evita el trabajo redundante". El prompt más la caché compartida es suficiente. Los modelos de razonamiento leen la caché, notan qué partes del problema ya se han intentado y (a menudo, pero no siempre) se desvían hacia las partes inexploradas.

El artículo de Hogwild! (Rodionov et al., 2025) reporta observaciones como:

  • Los workers formulan planes y los comunican a otros workers a través de la caché.
  • Los workers notan errores en el razonamiento de otros workers y los señalan.
  • Los workers se adaptan cuando un plan falla y proponen alternativas.
  • Cuando se les pide que verifiquen redundancias, los workers las detectan y cambian de enfoque.

Nada de esto requiere ajuste fino. El comportamiento emergente proviene de las capacidades de razonamiento que el modelo ya posee.

La nomenclatura

El nombre del artículo hace referencia a Hogwild! SGD (Recht et al., 2011), un optimizador de actualización asíncrona. La analogía: los workers asíncronos de SGD escriben en un vector de parámetros compartido; los workers de la Inferencia Hogwild! escriben en una caché KV compartida. Ambos dependen de la convergencia empírica en lugar de garantías de sincronización.

RoPE hace que esto sea viable

Los Rotary Position Embeddings (RoPE, Su et al. 2021) codifican información de posición mediante rotación en los vectores Q y K. Dado que las posiciones son rotaciones y no offsets estáticos incorporados, la posición de un token puede cambiar sin necesidad de recalcular la entrada correspondiente en la caché KV. Cuando el worker i escribe en la caché compartida en la posición p, otros workers que leen esa posición pueden usar la entrada almacenada en caché directamente, sin necesidad de una nueva rotación.

En un modelo de posiciones aprendidas o posiciones absolutas, Hogwild! requeriría la invalidación de la caché en cada escritura concurrente. RoPE permite que la caché permanezca estable.

Matemática del tiempo real (Wall-time)

Sea T_serial el tiempo que tarda un solo worker en resolver el problema solo. Sea p la fracción paralelizable a nivel de tarea. Sea c el costo de coordinación por paso (leer la caché extendida, decidir qué escribir).

Tiempo con un solo worker: T_serial. Tiempo con Hogwild! de N workers, si la coordinación fuera gratuita: T_serial * ((1 - p) + p / N). La clásica Ley de Amdahl. Con costo de coordinación: T_serial * ((1 - p) + p / N) + c * steps_per_worker.

Para que un worker sea productivo, c debe ser pequeño en relación con el tiempo de decodificación por paso. En los modelos de razonamiento que generan más de 5,000 tokens, los workers pueden permitirse cientos de tokens de costo de coordinación y aún así salir ganando. En tareas de chat cortas, la coordinación domina y Hogwild! es peor que el procesamiento secuencial.

Ejemplo concreto

Problema de razonamiento: 10,000 tokens de cadena de pensamiento (chain-of-thought). Suponga que el problema tiene p = 0.7 de contenido paralelizable (diferentes estrategias de demostración, diferentes análisis de casos) y c = 200 tokens de costo de coordinación por worker. Con N = 4 workers:

  • Tiempo secuencial: 10,000 pasos de decodificación.
  • Tiempo de Hogwild!: 10000 * (0.3 + 0.7 / 4) + 200 * 4 = 10000 * 0.475 + 800 = 5550 pasos de decodificación.
  • Aceleración: 10000 / 5550 = 1.8x.

Eso es modesto. Pero en problemas de razonamiento más largos (50,000 tokens), el costo de coordinación se amortiza y la aceleración se acerca a 2.5-3x. Hogwild! es el equivalente en inferencia al paralelismo a nivel de hilos en un lenguaje que permite escribir código multi-hilo de forma natural.

Cuándo recurrir a Hogwild!

  • Problemas de razonamiento largos (miles de tokens) donde la tarea se puede paralelizar en subobjetivos independientes.
  • Modelos de razonamiento que han sido entrenados para pensar paso a paso. Los modelos sin razonamiento no se autocoordinan bien.
  • Despliegues en un solo nodo (single-node) con suficiente VRAM para contener la caché compartida más N procesos workers. La caché se comparte, pero cada worker tiene su propia memoria de activación.

Cuándo no hacerlo

  • Chat interactivo corto. El costo de coordinación domina.
  • Tareas que no se paralelizan (una sola demostración lineal, una sola compilación). N=1 es el máximo.
  • Modelos sin razonamiento. No surge coordinación.
  • Despliegues multi-nodo (multi-node). La caché compartida necesita una sincronización muy rápida entre los workers. Intra-nodo está bien; cross-nodo es un desastre de latencia.

El estado experimental

A partir de abril de 2026, Hogwild! es un método de investigación con una implementación de código abierto en PyTorch. La adopción en producción aún no ha ocurrido. Tres impedimentos:

  1. El manejo de la caché KV compartida entre procesos concurrentes implica una ingeniería compleja.
  2. La coordinación emergente depende de la tarea; los benchmarks aún se están desarrollando.
  3. Las aceleraciones son modestas en comparación con lo que la decodificación especulativa ya ofrece, y aunque ambas técnicas se pueden combinar, la ingeniería conjunta agrega otra capa de complejidad.

Vale la pena conocerlo. Vale la pena experimentar. Pero aún no vale la pena apostar un producto en ello.

Constrúyelo

El archivo code/main.py implementa un simulador simple de Hogwild!:

  • Dos procesos workers, cada uno representando un "LLM" determinista que produce una de varias categorías de tokens (token de trabajo, token de observación, token de coordinación) con probabilidades conocidas.
  • Una caché compartida (solo una lista de tokens) que ambos workers leen y escriben.
  • Una lógica de coordinación simple: cuando un worker detecta que el otro ya produjo suficientes tokens de trabajo en una categoría, elige una categoría diferente.

El simulador se ejecuta durante un límite fijo de pasos e informa:

  • Total de tokens de trabajo producidos.
  • Tiempo real total (número de pasos de los workers).
  • Aceleración efectiva sobre un solo worker.
  • Un rastreo de qué worker escribió cada token.

Paso 1: la caché compartida

Una lista en la que ambos workers agregan elementos. En una implementación real, esto utilizaría un bloqueo simple (como el threading.Lock de Python); lo simulamos con un contador.

Paso 2: el bucle del worker

Cada worker, en cada paso:

  • Lee la caché compartida actual.
  • Decide qué categoría de token escribir basándose en lo que ya está allí.
  • Escribe un token.

Paso 3: la heurística de coordinación

Si la categoría X ya tiene K tokens en la caché y la categoría prevista del worker es X, el worker cambia a la categoría Y. Esta es una simulación simple para el comportamiento de un modelo de razonamiento de "notar que esto ya está cubierto y hacer otra cosa".

Paso 4: medición de la aceleración (speedup)

Ejecute el simulador con N=1 worker y con N=2 workers, usando el mismo límite total de pasos. Cuente los tokens de trabajo producidos. N=2 debería producir aproximadamente de 1.5 a 1.8 veces más tokens de trabajo debido a la división de tareas impulsada por la coordinación.

Paso 5: probando los límites de la coordinación

Reduzca la sensibilidad de la heurística de coordinación. Ejecute nuevamente. Observe que sin una buena coordinación, N=2 produce de forma redundante los mismos tokens y la aceleración cae por debajo de 1. Esto coincide con la observación del artículo: el truco solo funciona si los workers tienen la capacidad de razonamiento para autocoordinarse.

Úsalo

La integración de Hogwild! en producción a partir de abril de 2026 está en nivel de investigación. La implementación de referencia de Yandex/HSE/IST se basa en PyTorch y apunta a configuraciones de múltiples procesos en un solo nodo (single-node) en modelos DeepSeek-R1 y QwQ.

Ruta de adopción pragmática:

  1. Analice el perfil de su carga de trabajo de razonamiento. Mida la fracción de tokens que son exploratorios (múltiples estrategias, análisis de casos, búsqueda) frente a los lineales.
  2. Si la exploración domina, realice un experimento de Hogwild! con dos workers. Mida la mejora del tiempo real (wall-time).
  3. Si la mejora es inferior a 1.3x, se encuentra en el régimen dominado por la coordinación. Revierta al uso de un solo worker.
  4. Si la mejora es superior a 1.5x, aumente a N=4 y mida de nuevo. Los rendimientos decrecientes suelen manifestarse alrededor de N=4-8.

Combine con decodificación especulativa: cada worker de Hogwild! puede usar de forma independiente la decodificación especulativa. Las dos aceleraciones se multiplican (aproximadamente), llevando una decodificación especulativa de 3x y un Hogwild! de 1.8x a un 5.4x efectivo en comparación con la decodificación secuencial con un solo worker.

Envíalo a Producción

Esta lección produce el archivo outputs/skill-parallel-inference-router.md. Dado un perfil de carga de trabajo de razonamiento (límite de tokens, perfil de paralelismo de tareas, familia de modelos, objetivo de despliegue), realiza el enrutamiento entre las estrategias de votación, árbol de pensamientos (tree-of-thought), multiagente, Hogwild! y decodificación especulativa.

Ejercicios

  1. Ejecute code/main.py con las configuraciones por defecto. Confirme que la configuración de Hogwild! con N=2 produce más tokens de trabajo que la línea base con N=1 en el mismo tiempo real.

  2. Reduzca la fuerza de la heurística de coordinación (establezca coordination_weight=0.1). Ejecute de nuevo. Muestre que la aceleración se desploma. Explique por qué: los workers duplican esfuerzos cuando no pueden coordinarse.

  3. Calcule la aceleración esperada de Hogwild! para una tarea de razonamiento de 50,000 tokens con p=0.8, c=500 y N=4 workers. Haga lo mismo para una tarea de chat de 1,000 tokens con p=0.3, c=200 y N=4. ¿Por qué uno es un caso de éxito y el otro una pérdida?

  4. Lea la Sección 4 (evaluación preliminar) del artículo de Hogwild!. Identifique los dos modos de falla que reportan los autores. Describa cómo un mejor prompt de coordinación podría mitigar cada uno de ellos.

  5. Combine Hogwild! con decodificación especulativa en el modelo simple: cada worker utiliza internamente una decodificación especulativa de 2 tokens. Informe la aceleración multiplicativa. ¿Qué problema de control de datos (bookkeeping) surge cuando dos workers quieren extender el mismo prefijo de la caché compartida?

Términos Clave

Término Lo que la gente dice Lo que realmente significa
Hogwild! "Workers paralelos, caché compartida" N instancias del mismo LLM ejecutándose de manera concurrente con una caché KV compartida; coordinación emergente mediante autoinstrucción (self-prompting)
Caché KV compartida "El medio de coordinación" Un único búfer KV en crecimiento que todos los workers leen y escriben; permite la visibilidad instantánea de los tokens entre los workers
Coordinación emergente "Sin necesidad de entrenamiento" Los LLM con capacidad de razonamiento pueden leer la caché compartida y dividir el trabajo sin ningún ajuste fino o protocolo explícito
Costo de coordinación (c) "Tokens dedicados a orientarse" El costo por worker de leer la caché extendida y decidir qué hacer; debe mantenerse pequeño en relación con el tiempo total de decodificación
Fracción paralelizable (p) "Lo que puede ejecutarse en paralelo" Paralelismo a nivel de tarea: la fracción del trabajo total que no es intrínsecamente secuencial
RoPE habilita Hogwild! "Las posiciones rotativas son invariantes por desplazamiento" Dado que las posiciones son rotaciones, escribir en una caché compartida no requiere recalcular los tokens anteriores
Ensemble de votación "Ejecuta N, elige la mayoría" La topología de inferencia en paralelo más simple; útil para clasificación, menos para razonamiento largo
Árbol de pensamientos "Ramificar y podar" Estrategia de razonamiento que explora múltiples ramas y las poda; lógica de coordinación explícita
Framework multiagente "Asignar subtareas" Cada agente recibe un rol; un coordinador orquesta el proceso; alto costo de protocolo

Lecturas Adicionales

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).