Skip to content

chore: bump v0.2.12 - #1048

Merged
zhyncs merged 1 commit into
sgl-project:mainfrom
zhyncs:rel
Aug 12, 2024
Merged

zhyncs merged 1 commit into
sgl-project:mainfrom
zhyncs:rel

Conversation

@zhyncs

@zhyncs zhyncs commented Aug 12, 2024

Copy link
Copy Markdown
Contributor

Thank you for your contribution, we really appreciate it. The following instructions will help improve your pull request and make it easier to receive feedback. If there are any items you don't understand, don't worry. Just submit the pull request and ask the maintainers for help.

Motivation

Please explain the motivation behind this PR and the goal you aim to achieve with it.

Modification

Briefly describe the changes made in this PR.

Checklist

  1. Ensure pre-commit pre-commit run --all-files or other linting tools are used to fix potential lint issues.
  2. Confirm that modifications are covered by complete unit tests. If not, please add more unit tests for correctness.
  3. Modify documentation as needed, such as docstrings or example tutorials.

@zhyncs zhyncs added the wip label Aug 12, 2024
@zhyncs zhyncs self-assigned this Aug 12, 2024
@zhyncs
zhyncs marked this pull request as draft August 12, 2024 06:28
@zhyncs zhyncs removed the wip label Aug 12, 2024
@zhyncs
zhyncs marked this pull request as ready for review August 12, 2024 09:51
@zhyncs
zhyncs merged commit b0ad0c1 into sgl-project:main Aug 12, 2024
@zhyncs
zhyncs deleted the rel branch August 12, 2024 10:59
timethink pushed a commit to timethink/sglang that referenced this pull request Mar 9, 2025
efschu pushed a commit to efschu/htsglang that referenced this pull request Aug 31, 2026
…erted with the architecture

BOOT 15 CRASHED AT 10:59:42, all three schedulers, and the cause is the sgl-project#1046
cut -- reported as mine, not as a pre-existing condition.

    sgl-project#968 LOAD-BACK EXTENT UNREACHABLE for rid=c9d14e69...: PP0 published an
    extent of 4618 token(s) and this rank's load-back yielded only 0

1448 times on one rid, refusing the forwarded schedule on every rank every pass,
until the ring wedged (sgl-project#789 PROXY READINESS TIMEOUT) and the schedulers died.

ROOT: sgl-project#1042's "a hitless match must never clear" was CORRECT while the extent
was consumed A LAP LATER by the delivery row -- the fact had to outlive the
match that made it. sgl-project#1046 moved consumption into the SAME match and I carried
the old rule across unchanged. The extent then outlived its own validity: rid
c9d14e69 kept extent=4618 through a readmit whose match read `host_hit=0`, and
the clamp demanded 4618 from a tree that could serve 0.

THE LESSON IS THE LIFECYCLE LAW ITSELF: a table is valid for ONE architecture.
It must be RE-DERIVED when the consumer moves, never inherited. I built the
table, then broke it by moving the consumer without re-deriving it.

TWO FIXES, both following from the same inversion:

1. A hitless match now CLEARS (`hitless_clear`, was `hitless_noop`). Under local
   consumption the extent is only valid for the match that produced it.

2. `_applied < _lb_extent` is no longer a PPScheduleRefused. That raise existed
   because `_lb_extent` was PP0's PUBLISHED number, so a rank that could not
   reach it would diverge from peers who could. Since sgl-project#1046 the extent is this
   rank's own, so a shortfall means only that this rank's stamp went stale --
   local staleness, not divergence. It now takes what its own tree can serve
   and says so (`sgl-project#1048 EXTENT STALE`), which is uniform because every rank
   re-derives from its own tree. Leaving it a group refusal is what turned a
   stale number into a ring wedge.

ALSO REPORTED: the boot-15 reproducibility run is CONFOUNDED, not negative. Two
cell runs landed on a server that was dying and then dead (deadman CRASH
10:59:47); the repro window's `sgl-project#988 genuine=0` measures the death, not the
mechanism. It is not evidence either way and is not counted as such.

check_1042 updated to pin the INVERTED rule and re-run green; ruff clean apart
from pre-existing E402.
efschu pushed a commit to efschu/htsglang that referenced this pull request Aug 31, 2026
…fork turns on: told prefix vs local

Boot 27 died because two ranks admitted the same pass at different widths
(PP0 extend=4096, PP1 extend=2596; same slot, same fwd_ct, same rids; exactly
one divergent (slot,fwd_ct) pair in the whole boot). The fix form is a real
value fork and BOTH arms already killed a boot:

  per-rank refusal on an uncoverable told value -- boot 15 (sgl-project#1048): PP0
    published extent 4618, a rank yielded 0, 1448 refusals on one rid until
    the ring wedged and the schedulers died. sgl-project#1048's own fix deleted the raise.
  rank-local derivation -- boot 27, above.

So this commit changes NOTHING and only sizes the open quantity: how often does
PP0's published prefix exceed what a peer can cover, and is it concentrated at
flip boundaries?

The row already arrives and is already relayed verbatim (632ba36); sgl-project#1046
removed only its consumer. The receive point therefore stashes the told
prefixes into a dict that NOTHING but the census reads.

IT MUST NEVER WRITE _pp_admission_incoming_effective. That field is the armed
predicate of the clamp in _get_new_batch_prefill_raw; populating it would arm
PP0-published widths together with the refusal that killed boot 15. A separate
dict cannot. The matched check is an AST scan proving the new function writes
only _1058_* attributes, plus a census that the armed predicate still has
exactly its 4 None/{} writers -- py_compile is structurally blind to this
failure class and would have passed either way.

DENOMINATOR LAW BUILT IN, not remembered: five counters, and the ABSENT case
is one of them. A census counting only comparisons would report '0 overshoots'
identically whether PP0 never overshot or no told value ever arrived. The
census prints all five on a fixed cadence, and the per-event line is rate
limited with its occurrence number.

Desk: py_compile green, AST matched check passed, import smoke binds the
method, ruff clean on the added lines (the file's 105 findings are all
pre-existing and untouched). Behaviour: none -- the caller does not read a
return value and the clamp predicate is unchanged.

Boot 28 is a MEASUREMENT boot and may die at the known blocker; the harvest is
this distribution up to and including the death. Analysis:
DESIGN_968_PP0_AUTHORITATIVE_STATIC_HALF.md 5c-CORRECTION.
efschu pushed a commit to efschu/htsglang that referenced this pull request Aug 31, 2026
…our ways it dies are tests

The convergence proof established the one place: get_next_batch_to_run +
admission run as a COPY on every rank (TP proven by py-spy on a live PP1, PP by
scheduler_pp_mixin.py:4402 plus metal #969N ADMIT on PP0 and PP1 in the same
pass), and 14 of 16 rank-divergence blockers are one divergent INPUT into it.
This removes the divergence at the OUTPUT instead of chasing inputs.

WHERE CONGRUENCE IS ACTUALLY LOST, sharpened this session: pp_chunked_local_match
argues the geometry is 'CONGRUENT BY CONSTRUCTION' because every rank advances a
chunked request through the same add_chunked_req sequence. Sound in phase --
and no coverage at a POST-CUTOVER RE-ADMISSION, where prefix_indices is reseeded
from each rank's OWN HiCache hit (schedule_batch.py:1758). Boots 26 and 27 both
died within seconds of a cutover. That is the hole.

THE RULE: told geometry is the DECISION and is rank-uniform; whether a rank
reads its prefix bytes or RECOMPUTES them is EXECUTION and is rank-local. A rank
holding less than it was told does more work; it does not present a different
batch.

NO REFUSAL AND NO VOID EXIST IN THIS MODULE, structurally rather than by
discipline -- both were tried and both killed a boot (boot 15/sgl-project#1048: 1448
refusals on one rid until the ring wedged, and sgl-project#1048's own fix deleted that
raise; sgl-project#995 v1: 175 refusals, dead window). An overshoot is made HARMLESS
instead of impossible, which is also why no coverage feed is needed: the ordered
Arm A wanted a MIN over per-rank coverage facts returned on the lap, and those
never come home -- observed_local has exactly ONE writer, the dataclass default,
because reconcile_pp_admission_decision has 0 call sites and is deliberately
dark. Recompute buys the same uniformity at the standing sgl-project#939 one-chunk price
without lighting that second mechanism.

Absent fact = no adoption, never a local substitute: an older sender, a stand-in
or a pass PP0 did not name is bit-for-bit the old behaviour.

EVIDENCE -- 12 tests, red-first on boot 27 verbatim (told 4094/4096 against
local prefixes 0 / 2596 / 4094 / 13376), and the four danger directions of this
seam as executable assertions. All four mutants anchor-asserted and KILLED:
  1 refusal-without-a-way-onward (boot-15 shape)          -> 7 failed
  2 apply-skipped (the tree's present state, i.e. boot 27) -> 4 failed
  3 per-rank re-derivation of the uniform decision         -> 3 failed
  4 shortfall changes the group-visible geometry           -> 6 failed
ruff clean. Behaviour: none yet -- nothing calls this module.

NEXT SLICE, named so it is not re-derived: producer (PP0 stamps its admitted
(prefix, extend) into the row it already sends -- _pp_admission_last_built_decision,
scheduler.py:10828), carrier (live and relayed verbatim already), consumer (stash
at the receive point beside the sgl-project#1058 observation, promote one lap later), apply
(the re-admission consult, schedule_batch.py:1718-1790). PP0 applies the LAPPED
row like every follower and never its own fresh number -- 632ba36 states that
explicitly and it is what keeps PP0 from being the divergent rank.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants