Home Knowledge Base Lookahead decoding

Lookahead decoding is a speculative decoding technique that generates multiple tokens in parallel — using n-gram patterns or draft models to predict likely continuations, then verifying them in a single forward pass, achieving significant speedups for autoregressive inference.

What Is Lookahead Decoding?

Why Lookahead Matters

Speculative Decoding Concept

Core Idea:

Standard Decoding:
  [prompt] → token1 → token2 → token3 → token4
  (4 forward passes)

Speculative Decoding:
  [prompt] → draft [t1, t2, t3, t4]
  [prompt, t1, t2, t3, t4] → verify in parallel
  Accept: [t1, t2, t3] (t4 rejected)
  (2 forward passes for 3 tokens)

Visual:

Standard:
  Pass 1: "The"
  Pass 2: "The quick"
  Pass 3: "The quick brown"
  Pass 4: "The quick brown fox"

Speculative:
  Draft:  "The quick brown fox" (fast/approximate)
  Verify: "The quick brown" ✓ "fox" → "dog" (corrected)

Lookahead Decoding Variants

N-gram Based (No Draft Model):

1. Build n-gram cache from prompt/generation
2. Use n-grams to predict likely continuations
3. Verify predicted sequences in parallel

Advantage: No separate draft model needed
Limitation: Only works if patterns repeat

Draft Model Based (Speculative Decoding):

1. Small draft model generates candidate tokens
2. Large target model verifies in single pass
3. Accept matching tokens, resample mismatches

Advantage: Works for any text
Requirement: Compatible draft model

Implementation Sketch

Speculative Decoding:

def speculative_decode(
    target_model,
    draft_model,
    input_ids,
    num_speculative=4
):
    while not done:
        # Draft model generates candidates
        draft_tokens = []
        draft_input = input_ids.clone()
        for _ in range(num_speculative):
            draft_logits = draft_model(draft_input).logits[0, -1]
            next_token = draft_logits.argmax()
            draft_tokens.append(next_token)
            draft_input = torch.cat([draft_input, next_token.unsqueeze(0).unsqueeze(0)], dim=-1)
        
        # Target model verifies all at once
        candidate_sequence = torch.cat([input_ids] + [t.unsqueeze(0).unsqueeze(0) for t in draft_tokens], dim=-1)
        target_logits = target_model(candidate_sequence).logits
        
        # Check agreement
        accepted = 0
        for i, draft_token in enumerate(draft_tokens):
            target_token = target_logits[0, len(input_ids) + i - 1].argmax()
            if target_token == draft_token:
                accepted += 1
            else:
                # Resample from target distribution
                input_ids = torch.cat([input_ids, target_token.unsqueeze(0).unsqueeze(0)], dim=-1)
                break
        else:
            # All accepted
            input_ids = candidate_sequence
    
    return input_ids

Practical Usage

Hugging Face Assisted Generation:

from transformers import AutoModelForCausalLM, AutoTokenizer

# Target (large) model
target = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-70B")
# Draft (small) model
draft = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B")

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-70B")

inputs = tokenizer("Explain quantum computing:", return_tensors="pt")

# Assisted generation
outputs = target.generate(
    **inputs,
    assistant_model=draft,
    max_new_tokens=200,
)

Performance Expectations

Speedup Factors:

Configuration              | Typical Speedup
---------------------------|----------------
Good draft model match     | 2-3×
Similar domain/style       | 2-4×
Repetitive content         | 3-5× (n-gram)
Different domain           | 1.5-2×
Mismatched draft           | ~1× (no benefit)

When Most Effective:

✅ Long outputs (more speculation opportunities)
✅ Predictable patterns
✅ Memory-bound inference (spare compute)
✅ Good draft model alignment

❌ Short outputs
❌ High entropy (unpredictable) text
❌ Compute-bound scenarios

Lookahead decoding represents the future of efficient LLM inference — by exploiting the parallelism of modern accelerators and the predictability of language, it breaks the one-token-per-iteration bottleneck of autoregressive models.

lookahead decodingspeculativeparalleldraftspeedupinference

Explore 500+ Semiconductor & AI Topics

From EUV lithography to CUDA optimization — search the full knowledge base or chat with our AI assistant.