Skip to content

[Spec Decode][MRV2] Skip drafting in steps where no request can use the drafts - #62784

Merged
TheEpicDolphin merged 5 commits into
vllm-project:mainfrom
zixi-qi:zixi/skip-drafting
Oct 22, 2026
Merged

TheEpicDolphin merged 5 commits into
vllm-project:mainfrom
zixi-qi:zixi/skip-drafting

Conversation

@zixi-qi

@zixi-qi zixi-qi commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Overview

Continues #48244 by @njhill (co-author). In steps where no scheduled request can use the
drafts proposed after the step, the speculator now proposes with K=0 instead of
drafting. Such requests are non-final prefill chunks and requests sure to reach
max_tokens. This covers every request on a P/D prefill instance, which runs with
max_tokens=1.

Related: #39266 (draft) skips EAGLE drafting on MRV2 for P/D prefill instances and
non-final chunks; this PR decides in the scheduler and also covers requests about to
finish, DFlash and DP. #53426 makes the K=0 draft sync forward optional; this PR keeps
that forward.

Claims

  • On Model Runner V2, when no scheduled request on any DP rank can use the drafts, the
    speculator runs with num_speculative_tokens=0:
    • EAGLE/EAGLE3/MTP still run the draft prefill pass, which keeps the drafter's KV cache
      in sync, but skip draft sampling and the draft decode steps.
    • DFlash stores the context K/V and skips the query pass. DSpark, DFlash2 and
      LiLiCorr share this code.
  • The drafter's prefill pass still runs, so the gain is modest. Prefill-only throughput
    (Qwen3-8B, 64 x 16,384-token prompts, 1 output token, one GB300 GPU) improves by
    +1.9% with EAGLE3 and +7.3% with DFlash at max_num_batched_tokens=512, and by
    +1.4% and +2.7% at 2048. On a 1P1D prefill instance every step proposes with K=0,
    and prefill throughput improves by +2.1% (EAGLE3) and +3.4% (DFlash) at 512, and by
    +0.6% and +1.9% at 2048.
  • Outputs and acceptance do not change. With batch-invariant kernels, outputs and every
    spec-decode counter are identical to main.

Validation

Qwen3-8B with AngelSlim/Qwen3-8B_eagle3 (K=3) and z-lab/Qwen3-8B-DFlash-b16 (K=16),
--attention-backend FLASH_ATTN, GB300. Baseline is main at 532a7d19d2, the base of
this PR; every run below used the rebased commit.

An earlier version of this description reported +9.0% (EAGLE3) and +3.4% (DFlash) at 512.
Those runs were CPU-starved (the benchmark processes were confined to one CPU core),
which inflated host-side costs. The numbers below replace them.

Prefill-only throughput (total tokens/s; mean of 3 reps on one engine after a warm-up
pass). The workload matches vllm bench throughput --dataset-name random --random-input-len 16384 --random-output-len 1 --num-prompts 64 --max-model-len 20480.
main and this PR ran at the same time on two GPUs of one node, then swapped GPUs. The
table shows the GPU whose reps stayed within 1%; on the other GPU, reps of both builds
varied by up to 30%. With the PR, every proposal in these runs used K=0.

Method max_num_batched_tokens main this PR Delta Step time saved
EAGLE3 2048 72,100 73,144 +1.4% 0.4 ms
EAGLE3 512 33,834 34,473 +1.9% 0.3 ms
DFlash 2048 72,569 74,508 +2.7% 0.7 ms
DFlash 512 32,367 34,730 +7.3% 1.1 ms

The skipped work is draft sampling and the draft decode steps (EAGLE3), or the query pass
(DFlash). Host time spent in propose() at 512 drops from 1.41 to 0.98 ms per step for
EAGLE3 and from 1.05 to 0.92 ms for DFlash; the rest of the saving is GPU time. The
drafter's prefill pass still runs: it writes the draft KV cache that later steps, and on
a P/D decode instance the transferred KV, depend on.

