[Mamba] Add FlashInfer ReplaySSM support for MTP by askliar · Pull Request #52928 · vllm-project/vllm · GitHub
Skip to content

[Mamba] Add FlashInfer ReplaySSM support for MTP - #52928

Merged
benchislett merged 30 commits into
vllm-project:mainfrom
askliar:feat/add_flashinfer_replayssm_mtp
Sep 30, 2026
Merged

benchislett merged 30 commits into
vllm-project:mainfrom
askliar:feat/add_flashinfer_replayssm_mtp

Conversation

@askliar

@askliar askliar commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This stacked follow-up extends the native FlashInfer ReplaySSM integration from single-token decode in #52506 to multi-token prediction (MTP) verification for Mamba2 models.

With MTP, the model evaluates one target token plus several draft tokens before sampling determines how many were accepted. ReplaySSM avoids materializing a separate recurrent state for every speculative token: each layer keeps a checkpoint and a ring of inputs, the accepted length advances a shared cursor before the next forward, and the checkpoint is updated only when the next verification window would overflow the ring.

Dependencies

Important

This PR is stacked on #52506 and must not merge independently. Until #52506 lands, GitHub shows the cumulative base and MTP changes in this diff.

The FlashInfer path also depends on the compatible ReplaySSM API and native autotuning work in flashinfer-ai/flashinfer#4545.

Design

  • MTP-shaped execution: uniform verification batches use dense (batch, tokens, ...) inputs so FlashInfer can select its native MTP tactics. Variable-length batches use the packed cu_seqlens interface.
  • One acceptance update per cache group: every Mamba layer observes the same accepted-token count, so ring cursors are shared and advanced once per model forward. Checkpoints and ring payloads remain layer-local.
  • One state page per request: ReplaySSM stores one physical Mamba state page rather than one page per target/draft position. The causal-conv1d verification length is passed separately from the physical block-table width.
  • CUDA-graph-safe indexing: the contiguous FlashInfer state-index vector lives in persistent runner-owned storage and is refreshed before replay, keeping its captured address stable.
  • Native FlashInfer selection: the ReplaySSM call uses FlashInfer’s checkpointing_ssu API and native autotuning. PDL is forwarded explicitly but defaults off because it was not a consistent end-to-end win.
  • No duplicate Triton implementation: [Kernel] ReplaySSM: cache SSM inputs for faster Mamba2 speculative decode #49847 implements MTP ReplaySSM using separate Triton kernels, a token-major ring, and its own cursor lifecycle. This PR retains the FlashInfer layout and delegates the update to native FlashInfer instead of copying the Triton kernel stack into vLLM.

This PR does not modify FlashInfer or add prefix-cache alignment support. ReplaySSM continues to use mamba_cache_mode=none.

Correctness

Matched GSM8K evaluation on GB200 compared FlashInfer ReplaySSM with the exact #49847 Triton implementation:

Backend Correct Accuracy Invalid outputs
FlashInfer 437 / 512 85.35% 0
Triton #49847 437 / 512 85.35% 0

The comparison used FP32 SSM state with stochastic rounding disabled. A strict H100 B16/AL1 CUDA-graph control also produced identical complete output hashes across the two backends.

Actual-model throughput

Workload:

  • Model: NVIDIA/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-NVFP4
  • MTP: three draft tokens and a four-token verification window
  • Measured acceptance length: 4.0
  • ReplaySSM buffer: 16
  • SSM state: FP32
  • Stochastic rounding: disabled
  • CUDA graphs: enabled
  • Metric: output tokens/s

H100 80GB

Batch FlashInfer, PDL off FlashInfer, PDL on Triton #49847 Best FI vs Triton
16 6,578.81 6,563.84 6,472.75 +1.64%
128 19,343.22 19,388.90 19,059.60 +1.73%
256 21,896.57 22,014.13 21,725.24 +1.33%
512 24,863.34 24,852.45 24,458.58 +1.65%

GB200

The allocation identified the device as NVIDIA GB200.

Batch FlashInfer, PDL off FlashInfer, PDL on Triton #49847 Production FI off vs Triton
16 8,811.71 7,921.11 8,467.73 +4.06%
128 25,532.13 25,948.60 24,270.93 +5.20%
256 28,687.11 28,703.49 27,153.46 +5.65%
512 29,272.09 29,170.54 27,718.29 +5.61%

PDL was harmful at GB200 B16 and effectively neutral at larger batches. The production path therefore keeps it disabled while preserving the explicit argument for future FlashInfer tuning and debugging.

Production-profile findings

Nsight Systems profiles used 64 steady CUDA-graph decode steps and summed ReplaySSM work over all 23 Mamba layers:

H100 case FlashInfer kernels Triton kernels FlashInfer tracker Triton tracker
B16, AL4 739.42 μs/step 644.74 μs/step 6.89 μs/step 10.87 μs/step
B128, AL4 3,529.11 μs/step 3,587.91 μs/step 8.50 μs/step 12.69 μs/step

The eager microbenchmark showed a much larger FlashInfer advantage because the Triton path issued several kernels from Python. CUDA-graph replay removes most of that dispatch and inter-launch gap. In production graphs, B16 favors the Triton kernels while B128 is effectively tied; the shared FlashInfer tracker is consistently cheaper.

On GB200 at B256, ReplaySSM accounted for approximately 16% of execute-step GPU time. Its 1.56× in-model improvement predicts a maximum whole-step gain of roughly 6.1%, close to the measured 5.65%. This explains why a much larger isolated-kernel ratio becomes a mid-single-digit end-to-end improvement.

Cache capacity

After decoupling verification length from physical state-page allocation, both backends admit the full requested concurrency:

Batch FlashInfer cache tokens Triton cache tokens Difference
256 303,923 308,121 -1.4%
512 293,990 299,008 -1.7%

This removes the previous four-state-pages-per-request over-allocation and brings FlashInfer capacity within 2% of #49847.

Validation

  • Changed-file pre-commit passes, including Ruff, mypy, SPDX, configuration validation, forbidden imports, and CUDA API checks.
  • Focused H100 suite: 41 passed, 200 deselected.
  • GB200 GSM8K: exact accuracy parity with zero invalid outputs.
  • TP2 actual-model MTP smoke completed.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This pull request is from a fork — automated review is disabled. A repository maintainer can comment @claude review to run a one-time review.

@mergify

mergify Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

This pull request has merge conflicts that must be resolved before it can be
merged. Please rebase the PR, @askliar.

https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@benchislett benchislett added the ready ONLY add when PR is ready to merge/full CI is needed label Aug 31, 2026
@benchislett

Copy link
Copy Markdown
Member

/ci run

@github-actions

Copy link
Copy Markdown

✅ @askliar, CI is now available for this PR.

  • /ci run starts upstream CI; /amd-ci run starts AMD CI only.
  • /ci retry retries failed jobs in the CI build for the current PR head. If the current head has no CI build, it starts a new CI build for the current head containing only jobs that failed in the latest earlier CI build for this PR.
  • /amd-ci retry retries failed jobs in AMD CI for the current PR head. Use /amd-ci run when the current head has no AMD CI build.
  • /ci cancel cancels scheduled or running CI builds for this PR branch; /amd-ci cancel does the same for AMD CI only.

@github-actions

Copy link
Copy Markdown

✅ Triggered Buildkite CI #86434 for commit 1026b27b2792.

@mergify

mergify Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Hi @askliar, the pre-commit checks have failed. Please run:

uv pip install pre-commit>=4.5.1
pre-commit install
pre-commit run --all-files

Then, commit the changes and push to your branch.

For future commits, pre-commit will run automatically on changed files before each commit.

@AndreasKaratzas

Copy link
Copy Markdown
Member

For new FlashInfer test files, please adda global pytest skipif statement on the top of the files if platform is not cuda and if flashinfer is not found. Otherwise, some CI resources are going to be spent evaluating each function separately before they are skipped. It also makes the test files' purpose clear "Not supported since this is a FlashInfer related test file" or something for msg.

@github-actions

