Decodificación especulativa y salida temprana: Aceleración de la decodificación autoregresiva
El proceso de redactar y luego verificar, junto con las salidas basadas en confianza, reduce la latencia de decodificación cuando los presupuestos de aceptación y precisión lo permiten.
Por qué la optimización de decodificación se encuentra en el camino crítico
La inferencia de LLMs cuenta con una fase de prellenado que se paraleliza a lo largo del prompt y una fase de decodificación que emite tokens de forma secuencial. El prellenado puede saturar las GPUs; la decodificación, en cambio, suele no hacerlo, ya que cada nuevo token depende del anterior. Esa dependencia secuencial es la razón por la cual la latencia interactiva sigue siendo elevada incluso cuando los FLOPs parecen abundantes en teoría.
Prefill phase:
Input: [token_1, token_2, ..., token_512] → all 512 tokens processed in parallel
Matrix shape: [batch, 512, 4096]
GPU utilization: high — large matrix, full Tensor Core throughput
Decode phase (one step):
Input: [token_513] → one token processed
Matrix shape: [batch, 1, 4096]
GPU utilization: low - tiny matrix, most CUDA cores idle
Estructura de atención durante la decodificación
En cada paso de decodificación, el modelo genera consultas contra un caché de claves/valores que va creciendo. El trabajo por paso aumenta con la longitud del contexto, mientras que las oportunidades de agrupamiento están limitadas por los requisitos de latencia para las conversaciones.
One attention head, decode step:
Query Q: [8, 1, 128] → 8 × 128 = 1,024 elements
Keys K: [8, 2048, 128] → 8 × 2048 × 128 = 2M elements
Values V: [8, 2048, 128] → same
Matrix multiply (QKᵀ) per head:
Shape: [8, 1, 128] × [8, 128, 2048] → [8, 1, 2048]
FLOPs: 8 × 1 × 128 × 2048 ≈ 2.1M FLOPs per head
For 32 heads: ≈ 67M FLOPs per layer
For 32 layers: ≈ 2.1B FLOPs total per decode step
A100 peak at BF16: ~312 TFLOPS = 312 × 10¹² FLOPs/sec
Time to execute 2.1B FLOPs at 100% utilization:
2.1 × 10⁹ / 312 × 10¹² ≈ 0.0067 ms
Actual observed decode latency per step: ~10–30ms
Effective compute utilization: < 0.1%
Decodificación especulativa: boceto primero, verificación después
Un modelo de boceto más pequeño propone varios tokens futuros; el modelo objetivo los verifica en una pasada forward paralela, aceptando un prefijo y realizando un nuevo muestreo en la primera rechazo. Los bocetos aceptados multiplican los tokens efectivos por cada paso costoso del modelo objetivo.
Without speculative decoding:
Generate 5 tokens: 5 × 30ms = 150ms
With speculative decoding (K=4):
Draft 4 tokens: 4 × 1.5ms = 6ms
1 target verification pass: ~35ms (slightly longer than decode,
processes K+1=5 positions)
Expected accepted tokens per round:
(1 - 0.80^5) / (1 - 0.80) ≈ 3.36 tokens
Time per round: 6ms + 35ms = 41ms
Time per token: 41ms / 3.36 ≈ 12.2ms
Speedup: 30ms → 12.2ms ≈ 2.5×
La aceleración depende de la coincidencia entre el boceto y el modelo objetivo. El texto sencillo y de baja entropía acepta bocetos largos; los tokens inesperados acortan la tasa de aceptación.
import torch
import torch.nn.functional as F
def speculative_decode(target_model, draft_model, input_ids,
max_new_tokens, K=4, temperature=1.0):
"""
Conceptual speculative decoding loop.
Real implementations handle KV cache management across both models.
"""
generated = input_ids.clone()
while generated.shape[1] - input_ids.shape[1] < max_new_tokens:
# --- Draft phase ---
draft_tokens = []
draft_probs = []
draft_input = generated.clone()
for _ in range(K):
with torch.no_grad():
draft_logits = draft_model(draft_input).logits[:, -1, :]
q = F.softmax(draft_logits / temperature, dim=-1)
token = torch.multinomial(q, num_samples=1)
draft_tokens.append(token)
draft_probs.append(q)
draft_input = torch.cat([draft_input, token], dim=1)
# --- Verify phase: one target forward pass over all K+1 positions ---
verify_input = torch.cat([generated] + draft_tokens, dim=1)
with torch.no_grad():
target_logits = target_model(verify_input).logits
# target_logits[:, -K-1:, :] covers all K draft positions + bonus
# --- Accept/reject ---
accepted = 0
for i in range(K):
p = F.softmax(target_logits[:, -(K+1)+i, :] / temperature, dim=-1)
q = draft_probs[i]
token = draft_tokens[i]
# Acceptance probability
accept_prob = torch.min(
torch.ones_like(p.gather(1, token)),
p.gather(1, token) / (q.gather(1, token) + 1e-9)
)
if torch.rand(1) < accept_prob:
generated = torch.cat([generated, token], dim=1)
accepted += 1
else:
# Sample corrected token and stop this round
corrected_dist = F.relu(p - q)
corrected_dist = corrected_dist / corrected_dist.sum(dim=-1, keepdim=True)
corrected_token = torch.multinomial(corrected_dist, num_samples=1)
generated = torch.cat([generated, corrected_token], dim=1)
break
else:
# All K accepted - take bonus token
bonus_logits = target_logits[:, -1, :]
p_bonus = F.softmax(bonus_logits / temperature, dim=-1)
bonus_token = torch.multinomial(p_bonus, num_samples=1)
generated = torch.cat([generated, bonus_token], dim=1)
return generated
Elija bocetos de la misma familia cuando sea posible, hermanos más pequeños destilados o cuantizados, y mida la tasa de aceptación en su propio tráfico, no en ejemplos de blogs públicos.
Cuando los bocetos divergen
Si la distribución del boceto varía, la tasa de aceptación disminuye drásticamente y usted paga el costo del boceto sin obtener mucho beneficio. Monitoree continuamente la tasa de aceptación; recurre al decodificado simple cuando esta disminuya.
Salida anticipada: detenga las capas profundas cuando tenga confianza
Algunas arquitecturas permiten salir en capas intermedias cuando la confianza es alta, lo que ahorra recursos de cómputo en tokens “fáciles”.
Layer distribution of exits:Exit at layers 1–8 (very easy tokens like punctuation, articles): 15%
Exit at layers 9–16 (medium tokens, common continuations): 35%
Exit at layers 17–24 (harder tokens, named entities, numbers): 30%
Exit at layers 25–32 (full computation required): 20%Weighted average layers executed:
0.15 × 6 + 0.35 × 12 + 0.30 × 20 + 0.20 × 32
= 0.90 + 4.20 + 6.00 + 6.40
= 17.5 layers averageSpeedup vs always running 32 layers:
32 / 17.5 ≈ 1.83×
Mida cuidadosamente el impacto en la precisión: la salida temprana sacrifica calidad por velocidad y es sensible a la calibración.
Decodificación especulativa vs salida temprana
La decodificación especulativa modifica el ciclo de propuesta de tokens con un segundo modelo; la salida temprana cambia la profundidad dentro de un mismo modelo. Abordan los cuellos de botella relacionados de manera diferente y a veces pueden combinarse con cuantización, agrupamiento continuo y paginación de caché KV.
Combined stack example:
Target: 7B model, BF16, FlashAttention, PagedAttention
→ Model: ~14 GB, memory-efficient attention, paged KV cache
Draft: 70M model, INT4, FlashAttention
→ Model: ~35 MB, near-zero memory overhead
Speculative decode:
→ with K=4, α=0.80
→ ~2.5× token generation speedup on long outputs
Full stack speedup vs FP32 no-optimization baseline:
- Quantization: 2–2.3× throughput
- FlashAttention: 20–40% attention latency reduction
- Speculative decoding: 2–2.5× decode speedup (on eligible requests)
Combined: 5–8× improvement in end-to-end tokens/second
Cuándo cada uno es útil
La decodificación especulativa es útil cuando el grado de acuerdo preliminar es alto y los pasos objetivo dominan la latencia. Falla cuando los borradores rara vez coinciden o el costo de generación preliminar supera las ganancias. La salida temprana es útil cuando muchos tokens son fáciles y el presupuesto de precisión lo permite; falla con tokens difíciles o cuando la confianza está mal calibrada.
Perspectiva de producción
Envío con métricas: tasa de aceptación, longitud promedio aceptada, deltas de evaluación de calidad, utilización de GPU y latencia p95. Optimizaciones mediante flags de características. Mantén un interruptor de emergencia para la decodificación estándar. Recuerda que el cuello de botella restante podría ser el ancho de banda de la memoria, la red o el renderizado del cliente, no solo los FLOPs; por lo tanto, haz un perfilamiento antes de aplicar cada truco teórico.
Cierre
La carga previa y la decodificación someten al hardware de manera diferente. La decodificación especulativa y la salida anticipada son herramientas prácticas al compararlas con tus curvas de aceptación y precisión. Trátalas como características de producción con paneles de control, no como pruebas puntuales, y demostrarán su valor en tráfico real.
Cenario de referencia para la intuición
Imagínese un modelo objetivo de 7 mil millones que realice funciones de chat con respuestas de 50 a 150 tokens. El prellenado del prompt del sistema, que contiene 2 mil tokens, es intensivo pero ocurre con poca frecuencia por turno; los pasos de decodificación son los que causan la demora percibida por el usuario. Reducir la cantidad de pasos de decodificación mediante aceptaciones especulativas, o disminuir el trabajo por paso mediante salida anticipada, mejora la percepción de velocidad por parte del usuario.
Lista de verificación operativa
- Valor base p95 y calidad.
- Añadir un modelo preliminar en la misma ubicación para evitar el tiempo de ida y vuelta de la red.
- Registrar histogramas de aceptación.
- Evaluar la calidad mediante pruebas A/B con conjuntos de datos factuales.
- Controlar el equilibrio entre CPU y GPU cuando se ejecutan los modelos preliminares en dispositivos diferentes.
- Volver a revisar después de cada cambio en el tokenizador o en el proceso de ajuste fino.
Errores comunes
Utilizar un borrador aleatoriamente no relacionado; ignorar los efectos de la temperatura en la aceptación; declarar victoria desde las plataformas de procesamiento sin verificar los estándares de calidad; combinar la salida anticipada con una cuantización agresiva hasta que aumenten las alucinaciones. Cada uno de estos problemas es medible, primero mediante instrumentos especializados.
Orientación ampliada para los equipos de plataforma
Centralizar la optimización de la inferencia en la capa de servicio para que los equipos de aplicaciones no tengan que inventar por separado cómo seleccionar los borradores. Exponer encabezados o atributos de seguimiento que indiquen si se aplicó una decodificación especulativa o una salida anticipada. Facturar los tokens de contracargo con etiquetas de optimización para que el departamento financiero pueda ver los beneficios. Practicar procedimientos de reversión. Documentar que la decodificación especulativa no elimina la necesidad de una buena recuperación de información o de prompts adecuados; solo hace que la generación de los siguientes tokens sea más económica cuando el modelo ya sabe qué quiere decir.
Más detalles sobre la combinación de técnicas
Combina el procesamiento por lotes continuo con la estrategia especulativa con cuidado: las longitudes de los borradores interactúan con las suposiciones del planificador. Úsalo junto con políticas de eliminación del caché KV para que las conversaciones largas no generen sobrecarga. Combínalo también con el caché de prompts en la fase de prellenado para evitar tener que “corregir la decodificación” mientras se sigue desperdiciando recursos en el prellenado. Un diseño integral de servicio es mejor que aplicar una solución aislada en un proceso crítico.
Preguntas frecuentes de los profesionales
¿Cambia la estrategia especulativa las respuestas? Debería coincidir con la distribución deseada si se implementa correctamente; verifica esto mediante pruebas emparejadas. ¿Cambia el cierre anticipado las respuestas? Sí, por diseño, ya que omite ciertas capas; ten en cuenta esa diferencia. ¿Podemos generar borradores en la CPU? A veces; mide los resultados. ¿Es esto relevante para modelos pequeños en el dispositivo? Con frecuencia, menos que para objetivos de gran tamaño. Orden de prioridad: primero corrige el procesamiento por lotes y el caché, luego la estrategia especulativa, y finalmente el cierre anticipado si la arquitectura lo permite.
Caso de referencia para tener una idea
Imagínese un modelo objetivo de 7 mil millones que realice funciones de chat con respuestas de 50 a 150 tokens. El prellenado del prompt del sistema, que contiene 2 mil tokens, es intensivo pero ocurre con poca frecuencia por turno; los pasos de decodificación son los que causan la demora percibida por el usuario. Reducir la cantidad de pasos de decodificación mediante aceptaciones especulativas, o disminuir el trabajo por paso mediante salida anticipada, mejora la percepción de velocidad por parte del usuario.
Lista de verificación operativa
- Valor base p95 y calidad.
- Añadir un modelo preliminar en la misma ubicación para evitar el tiempo de ida y vuelta de la red.
- Registrar histogramas de aceptación.
- Evaluar la calidad mediante pruebas A/B con conjuntos de datos factuales.
- Controlar el equilibrio entre CPU y GPU cuando se ejecutan los modelos preliminares en dispositivos diferentes.
- Volver a revisar después de cada cambio en el tokenizador o en el proceso de ajuste fino.
Errores comunes
Utilizar un borrador aleatoriamente no relacionado; ignorar los efectos de la temperatura en la aceptación; declarar victoria desde las plataformas de procesamiento sin verificar los estándares de calidad; combinar la salida anticipada con una cuantización agresiva hasta que aumenten las alucinaciones. Cada uno de estos problemas es medible, primero mediante instrumentos especializados.
Orientación ampliada para los equipos de plataforma
Centralizar la optimización de la inferencia en la capa de servicio para que los equipos de aplicaciones no tengan que inventar por separado cómo seleccionar los borradores. Exponer encabezados o atributos de seguimiento que indiquen si se aplicó una decodificación especulativa o una salida anticipada. Facturar los tokens de contracargo con etiquetas de optimización para que el departamento financiero pueda ver los beneficios. Practicar procedimientos de reversión. Documentar que la decodificación especulativa no elimina la necesidad de una buena recuperación de información o de prompts adecuados; solo hace que la generación de los siguientes tokens sea más económica cuando el modelo ya sabe qué quiere decir.
Más detalles sobre la combinación de técnicas
Combina el procesamiento por lotes continuo con la estrategia especulativa con cuidado: las longitudes de los borradores interactúan con las suposiciones del planificador. Úsalo junto con políticas de eliminación del caché KV para que las conversaciones largas no generen sobrecarga. Combínalo también con el caché de prompts en la fase de prellenado para evitar tener que “corregir la decodificación” mientras se sigue desperdiciando recursos en el prellenado. Un diseño integral de servicio es mejor que aplicar una solución aislada en un proceso crítico.
Preguntas frecuentes de los profesionales
¿Cambia la estrategia especulativa las respuestas? Debería coincidir con la distribución deseada si se implementa correctamente; verifica esto mediante pruebas emparejadas. ¿Cambia el cierre anticipado las respuestas? Sí, por diseño, ya que omite ciertas capas; ten en cuenta esa diferencia. ¿Podemos generar borradores en la CPU? A veces; mide los resultados. ¿Es esto relevante para modelos pequeños en el dispositivo? Con frecuencia, menos que para objetivos de gran tamaño. Orden de prioridad: primero corrige el procesamiento por lotes y el caché, luego la estrategia especulativa, y finalmente el cierre anticipado si la arquitectura lo permite.
Intuición numérica comprobada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que el de los pasos tradicionales de un solo token, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute prompts fijos en pruebas de conocimientos factuales, de programación y de rechazo. Compare las tasas de resultados idénticos en tokens cuando se configure el modo especulativo para lograr una distribución exacta. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de éxito en tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque los borradores y los objetivos en el mismo nodo cuando sea posible. Los borradores distribuidos entre hosts añaden fluctuaciones de red que pueden anular los beneficios obtenidos. Tenga en cuenta la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía manejar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Incluso después de mejorar la decodificación, los usuarios pueden seguir esperando por las llamadas a herramientas, la recuperación de datos o el procesamiento de Markdown en el lado del cliente. Realice seguimientos de punta a punta. La optimización en el lugar equivocado desperdicia tiempo de ingeniería.
Resumen final
La decodificación secuencial representa el costo estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen dicho costo en condiciones medibles. Implementarlas requiere la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser rentable. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, pruebe los mensajes fijos en las pruebas de conocimientos factuales, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de acierto en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los beneficios obtenidos. Tenga en cuenta la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y reducen la utilización. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y perjudican la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir esperando en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen esa carga en condiciones medibles. Implemente estas soluciones con la misma disciplina que cualquier funcionalidad de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Intuición numérica aplicada
Supongamos que un paso objetivo cuesta 10 ms y un borrador propone 5 tokens con una tasa de aceptación promedio del 60% para 3 tokens. El costo efectivo por token aceptado es menor que en los pasos de un solo token tradicionales, incluso después de los costos adicionales del borrador, siempre que la tasa de aceptación se mantenga alta. Si la tasa de aceptación disminuye a aproximadamente 1 token, el esquema deja de ser eficaz. Esa sensibilidad es la razón por la cual los paneles de control son superiores a las anécdotas.
Protocolo de regresión de calidad
Antes de habilitarlo a nivel global, ejecute los prompts fijos en las pruebas de verificación factual, de programación y de rechazo. Compare las tasas de identidad total de tokens cuando se configure el modo especulativo para una coincidencia exacta en la distribución. Investigue cualquier desviación sistemática. Para una salida temprana, supervise la tasa de aciertos en las tareas calificadas y las preferencias humanas cuando estén disponibles.
Ubicación del hardware
Coloque el borrador y el objetivo en el mismo nodo siempre que sea posible. Los borradores en servidores diferentes generan fluctuaciones de red que pueden anular los avances logrados. Preste atención a la memoria: dos modelos más la caché KV pueden agotar los recursos de una máquina que antes podía albergar cómodamente uno solo.
Programación de interacciones
Los servidores de procesamiento por lotes continuo deben tener en cuenta las expansiones especulativas variables. Los programadores inadecuados fragmentan los lotes y perjudican la utilización eficiente. Coordínese con los responsables del servicio; no modifique indicadores solo en el código de la aplicación.
Honestidad sobre los cuellos de botella restantes
Después de que mejore la decodificación, los usuarios podrían seguir experimentando demoras en las llamadas a la herramienta, en la recuperación de datos o en el procesamiento de Markdown del lado del cliente. Haga un seguimiento end-to-end. Optimizar en el ámbito incorrecto desperdicia tiempo de ingeniería.
Resumen
La decodificación secuencial representa la carga estructural de la autoregresión. La decodificación especulativa y la salida anticipada reducen dicha carga en condiciones medibles. Implemente estas funcionalidades con la misma disciplina que cualquier característica de producción: métricas, indicadores, mecanismos de reversión y responsables claros dentro del equipo de la plataforma de servicio.
Lecturas relacionadas
- Optimización de la inferencia de LLM: prefill, decodificación y LLMOps empresariales — Cuellos de botella entre prefill y decodificación, procesamiento por lotes continuo, FlashAttention, cuantización, PagedAttention, decodificación especulativa, prefill por bloques y servicio desagregado.