1P1D prefill throughput. P and D each on one GPU with NixlConnector, the same
drafter on both, P at the given max_num_batched_tokens. Through the toy proxy, 3
phases of 128 random 8,192-token prompts at concurrency 32 (max_tokens=8). P's waiting
queue was non-empty in at least 89% of samples. main and this PR ran side by side on the
node's two GPU pairs, then swapped; tokens/s and deltas are means over both placements.

Method P max_num_batched_tokens main this PR Delta P proposals with K=0 (PR)
EAGLE3 2048 56,809 57,213 +0.6% 3,072 / 3,072
EAGLE3 512 28,447 29,043 +2.1% 12,288 / 12,288
DFlash 2048 56,950 57,883 +1.9% 3,072 / 3,072
DFlash 512 28,527 29,524 +3.4% 12,288 / 12,288

Equivalence (offline, greedy). There are 80 requests: 24 long prompts chunked at 512
tokens with max_tokens 1, 2 or 64, run alone and then mixed with 32 short decode
requests.

Method Mode Outputs equal Spec-decode counters Proposals with K=0 (PR)
EAGLE3 VLLM_BATCH_INVARIANT=1 80/80 identical (3,349 drafts, 1,775 accepted) 19
DFlash VLLM_BATCH_INVARIANT=1 80/80 identical (2,244 drafts, 2,953 accepted) 18

Without batch invariance, two runs of main already differ on 23/80 EAGLE3 outputs, and
main vs this PR differ on 31/80. DFlash is deterministic across runs of main, but main
vs this PR differ on 31/80: in a K=0 step DFlash stores all context K/V in one eager
pass instead of partly inside the FULL graph, so rounding can differ, and acceptance then
changes batch shapes.

Existing e2e tests give the same results on both:

Test main this PR
tests/v1/e2e/spec_decode/eagle/test_eagle_correctness.py -k "medium and qwen3_eagle3 and not transformers" GSM8K 0.886, pass GSM8K 0.886, pass
tests/v1/e2e/spec_decode/acceptance_rates/dflash/test_dflash.py (MRV2 reference acceptance) MT-Bench 4.07, HumanEval 6.42, GSM8K 6.42 same
tests/v1/e2e/spec_decode/acceptance_rates/dflash/test_dflash.py::test_dflash_correctness[qwen3-mrv2] GSM8K 0.884, AL 4.12 same

Serving equivalence. 1P1D with NixlConnector used EAGLE3 K=3 on both sides and CUDA
graphs on. DP=2 used EAGLE3 K=3. Requests were sent one at a time.

Setup Outputs equal Decode-side acceptance length
1P1D 40/40 identical (1.521, 1.598)
DP=2 40/40 identical (1.539, 1.597)

There were no hangs with DP ranks voting to skip.

Unit tests. tests/v1/core/test_scheduler.py, tests/v1/core/test_async_scheduler.py,
tests/v1/worker/test_gpu_dp_utils.py and
tests/v1/worker/test_gpu_target_dependent_ar_speculator.py pass (281 tests), except two
pre-existing PP scheduler tests that fail the same way on main.

Details

  • Scheduler. It sets SchedulerOutput.skip_drafts when no scheduled request can use
    the step's drafts, on the V2 runner and for drafters that reserve lookahead slots.
    _drafts_unused counts only the output tokens a request is sure to have, assuming
    every draft is rejected, so it never skips drafts a later step could verify.
  • DP. The flag is ANDed across ranks in the batch-descriptor all-reduce that already
    runs, giving DPSyncState.skip_drafts. The runner then proposes with K=0. A rank
    running a dummy batch votes no, so an idle DP rank disables the skip for that step.
  • Changes from [Core] Skip redundant draft token alloc + sampling #48244:
    • The per-request lookahead-slot skip is dropped. For a non-final chunk, the lookahead
      slots are the next chunk's first positions, which are allocated one step later
      anyway. For a finishing request it saves at most about one block for one step.
      Keeping it safely means masking every draft KV write, including inside captured
      FULL draft-decode graphs; the fused decode path is the default on FlashAttention,
      FlashInfer and Triton, and its captured graphs compute their own slot mappings.
    • Skipping reuses the existing num_speculative_tokens == 0 path, which already skips
      the AR draft decode steps, instead of a separate flag in each speculator.
      skip_sample and the DFlash early return also apply to K=0 from dynamic speculative
      decoding.
    • The scheduler reports one flag instead of a set of request ids.
  • Not covered. Multi-module MTP and the draft-model speculator ignore K, so they
    still draft in these steps and the drafts go unused, as before. N-gram reserves no
    lookahead slots, so the flag is never set for it. MTP, DSpark, DFlash2 and LiLiCorr
    share the changed code but were not run; all validation used Qwen3-8B. MRV1 is
    unchanged.
Throughput script (one engine, warm-up then timed reps)
llm = LLM(model="Qwen/Qwen3-8B", speculative_config=spec, max_model_len=20480,
          max_num_batched_tokens=mbt, enable_prefix_caching=False, seed=42,
          attention_backend="FLASH_ATTN")
rng = np.random.default_rng(42)
prompts = lambda n: [TokensPrompt(prompt_token_ids=r.tolist())
                     for r in rng.integers(1000, 100000, size=(n, 16384))]
params = SamplingParams(temperature=0, max_tokens=1, ignore_eos=True)
llm.generate(prompts(8), params)
for _ in range(3):
    batch = prompts(64)
    t = time.perf_counter(); llm.generate(batch, params)
    print(64 * 16385 / (time.perf_counter() - t))

Pull Request Checklist
  • I used vLLM's /pr-checklist skill. (Mandatory for agents, optional for humans).

  • AI assistance was used during the creation of this PR.

  • Design Fit: Minimizes impact on core components, reuses existing functionality, and justifies added complexity.

  • Testing and Validation: Validates the change and ensures any added tests are meaningful and reliable, with CI coverage or documented CI resource constraints and validation performed outside CI.

  • Code Quality and Style: Keeps code and comments clear and concise, and updates relevant documentation and examples.

  • Pull Request Contents: Includes a brief summary and relevant links, supports claims with evidence, explains root causes and implementation trade-offs, and follows the contributing guide.

AI assistance (Claude Code) was used for the rebase, the rework and the validation. I
reviewed and can defend every change.

🤖 Generated with Claude Code

…he drafts

In steps where no scheduled request can use the drafts proposed after the
step (non-final prefill chunks, and requests sure to reach max_tokens), the
scheduler sets SchedulerOutput.skip_drafts. DP ranks AND the flag in the
existing batch-descriptor all-reduce, and the V2 model runner then proposes
with K=0: the AR speculator skips draft sampling and the draft decode steps,
and DFlash stores the context K/V and skips its query pass.

Continues vllm-project#48244.

Co-authored-by: Nick Hill <nickhill123@gmail.com>
Signed-off-by: Nick Hill <nickhill123@gmail.com>
Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@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.

@TheEpicDolphin TheEpicDolphin self-assigned this Oct 21, 2026

@TheEpicDolphin TheEpicDolphin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Very clean, LGTM!

@TheEpicDolphin TheEpicDolphin added the ready ONLY add when PR is ready to merge/full CI is needed label Oct 22, 2026
@TheEpicDolphin

Copy link
Copy Markdown
Member

/ci run

@github-actions

Copy link
Copy Markdown

✅ Triggered Buildkite CI #96559 for commit 1366ae26c0c6.

ℹ️ This PR is 85 commits behind upstream main. Merged upstream main into this branch as 1366ae26c0c6 before starting CI. Pull the branch before pushing more changes.

@zixi-qi

zixi-qi commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

/ci run

@github-actions

Copy link
Copy Markdown

✅ Triggered Buildkite CI #96571 for commit 76387059c411.

@zixi-qi

zixi-qi commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

/ci retry

@github-actions

Copy link
Copy Markdown

✅ Queued 2 failed job(s) for retry in Buildkite CI #96571.

@TheEpicDolphin

Copy link
Copy Markdown
Member

The failing tests seem related, but should be an easy fix

The DP all-reduce now carries a seventh row, each rank's allow_skip_drafts
vote, so the stubbed reduction in test_gpu_ubatch_slicing.py must have seven
rows too. The stub votes no, which keeps these microbatching tests unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: zixi-qi <zixi@inferact.ai>
@zixi-qi

zixi-qi commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

/ci run

@github-actions

Copy link
Copy Markdown

✅ Triggered Buildkite CI #96715 for commit 7937584f2cd0.

ℹ️ This PR is 51 commits behind upstream main. Merged upstream main into this branch as 7937584f2cd0 before starting CI. Pull the branch before pushing more changes.

@zixi-qi

zixi-qi commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator Author

/ci retry

@github-actions

Copy link
Copy Markdown

✅ Queued 2 failed job(s) for retry in Buildkite CI #96715.

@TheEpicDolphin
TheEpicDolphin merged commit 856b984 into vllm-project:main Oct 22, 2026
262 checks passed
@github-project-automation github-project-automation Bot moved this from Backlog to Done in Sprint - DFlash Oct 22, 2026
Morrowmake pushed a commit to Morrowmake/vllm-cmp170hx that referenced this pull request Oct 26, 2026
Upstream vLLM vllm-project#62784 makes DFlashSpeculator.propose store only the
context K/V when a step schedules zero drafts, on every data-parallel
rank. Remove the fork hook that did the same for one rank only, and let
the DSpark confidence code follow the upstream rule.
Morrowmake pushed a commit to Morrowmake/vllm-cmp170hx that referenced this pull request Oct 26, 2026
DFlashSpeculator.propose skips the draft step on every data-parallel rank
when a step schedules zero drafts (upstream vLLM vllm-project#62784), and drafts_nothing
follows that rule. The slot test still asserted the removed one-rank rule.
linfeng-yuan pushed a commit to vllm-project/vllm-ascend that referenced this pull request Oct 27, 2026
### What this PR does / why we need it?

Port `vllm-ascend` to vLLM main `544f182d` (bumped from `c0b6f74`) while
keeping the
`v0.31.0` release lane green. The upstream window drops
`replace_parameter(..., prefer_copy=...)`,
fuses the Kimi-K3 output gate into the QKV-A projection, adds the ROCm
Kimi-K3
specialized-decode hooks, widens the EPLB expert-weight and
rejection-sample contracts, and
adds the DP-drafter `num_reqs_override`, the MRv2 `skip_sample` drafting
skip, the HiSparse
`topk_buffer_width`, the SimpleCPUOffload CPU-block RPC and the abstract
`AsyncModelRunnerOutput.get_kv_connector_output`. Every gate below is
either a
`vllm_version_is("0.31.0")` split or an attribute/signature probe.

| Files | Upstream vLLM change (why it breaks vllm-ascend) | vllm-ascend
adaptation |

|-------|--------------------------------------------------|------------------------|
| `.github/vllm-main-verified.commit` | — (main-lane pin only) |
Verified main pin bumped `c0b6f74` -> `544f182d` |
| `tests/ut/attention/test_mla_prolog_v3_route.py` |
[vllm#60805](vllm-project/vllm#60805) makes
`MLAAttention.get_kv_cache_spec` read `topk_buffer_width` (set in
`__init__`);
[vllm#59634](vllm-project/vllm#59634) makes
`_mla_preprocess` return a 3-tuple | Set `owner.topk_buffer_width =
None` on the stub; mock `_mla_preprocess` as `(None, None, None)` |
| `tests/ut/attention/test_mla_v1.py` |
[vllm#59634](vllm-project/vllm#59634) fuses the
Kimi-K3 output gate as a third QKV-A shard | Add tests for
`qkv_a_gate_fused`/`use_output_gate` and `_split_fused_qkv_lora` gate
peeling; unpack the 3-tuple |
| `tests/ut/models/minimax_m3/test_minimax_m3_vit.py` |
[vllm#60238](vllm-project/vllm#60238) makes
`_mark_tower_model` read `use_v2_model_runner` | Add
`use_v2_model_runner=False` to the constructed runner stub |
| `tests/ut/models/test_kimi_k3_adapter.py` |
[vllm#60683](vllm-project/vllm#60683) adds the
ROCm specialized-decode hooks (`init_specialized_decode`,
`get_model_state_cls`, the `step` forward argument, and `layer.kv_cache`
reassignment via `clear_layer_kv_caches`) | Add main-only tests (`skipif
vllm_version_is("0.31.0")`) covering the inherited hooks |
| `tests/ut/ops/test_routed_experts.py` |
[vllm#61786](vllm-project/vllm#61786) registers
expert weights via `w.view(torch.uint8) if w.element_size() == 1 else w`
| New UT asserting `EplbExpertTensorList.element_size()/view()` keep the
container and its aliasing semantics |
| `tests/ut/patch/platform/test_patch_structured_output.py` |
[vllm#49625](vllm-project/vllm#49625) makes
`StructuredOutputManager.grammar_init` read `backend_name` | Set
`manager.backend_name = None` on the stub |
| `tests/ut/runtime_guard/test_unified_wiring.py` |
[vllm#56430](vllm-project/vllm#56430) adds
`AsyncModelRunnerOutput.get_kv_connector_output` | Add a stub
`get_kv_connector_output` to the fake async output |
| `tests/ut/simple_kv_offload/test_simple_kv_offload.py` |
[vllm#52921](vllm-project/vllm#52921) adds the
`get_simple_cpu_offload_num_cpu_blocks` worker RPC | New main-only UTs
for the aligned / no-group / no-connector paths |
| `tests/ut/spec_decode/test_dflash2_v2.py` |
[vllm#58984](vllm-project/vllm#58984) adds
`num_reqs_override` to `prepare_dflash_inputs_triton` | Update the
expected kwarg; new test for positional forwarding |
| `tests/ut/worker/test_model_runner_v1.py` |
[vllm#60805](vllm-project/vllm#60805)
`topk_buffer_width` | Set `layer.topk_buffer_width = None` on the layer
stub |
| `tests/ut/worker/test_model_runner_v2.py` | Same
[vllm#60805](vllm-project/vllm#60805) | Same
stub attribute |
| `tests/ut/worker/v2/test_speculator.py` |
[vllm#62784](vllm-project/vllm#62784) adds
`skip_sample` to the drafter `_prefill` | Expect/forward `skip_sample`
on main (7 -> 8 positional args) |
| `tests/ut/worker/v2/test_v2_block_table.py` |
[vllm#60767](vllm-project/vllm#60767) makes
`init_block_table_layout_tensors` read `_sliding_window_reach` | Set
`tables._sliding_window_reach = [0, 0]` |
| `vllm_ascend/attention/mla_v1.py` |
[vllm#59634](vllm-project/vllm#59634) fuses the
Kimi-K3 output gate into the QKV-A projection (three shards, no
standalone `g_proj`);
[vllm#62326](vllm-project/vllm#62326) drops
`replace_parameter(..., prefer_copy=)` | Detect the gate-fused layout
from `fused_qkv_a_proj.output_sizes`, disable MLAPO/PROLOG_V3 for it,
bound the KV-A slice with `_fused_qkv_a_kv_end`, peel the gate in
`_split_fused_qkv_lora`; version-split `replace_parameter` |
| `vllm_ascend/attention/sfa_v1.py` |
[vllm#62326](vllm-project/vllm#62326) drops
`replace_parameter(..., prefer_copy=)` | Version-split
`replace_parameter` (keep `prefer_copy=True` on v0.31.0) |
| `vllm_ascend/models/deepseek_v4/indexer.py` |
[vllm#52670](vllm-project/vllm#52670) keeps
`STR_DTYPE_TO_TORCH_DTYPE["fp8"]` as the uint8 storage dtype, so
`kv_cache_dtype_str_to_dtype` cannot validate the indexer's fp8 compute
dtype | Validate `indexer_kv_dtype` against the platform default string
and return the compute dtype directly |
| `vllm_ascend/models/kimi_k3.py` |
[vllm#60683](vllm-project/vllm#60683) adds the
ROCm specialized-decode hooks and reassigns `layer.kv_cache` on teardown
| Add a `kv_cache` setter, call `init_specialized_decode` + override
`get_model_state_cls` to the Ascend hybrid state on main, forward `step`
|
| `vllm_ascend/observability/runtime_guard/hooks.py` |
[vllm#56430](vllm-project/vllm#56430) makes
`AsyncModelRunnerOutput.get_kv_connector_output` required | Implement it
on `AscendAsyncOutput` (main only) |
| `vllm_ascend/ops/fused_moe/routed_experts.py` |
[vllm#61786](vllm-project/vllm#61786) moves
1-byte expert tensors as uint8 views | Add `element_size()`/`view()` to
`EplbExpertTensorList`; widen the `get_expert_weights` return type |
| `vllm_ascend/ops/gdn.py` |
[vllm#62326](vllm-project/vllm#62326) drops
`replace_parameter(..., prefer_copy=)` | Version-split
`replace_parameter` for the packed conv weight |
| `vllm_ascend/ops/kimi_kda.py` | Same
[vllm#62326](vllm-project/vllm#62326) | Same
version-split for the packed conv weight |
| `vllm_ascend/ops/linear.py` | Same
[vllm#62326](vllm-project/vllm#62326) | Same
version-split for `weight_fp32` |
| `vllm_ascend/ops/triton/v2/spec_decode/prepare_dflash_inputs.py` |
[vllm#58984](vllm-project/vllm#58984) forwards
the DP-synced request count during dummy runs | Accept
`num_reqs_override`, cap `num_reqs` and slice `num_scheduled_tokens` |
| `vllm_ascend/worker/v2/spec_decode/autoregressive/speculator.py` |
[vllm#62784](vllm-project/vllm#62784) adds
`skip_sample` to `_prefill` | Version-split `_prefill`, forward
`skip_sample` on main |
| `vllm_ascend/worker/v2/spec_decode/dflash/speculator.py` |
[vllm#58984](vllm-project/vllm#58984) adds
`num_reqs_override` | Forward `num_reqs_override` through both
`prepare_dflash_inputs` wrappers |
| `vllm_ascend/worker/v2/spec_decode/gemma4/speculator.py` |
[vllm#62784](vllm-project/vllm#62784) adds
`skip_sample` | Accept and forward `skip_sample` |
| `vllm_ascend/worker/v2/spec_decode/rejection_sampler_utils.py` |
[vllm#53987](vllm-project/vllm#53987) adds the
FLy entropy-gated verification mode; upstream also threads the
watermarking kwargs | Accept both kwarg groups, but raise
`NotImplementedError` for FLy and watermarking on NPU |
| `vllm_ascend/worker/worker.py` |
[vllm#52921](vllm-project/vllm#52921) adds the
`get_simple_cpu_offload_num_cpu_blocks` RPC to the worker | Implement it
(main only) via
`_find_simple_cpu_offload_connector().get_aligned_num_cpu_blocks()` |

### Does this PR introduce _any_ user-facing change?

### How was this patch tested?

---

### Checklist

#### Testing

- [ ] **Boundary / edge-case coverage**: I reviewed whether this change
involves
boundary conditions (e.g. empty input, single/zero element, min/max
values,
off-by-one, sequence-length limits, integer overflow). Where applicable,
I
added unit tests covering these edge cases in `tests/ut/` or
`tests/e2e/`.
- [ ] **Regression test**: If this PR fixes a bug, I added a regression
test
  that would fail without the fix.
- [ ] **Error / failure path coverage**: I covered abnormal paths
(exceptions,
timeouts, out-of-range, division by zero) in addition to the happy path.
- [ ] **Meaningful & reliable tests**: New tests assert real behavior
and are
  not written merely to satisfy CI.
- [ ] **Performance impact**: If this PR touches a performance-sensitive
path,
  I attached benchmark results and added performance regression tests.


- vLLM main:
vllm-project/vllm@c0b6f74

---------

Signed-off-by: zhangxinyuehfad <starmoon_zhang@163.com>
Signed-off-by: hfadzxy <starmoon_zhang@163.com>
bantianyue pushed a commit to bantianyue/vllm that referenced this pull request Oct 28, 2026
…he drafts (vllm-project#62784)

Signed-off-by: Nick Hill <nickhill123@gmail.com>
Signed-off-by: zixi-qi <zixi@inferact.ai>
Co-authored-by: Nick Hill <nickhill123@gmail.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: vllm-agent <claw@inferact.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dflash mrv2 Model Runner V2 specific ready ONLY add when PR is ready to merge/full CI is needed scheduler speculative-decoding

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants