Known Limitations
May 18, 2026 · View on GitHub
Honest constraints of the current implementation, with the evidence behind them. Code comments and tests that cite "capture corruption" point here.
CUDA-graph replay corrupts the q/k capture (2026-06-09 evidence)
Under the pinned vLLM 0.22.1rc1 cu129 nightly, running the MT engine with
CUDA graphs (both cudagraph_mode="full" and "piecewise") corrupts the
attention observer's captured q/k payload:
- ~58% of streaming chunks produced non-finite provenance rows
(
alignatt:provenance_nonfinite), and a further ~12% returned an empty observer payload (alignatt:observer_empty); - mechanism: the
alignatt::capture_mt_qkcustom op sits inside graphed pieces, and graph replay scatters padded garbage rows into the prompt-K buffer; - consequence: affected draft tokens are withheld by the policy, so a corrupted run silently degrades toward "the system never emits". Since 2026-07 the backend logs an error the first time either signature appears in a process.
Mitigation: the MT engine runs eagerly. mt_vllm_enforce_eager=True is the
default on every surface (runtime config, presets, backends, CLI runners) and
is pinned by tests/test_capture_safe_default_invariants.py. The
mt_vllm_cudagraph_mode knob only applies when eager is explicitly disabled,
which is not a supported configuration for scored runs.
Implication for the speed figures: the graphed capture path is fast — the paper's 2.5x, re-measured at 5.35x on 2026-07-02 hardware — but scored runs use the capture-safe eager configuration (1.45x measured the same day); see docs/benchmarks/README.md for all three artifacts. Root-causing the corruption (buffer aliasing across replays vs. the custom-op mutation contract vs. profiler-phase capture) is open follow-up work; fixing it brings the 5x-class speed to scored runs.
vLLM version sensitivity
The capture layer patches vLLM-internal attention classes
(vllm.model_executor.models.*) and runs a custom worker_cls inside the
engine. These are not stable vLLM APIs:
- validated stacks: the pinned
0.22.1rc1.dev316+g3d119f78f.cu129nightly (installed bytools/bootstrap/setup_inference_qwen_asr_vllm.shfrom vLLM's per-commit wheel index) and0.23.1rc1(needsVLLM_MEMORY_PROFILER_ESTIMATE_CUDAGRAPHS=0plus adjusted GPU-memory splits; see reproducibility.md); - on other versions,
assert_supported_attention_modulefails loudly if an attention class renames the attributes the patched forward reads; behavior beyond that check is untested.
Other constraints
- Single vLLM worker only. Tensor parallelism (
tp > 1) is unsupported; the observer buffers and the capture-op registry live in one worker process. - Grouped-query attention mapping. The observer assumes the standard
contiguous query-head → KV-head grouping
(
map_attention_head_to_key_value_head); exotic KV layouts need care. - Gemma4 KV-shared layers are not capturable. Layers with
is_kv_shared_layer=Truecompute no K of their own; the observer rejects head selections that include them at configure time. Calibrate heads on non-shared layers. - Hardware envelope. Validated on a single 40 GB A100 (Linux, CUDA 12.9, Python 3.13). The dual ASR+MT engine layout needs the GPU-memory splits documented in reproducibility.md.
- Head calibration dependencies.
detect_translation_heads.pyuses an LLM word aligner that requiresOPENAI_API_KEYfor new language directions, andgoogle/gemma-4-E4B-itis a gated model (accept the license on Hugging Face before downloading).