Copy link
Copy Markdown

✅ Triggered Buildkite CI #91968 for commit b04221201e32, running 2 failed step(s) from Buildkite CI #91906.

@benchislett

Copy link
Copy Markdown
Member

/ci run

@benchislett
benchislett enabled auto-merge (squash) September 30, 2026 15:03
@github-actions

Copy link
Copy Markdown

❌ This PR is 40 commits behind upstream main. Your branch must contain every commit currently on upstream main. No new CI build was started. Merge or rebase onto the latest main, then rerun /ci run. To test this branch at your own risk, use /ci run --allow-stale.

@askliar

askliar commented Sep 30, 2026

Copy link
Copy Markdown
Contributor Author

/ci run

@github-actions

Copy link
Copy Markdown

✅ Triggered Buildkite CI #92186 for commit 14426dada0ff.

@vllm-agent

vllm-agent commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

CI selector (shadow): 62 test steps (109 jobs) instead of 88 (132 jobs)

Shadow mode: this changes nothing about what CI runs. It shows what the evidence-based selector would pick for this PR, next to today's rules. How it works.

Feedback welcome: reply here if it would skip a step this change needs, or runs something unrelated.

steps (jobs) Today's rules Selector Would skip Would add
NVIDIA, CPU and others 88 (132) 62 (109) 45 (53) 19 (30)
AMD mirrors 92 (142) 49 (86) 52 (68) 9 (12)
Selector would run (62)
  • amd-kernels-mi355
  • arm-cpu-test ×3
  • async-engine-inputs-utils-worker
  • basic-models-test-other-cpu
  • basic-models-tests-extra-initialization ×14
  • basic-models-tests-initialization
  • basic-models-tests-other
  • cpu-kernel-tests ×2
  • cpu-language-generation-and-pooling-model-tests ×3
  • cpu-multi-modal-model-tests-n ×4
  • cpu-multimodal-config
  • cpu-params-env-tokenizers-parser
  • cpu-reasoning-renderers
  • cpu-spec-decode-tests
  • cudagraph
  • distributed-dp-tests-4-gpus
  • distributed-model-tests-2-gpus ×3
  • e2e-core-1-gpu
  • e2e-core-large-memory
  • e2e-scheduling-1-gpu
  • engine
  • engine-1-gpu
  • entrypoints-integration-api-server-openai-completion
  • entrypoints-integration-responses-api
  • entrypoints-integration-speech_to_text
  • fusion-and-compile-unit-tests-2xb200
  • kernels-attention-test ×7
  • kernels-b200 ×3
  • kernels-mamba-test
  • kernels-root-misc-test-b200
  • kimi-k3-unit-tests-b200
  • kv-offload-large
  • kv-offload-medium
  • kv-offload-small
  • language-models-tests-extra-standard ×2
  • language-models-tests-granite-l4-compatibility
  • language-models-tests-hybrid ×2
  • language-models-tests-standard
  • model-executor
  • multi-modal-models-standard-1-qwen2
  • multi-modal-models-standard-4-other-whisper
  • multi-modal-processor ×4
  • multi-modal-processor-cpu ×4
  • pipeline-context-parallelism-4-gpus
  • pytorch-compilation-passes-unit-tests
  • pytorch-compilation-unit-tests
  • pytorch-fullgraph-cudagraph-l4-compatibility
  • pytorch-fullgraph-test
  • quantization ×4
  • qwen4-exp-unit-tests
  • qwen4-exp-unit-tests-cpu
  • rayexecutorv2-4-gpus
  • spec-decode-eagle-1-deepseek-qwen
  • spec-decode-eagle-2-llama3-qwen-vl-other
  • spec-decode-ngram-suffix
  • v1-attention-b200 ×2
  • v1-attention-h100-mi300 ×2
  • v1-executor-worker
  • v1-kv-connectors ×4
  • v1-kv-offload
  • v1-others-cpu
  • v1-spec-decode
Would skip (today's rules run them) (45)
  • amd-lm-eval-small-models-harness
  • ascend-npu-test
  • basic-correctness ×2
  • basic-correctness-cpu-offload
  • basic-correctness-cumem
  • basic-correctness-prefetch-offload
  • basic-correctness-sleep-mode
  • batch-invariance-b200
  • batch-invariance-h100
  • benchmarks-cli-test
  • cpu-tool-parsers
  • distributed-compile-unit-tests-2xh100
  • entrypoints-integration-api-server ×4
  • entrypoints-integration-api-server-generate
  • entrypoints-integration-api-server-openai-chat_completion
  • entrypoints-integration-llm
  • entrypoints-integration-multimodal
  • entrypoints-integration-pooling
  • fusion-e2e-quick-h100
  • fusion-e2e-tp2-b200
  • fusion-e2e-tp2-quick-h100
  • jit-monitor-no-runtime-jit
  • kernels-fla-ops-test-b200
  • kernels-fusedmoe-layer-test-2-b200s
  • kernels-fusedmoe-layer-test-2-h100s
  • kernels-mhc-test-b200
  • kernels-moe-test ×5
  • lm-eval-dspark-watermark-2xh100
  • metrics-tracing-2-gpus
  • mooncake-ec-tcp-e2e-2-gpus
  • multi-modal-models-standard-2-qwen3-gemma
  • multi-modal-models-standard-3-llava-qwen2-vl
  • pytorch-compilation-dynamic-shapes
  • pytorch-compilation-unit-tests-h100
  • regression
  • samplers-multimodal-beam-search
  • samplers-test
  • spec-decode-mtp-deepseek-mimo
  • spec-decode-mtp-gemma4
  • spec-decode-mtp-qwen3-5
  • spec-decode-speculators
  • v1-core
  • v1-logits-oracle
  • v1-metrics-lmeval
  • v1-sample
Would add (today's rules do not run them) (19)
  • amd-kernels-mi355 (code map)
  • arm-cpu-test ×3 (code map)
  • cpu-kernel-tests ×2 (code map)
  • cpu-multi-modal-model-tests-n ×4 (code map)
  • cudagraph (code map)
  • distributed-dp-tests-4-gpus (code map)
  • fusion-and-compile-unit-tests-2xb200 (code map)
  • kernels-b200 ×3 (code map)
  • kimi-k3-unit-tests-b200 (code map)
  • kv-offload-large (code map)
  • kv-offload-medium (code map)
  • kv-offload-small (code map)
  • quantization ×4 (code map)
  • qwen4-exp-unit-tests (code map)
  • qwen4-exp-unit-tests-cpu (code map)
  • rayexecutorv2-4-gpus (code map)
  • spec-decode-eagle-1-deepseek-qwen (code map)
  • spec-decode-eagle-2-llama3-qwen-vl-other (code map)
  • spec-decode-ngram-suffix (code map)
AMD mirrors: would skip (52)
  • basic-correctness ×2
  • basic-correctness-cpu-offload
  • basic-correctness-cumem
  • basic-correctness-prefetch-offload
  • basic-correctness-sleep-mode
  • batch-invariance-h100
  • benchmarks-cli-test
  • deepseek-v4-kernel-test-b200
  • entrypoints-integration-api-server ×4
  • entrypoints-integration-api-server-generate
  • entrypoints-integration-api-server-openai-chat_completion
  • entrypoints-integration-llm
  • entrypoints-integration-multimodal
  • entrypoints-integration-pooling
  • extract-hidden-states-integration-2-gpus
  • fault-tolerance-e2e-2xh100
  • fusion-e2e-quick-h100
  • fusion-e2e-tp2-ar-rms-config-sweep-h100
  • fusion-e2e-tp2-b200
  • fusion-e2e-tp2-quick-h100
  • jit-monitor-no-runtime-jit
  • kernels-fla-ops-test-b200
  • kernels-fp4-moe-test-b200
  • kernels-fusedmoe-layer-test-2-b200s
  • kernels-fusedmoe-layer-test-2-h100s
  • kernels-mhc-test-b200
  • kernels-moe-test ×5
  • kernels-quantization-test ×6
  • lm-eval-dspark-watermark-2xh100
  • lm-eval-small-models
  • metrics-tracing-2-gpus
  • mooncake-ec-tcp-e2e-2-gpus
  • mrcr-eval-small-models
  • multi-modal-models-standard-2-qwen3-gemma
  • multi-modal-models-standard-3-llava-qwen2-vl
  • openai-api-correctness
  • platform-tests
  • pytorch-compilation-dynamic-shapes
  • pytorch-compilation-unit-tests-h100
  • quantized-moe-test-b200
  • regression
  • samplers-multimodal-beam-search
  • samplers-test
  • spec-decode-draft-model ×4
  • spec-decode-mtp-deepseek-mimo
  • spec-decode-mtp-gemma4
  • spec-decode-mtp-qwen3-5
  • spec-decode-speculators
  • v1-core
  • v1-logits-oracle
  • v1-metrics-lmeval
  • v1-sample
AMD mirrors: would add (9)
  • cudagraph (code map)
  • fusion-e2e-tp2-asynctp-config-sweep-h100 (code map)
  • kernels-flashmla-test-h100 (code map)
  • kimi-k3-unit-tests-b200 (code map)
  • kv-offload-large (code map)
  • kv-offload-medium (code map)
  • kv-offload-small (code map)
  • quantization ×4 (code map)
  • qwen4-exp-unit-tests (code map)

CI results (2026-09-30 16:56 UTC)

217 passed, 1 failed, 19 pending.
CI is still running; the picture below is not final.

No misses: the selector would have run every failed job.

  • computer-cpu-reasoning-plus-renderers: selector runs it

18 changed files · base cff08b461e · head 14426dada0 · Python record: not used (/tmp/ci-infra-selector/buildkite/ci_selector/coverage-data/table.json.gz is table version 5, expected 7; re-merge it from the raw recordings) · kernel record: table 866fa13 (build 92059), map 866fa13 · not counted: 10 build steps, 5 A100 steps the generator no longer emits, 33 optional steps the selector would also run

@askliar

askliar commented Sep 30, 2026

Copy link
Copy Markdown
Contributor Author

/ci retry

@github-actions

Copy link
Copy Markdown

@benchislett
benchislett merged commit deb148e into vllm-project:main Sep 30, 2026
13 checks passed
askliar pushed a commit to askliar/vllm that referenced this pull request Oct 1, 2026
Port the unified STP/MTP and align-prefix lifecycle onto current main after vllm-project#52928. Preserve upstream replay boundaries, runner interfaces, and removal of all mode. Keep accepted-state ownership and materialization in the model lifecycle.

Assisted-by: OpenAI Codex
Signed-off-by: Andrii Skliar <askliar@nvidia.com>
njhill added a commit that referenced this pull request Oct 3, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 13, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 13, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 13, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 13, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 17, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
michael-gpu pushed a commit to practical-inference/vllm-ampere-extended that referenced this pull request Oct 20, 2026
Signed-off-by: Andrii Skliar <askliar@nvidia.com>
Co-authored-by: Andrii Skliar <askliar@nvidia.com>
njhill added a commit that referenced this pull request Oct 23, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 23, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 26, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 27, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 28, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 28, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 28, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 28, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
njhill added a commit that referenced this pull request Oct 28, 2026
…y held weights

- Upstream #53934 lets Elastic EP run on Model Runner V2, so the extensible
  KV cache would now be enabled with it by default. Scale-up engines skip
  warmup and size the KV cache from the profiled estimate the running engines
  hand over, which under the extensible cache is the full reserved capacity;
  nothing would measure it before the final commit. Treat elastic EP as
  unsupported, as it effectively was when it forced the V1 runner.
- Upstream #57298 subtracts weights held by an external loader process from
  the memory budget. Recompute the budget with them when the driver probe
  disables the extensible cache.
- The ReplaySSM warmup test stub provides `max_num_batched_tokens`, which
  upstream #52928 now reads for the autotune prefill.

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/build mrv2 Model Runner V2 specific ready ONLY add when PR is ready to merge/full CI is needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants