Repository navigation
atom(pd): every P/D producer reports its first token from the forward that samples it - #3165
PerryZhang01 wants to merge 7 commits into
Conversation
A DeepSeek-V4 producer kept deferred output, so a request's first token reached the host only at its rank's next sampling forward, and the request was released to decode a median 14 s after its output prefill (#2655). Only recurrent-state producers gave deferred output up; now every producer does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Without a refit. The crs005 DPA8 and EP8 prefill laws say their 1P1D prefill-side records ran a producer that deferred its output. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r host laws were fitted on Their host laws were fitted on lone prefill cells, which ran no producer; only their prefill rows were also fitted on 1P1D prefill sides. Design 09 says a 1P1D prefill side ran its held-request decodes until #2655. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…D producer reports its own step Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…wo up after #2655's predicate Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Round 1 pushed 2db8d96. First round: every P/D producer gives up deferred output, the laws are re-keyed, and the docs that described the old rule are corrected. No findings to answer yet. |
| # so the request waits while the rank prefills others (#2655: a median | ||
| # 14 s). That extra decode also makes a recurrent state apply T0 twice. | ||
| # So every producer reports T0 from the forward that samples it. | ||
| self.is_deferred_out = not self.is_pipeline_parallel and not self.is_pd_producer |
There was a problem hiding this comment.
Every producer now reads its own sampled ids, but HostDeviceRecurrence._exit still releases a single-stage output forward at the previous output forward's target end, so a simulated producer, #975's prefill side included, reports its first token one forward early (probe in the verdict). File an issue for the recurrence's wait rules, name it under Left undone, and correct the Found line.
|
REQUEST CHANGES @ 2db8d96: 1 blocking.
Escalated: 56 non-test lines against "a few lines", in the ruling request below; Checked: 2db8d96: GATE_CPU_RC=0, ATOM 10301 passed, EvidenceRevert-red,
Recurrence probe at this head: a A non-deferred producer's reply carries the forward's own ids, so the simulated scheduler releases each request at an exit before its own device end. The real |
|
Needs owner ruling: accept 56 non-test lines against #2655's "a few lines", and say whether its named result must be measured before landing. The predicate is 20 lines with its comment. The rest are 24 law re-key lines, which any hashed
Recommendation: (a), since no test runs a V4 producer on a device. #3165 at 2db8d96: REQUEST CHANGES, 1 blocking (the named result); |
…ce its first token No producer defers its output now, so none decodes for that. The docstring keeps its line count, so the capture test's pinned lines below it hold. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… after the docstring fix The `_verifies_drafts` docstring change moves the atom digest from 68ad8fc6 to 3959e283, the digest of this head and of its clean merge with ed0628a. Each law's re-key clause names the new digest; nothing else changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #2655. Ready for review. The named result waits on #975's 1P1D cell on crsuse2-m2m-v3-005 and -013.
A DeepSeek-V4 P/D producer kept deferred output, so a request's first token reached the host at its rank's next sampling forward, a median 14.4 s after its output prefill in #2493's pd3. Every producer now reports it from the forward that samples it, as recurrent-state ones did.
Dev record
is_deferred_outis off on every producer, whatever its attention family. The test pinning the recurrent-only rule now holds every family off; a new one holds that the output prefill's forward returns its ids.test_capture_real_model.py's pinnedmodel_runner.pylines move up two with the shorter predicate.atomdigest without a refit; their host laws were fitted on lone servers, which ran no producer. Design 09,step_output.py's module doc, ascheduler.pycomment and atest_runner_step_semantics.pydocstring now say every producer reports its own step. atom(pd): a DeepSeek-V4 P/D prefill server holds each request until its rank next samples, a median 14 s after its output prefill #2655 carriesatom-issue; the owner asked on 2026-11-10 that it be developed here.tests/test_spec_deferred_status_queue.py, as importingmodel_runnerprobes the device arch, and the simulated P/D runs need a driver. Red and green ran with Triton's target declared.Named result
Not measured: pd3's one-token decodes (15) and output-prefill-to-first-token p50 (16.5 s) need #975's DeepSeek-V4-Pro 1P1D cell on both MI355X nodes, after this change. On the CPU, a V4 producer's
is_deferred_outreads True at the base and False here.Gates
2db8d968d: GATE_CPU_RC=0; ATOM 10301 passed,tests/compass5974 passed. ruff, black clean.Evidence
Revert-red at 59e9ff5, whose test and
model_runner.py2db8d96 keeps,atom/model_engine/model_runner.pyreinstated whole from f18b821,tests/test_spec_deferred_status_queue.pyrun inperzhang_gate(no driver) with Triton's target declared gfx950 throughatom.compass.capture.driverless._declare_arch:model_runner.pytest_every_producer_gives_up_deferred_output[v4],[mla],[mha]:assert True is Falseonis_deferred_out;test_a_producer_reports_t0_from_the_forward_that_samples_it: the deferred branch'ssend_to_cpu_asyncraisesAttributeErroronsync_event=NoneCost against the brief's few lines,
git diff --numstatfrom f18b821:model_runner.py20 (one statement replaces two, the rest its comment),scheduler.py5,step_output.py2, design 09 5, the re-keyed laws 24; tests 74.The re-key's digest is
host_key_of's at 2db8d96,68ad8fc6, which every law's host key now names.Generated with Claude Code