Conversation
|
Documentation preview: https://vllm--45635.org.readthedocs.build/en/45635/ |
dbdecce to
237d2ec
Compare
|
This pull request has merge conflicts that must be resolved before it can be |
|
This pull request has merge conflicts that must be resolved before it can be |
|
/ci retry |
|
✅ Triggered Buildkite CI #87737 for commit |
|
/ci run |
|
✅ Triggered Buildkite CI #87777 for commit |
|
@aoshen02 as currently written there's a deadlock when using the uniproc executor (which is the reason for the CI failures) Suggested fix from K3: Make the worker connector tolerate step N's output being processed after step N+1's metadata, which is the actual ordering under async scheduling:
|
Thanks, working on it. |
|
This pull request has merge conflicts that must be resolved before it can be |
Resolve overlapping AuxOutput, Engram and HiSparse configuration additions; retain upstream hybrid DCP validation changes. Co-authored-by: OpenAI Codex <noreply@openai.com> Signed-off-by: aoshen02 <aoshen@inferact.ai>
|
Hi @xhx1022, the pre-commit checks have failed. Please run: uv pip install pre-commit>=4.5.1
pre-commit install
pre-commit run --all-filesThen, commit the changes and push to your branch. For future commits, |
Apply per-step metadata on the ordered output path, including no-forward steps, instead of making execution wait for output consumption. Preserve asynchronous copies and serialize shutdown with active output processing. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: aoshen02 <aoshen@inferact.ai>
|
/ci run |
|
✅ Triggered Buildkite CI #88715 for commit |
Restore the previously reviewed finish-once implementation. Let the next execution step or the output consumer complete pending auxiliary output once, without extending the V2 execute_model return type. Co-authored-by: Codex Signed-off-by: aoshen02 <aoshen@inferact.ai>
|
/ci run |
|
This pull request has merge conflicts that must be resolved before it can be |
|
✅ Triggered Buildkite CI #88861 for commit |
|
@aoshen02 I don't think the latest changes are the right approach either. I can have a go at refactoring. |
Revert fbe375b and 0a0b738 together, restoring the pre-fix implementation. The ordered-output alternative will be reviewed in a separate draft PR against r3_offload; the original lifecycle issue remains until a fix is accepted. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: aoshen02 <aoshen@inferact.ai>
Sure. |
Keep the AuxOutput routing path, adopt the scale-out CLI flag while retaining MRV2, and port the new prompt-end boundary test to AuxOutput. Do not restore either reverted lifecycle fix. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: aoshen02 <aoshen@inferact.ai>
|
This pull request has merge conflicts that must be resolved before it can be |
|
@njhill Hi Nick, could you take a look at xhx1022#14? I think it's a simple way to solve the race problem. The tradeoff is that the copy wait and CPU assembly now sit on the execution critical path. |
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: aoshen02 <aoshen@inferact.ai>
AuxOutput Connector: block-keyed storage for routed-expert outputs
Summary
This PR introduces the first AuxOutput Connector implementation for vLLM.
The first supported auxiliary output is routed-expert output (R3): the expert IDs selected for
every token executed by an MoE model.
R3 cannot remain a request-local GPU buffer when prefix caching and async
scheduling are enabled:
The connector stores immutable R3 blocks using KV-compatible block hashes. KV
and R3 for the same prefix can therefore be reused together. This PR provides a
bounded local SHM backend; distributed storage and more auxiliary output types are
follow-ups.
Why an AuxOutput Connector?
The model capture hook only obtains a tensor from the current forward pass. A
separate lifecycle layer must decide:
These responsibilities also apply to future DSA and logprobs auxiliary outputs. The
connector keeps them out of the model runner and gives storage backends one
common object lifecycle. It is not a second KV Connector or a generic Scheduler
sidecar.
Architecture
The Scheduler connector owns logical progress and hashes, not payloads. The
Worker connector owns accepted R3 rows and publication.
BlockObjectStoreowns opaqueimmutable blocks and retention, but knows nothing about tokens or speculative
decoding.
Auxiliary output types
An execution auxiliary output is an auxiliary model output that is aligned to a stable
logical coordinate and may need to outlive the worker step that produced it.
Prefix-block auxiliary outputs are content-addressed and reusable with a matching
prefix. Request-only auxiliary outputs use the same storage contract but do not
participate in prefix hits. Reward values, tool results, finish reasons, and
Scheduler status remain normal request/control-plane metadata.
Current PR scope
This PR implements:
It does not implement Mooncake, public auxiliary output keys, additional auxiliary output
fields, PD disaggregation, or new parallel topologies.
When disabled, no auxiliary output capture buffer, Store, per-step metadata, or R3 copy
is created on the normal serving path.
The existing
--enable-return-routed-expertsflag androuted_expertsresponsefield are unchanged. The new optional configuration is exposed as
--aux-output-config(AuxOutputConfigin Python).Follow-ups
The main planned work is:
enabling them.
Validation
Naming-update validation: 96 passed, 1 skipped across configuration, store,
capture, Scheduler, output, and Ray tests. An AST comparison verified that all
24 renamed files preserve the original logic, allowing renamed identifiers,
messages, and sorted imports. Additional smoke checks passed for the existing
R3 flag, the new JSON/Python configuration, compilation hashes, serialization,
object keys, and R3 bytes. The latest naming-only update was also exercised on GB200; results and
limitations are below.
VLLM_TARGET_DEVICE=cpu .venv/bin/python -m pytest -q \ tests/config/test_aux_output_config.py \ tests/distributed/aux_output_connector/test_store.py \ tests/model_executor/test_routed_experts_capture.py \ tests/v1/executor/test_ray_utils.py tests/v1/core/test_scheduler.py \ tests/v1/core/test_async_scheduler.py tests/v1/engine/test_output_processor.py \ -k 'aux_output or routed_experts or pending_output or store or worker or detach_zero_copy' pre-commit runGB200 rename A/B (2026-09-08)
Compared
85f100032e(before rename) withf99d53b521(after rename) on thesame two GB200 nodes (8 GPUs), using the locally cached DeepSeek-V4-Flash-Base
FP8 weights. Both arms enable R3, MRV2, MP, TP1/DP8/EP8, async scheduling and
prefix caching. They use identical native libraries/dependencies; Python source
injection was verified by per-file SHA checks.
Workload: 64 concurrent requests, each with 262,144 input tokens and one output
token; synthetic token IDs, with output constrained to token 42. GPU memory
utilization is 0.90, max batched tokens 16,384, block size 256, and batch-invariant
mode is off. This is a serving/R3 regression test, not a model-quality evaluation.
Throughput changed by −0.21% in this single A/B: no obvious regression, not a
statistical significance claim. Startup and warmup are excluded. Both arms still
reported the same first-long-request
CombineTopkSwaIndicesKernel.kernelJITwarning, so this is not a strictly all-kernels-warm measurement.
Correctness checks:
64K-prompt/1-decode requests per version. The latter exercises multi-step
chunked prefill. All requests' reused-prefix R3 SHA hashes match exactly:
768 rows/request for the short case and 65,280 rows/request for the long case.
Limitation: long-context full-output bitwise equivalence did not pass. None
of the 64 full 256K R3 hashes matched across the two server runs. In the saved
request-0 sample, differences begin at row index 2051 and affect 55.38% of
elements. The same candidate version also differs when comparing the identical
first 64K input prefix in 256K versus 64K cold requests (first difference at
2051; 46.44% of elements). Recomputed decode R3 can differ between cold/hot runs
as well, already before the rename. These observations do not establish the
underlying cause or prove long-output equivalence; they must not be presented
as a full R3 correctness pass.
This run validates the response structure, exact cached-block reuse and short
cross-version outputs. It does not add new forced-preemption, speculative
decoding or free-generation quality coverage. Slurm job
24176completed withexit code 0; test containers and node allocations were released.
Development validation covers focused unit tests, async scheduling, forced
preemption, chunked prefill, speculative rejection, cold/hot prefix reuse,
streaming aggregation, SHM capacity/LRU behavior, pre-commit, and GB200/H200
throughput experiments reported in the PR discussion.
The latest update also moves R3 GPU-to-CPU transfer onto the existing async
output copy stream, avoiding a synchronous copy on the model execution critical
path.
AI assistance was used for implementation, testing, performance experiments,
and review. The submitting human reviewed the accepted changes and validation.