Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
5a01732
tools/eval: add efficiency evaluation (bare vs yeto, verl and Miles)
chowhsu Oct 20, 2026
8358c1b
syncer: pipeline policy-sweep fragments and async per-round checkpoints
chowhsu Oct 20, 2026
261ba2e
tools/eval: bare Miles trains with unfused attention (match yeto gene…
chowhsu Oct 20, 2026
eb9e229
syncer: bf16 sweep pushes and sweep-aligned checkpoint intervals
chowhsu Oct 20, 2026
c3c9d09
tools/eval: yeto+verl async arm passes the staleness-2 TIS algorithm …
chowhsu Oct 20, 2026
1a783d0
syncer: int8 sweep pushes, bf16 downlink deltas, sync/train overlap
chowhsu Oct 20, 2026
ce3822d
E6: quantized rollout tiers with an FFN/routed-expert scope rule
chowhsu Oct 20, 2026
20f603e
E6: FP8 card allowlist from the GPU spec; keep tier-0 argv golden
chowhsu Oct 20, 2026
63dc064
tools/eval: bare verl arms run the unpatched fork; async uses merged …
chowhsu Oct 20, 2026
8af78fa
overlap: keep rollout policy age 0, relabel rebased cuts, push whole …
chowhsu Oct 20, 2026
6b74178
E6: engine sampler tier settings, dense expert count, CPU proofs
chowhsu Oct 20, 2026
a215af7
E6: load Miles process_utils from its file in the env test
chowhsu Oct 20, 2026
052c31e
tools/eval: parse bare verl fully_async rows by training step; rates …
chowhsu Oct 20, 2026
c9245e5
tools/eval: bare Miles arms do not shuffle prompts (yeto's Miles argv…
chowhsu Oct 20, 2026
73442ad
verl adapter: fully_async keeps NCCL host buffers on /dev/shm in ever…
chowhsu Oct 20, 2026
0122f4e
tools/eval: read the yeto+Miles launcher exit code into the parsed run
chowhsu Oct 20, 2026
152374b
test: overlap island with bf16 downlink deltas against the real syncer
chowhsu Oct 20, 2026
e0f833d
miles adapter: opt-in gradient-accumulation fusion; generic recipe tr…
chowhsu Oct 20, 2026
6a4263e
tools/eval: yeto+Miles arm takes the bare Miles recipe settings
chowhsu Oct 20, 2026
ff893bc
tools/eval: read only the run's own tapes (skip the repo copy and the…
chowhsu Oct 20, 2026
ba17953
tools/eval: verl fully_async generation time from the rollouter, else…
chowhsu Oct 20, 2026
a4b1104
eff eval: final round cut only for yeto+Miles; verl async generation …
chowhsu Oct 21, 2026
77ce9cc
verl: hash the LoRA on the trainer for the single-island publish fast…
chowhsu Oct 21, 2026
74016eb
round cut: write before the trainer offloads; commit the store in the…
chowhsu Oct 21, 2026
3b00fe5
fully_async cut: record untrained prompts without stopping the worker
chowhsu Oct 21, 2026
84d43ce
golden: regenerate decoupling samples for the explicit Miles dropout 0.0
chowhsu Oct 21, 2026
36eb805
driver: time the rollout offload after generation as its own phase
chowhsu Oct 21, 2026
dfe8b91
eff eval: --checkpoint final|every-round for the yeto+Miles arm
chowhsu Oct 21, 2026
bc8f53b
syncer: send each fragment's FINAL version as an exact FULL broadcast
chowhsu Oct 21, 2026
8ef1018
round cut: write the trainer shards in the background for periodic cuts
chowhsu Oct 21, 2026
de275ef
round cut: skip a periodic cut while the previous commit runs; time t…
chowhsu Oct 21, 2026
77b460c
cut digests: hash tensor buffers without a bytes copy
chowhsu Oct 21, 2026
86d8872
round cut: a periodic cut does not wait for the store commit it starts
chowhsu Oct 21, 2026
0f615ab
rollout metadata hook: time its steps (E1 diagnosis)
chowhsu Oct 21, 2026
427d142
fully_async: estimate the cross-version IS truncation off the critica…
chowhsu Oct 21, 2026
4015cc5
test: the fully_async round report fake takes build_metadata's new ke…
chowhsu Oct 21, 2026
1502e7d
round cuts: commit the deferred cut fully off the critical path
chowhsu Oct 21, 2026
ae82993
driver: take the terminal load probe off the round's critical path
chowhsu Oct 21, 2026
31a951a
round cuts: collect a skipped prepared cut's writer at the next cut
chowhsu Oct 21, 2026
0a11aa1
round cuts: do not wake an offloaded trainer for a declined periodic cut
chowhsu Oct 21, 2026
f19a055
eval: give the yeto+Miles arm the bare arms' container resources
chowhsu Oct 21, 2026
4854dda
E6: fixes from the H100 gate runs (fused ignore aliases, token scorin…
chowhsu Oct 21, 2026
ffe86d0
E6: refuse tier 1 on verl, set verl max_model_len, native-FP8 gate pr…
chowhsu Oct 21, 2026
19e595a
round cuts: sync a deferred cut's state dir as it was at the cut
chowhsu Oct 21, 2026
d9a2703
E6: pin the FP8-fixed ports image; tier 1 trainer FP8 source (Miles n…
chowhsu Oct 21, 2026
7f100f4
E6: Miles RL drivers for the tier groups (Modal H100!)
chowhsu Oct 21, 2026
8d1df81
E6: full-parameter pair needs a fixed-partition sampler island
chowhsu Oct 21, 2026
e3da116
E6: Dockerfile and tests follow the new image pins; neutral flag help
chowhsu Oct 21, 2026
2011906
E6: pair islands are 2xH100 each (fixed partition applies to every is…
chowhsu Oct 21, 2026
aa3b97c
E6: tier 2 also runs as one launch per role (--rl-sample-role); pair …
chowhsu Oct 21, 2026
d7c79be
E6: per-round parser of the Miles RL runs
chowhsu Oct 21, 2026
3dcbec8
wan: per-stream stall timeout, rate-aware chunk striping, sync diagno…
chowhsu Oct 21, 2026
be553cf
Modal store: no reload while a writer holds uncommitted files
chowhsu Oct 21, 2026
beaf4e0
E6: pair trainer keeps the Adam state on the host (OOM on one H100)
chowhsu Oct 21, 2026
8154509
round cuts: copy a background cut's state on the device first
chowhsu Oct 21, 2026
13d53ab
publish fast path: stage the digest's tensors with one GPU wait
chowhsu Oct 21, 2026
19f2648
rollout metadata hook: read each sink value once per hook run
chowhsu Oct 21, 2026
4a1c245
eval: tell an NVIDIA A10 from an A10G
chowhsu Oct 21, 2026
1fe2c76
Modal store: the write guard is a container-wide flock
chowhsu Oct 21, 2026
1fde82f
test: compare staged digests without their timing fields
chowhsu Oct 21, 2026
d583c59
round cuts: keep a sleeping trainer's cut on the host path
chowhsu Oct 21, 2026
f4cd14e
E6: tier 1 on Miles defaults to the trainer FP8 source
chowhsu Oct 21, 2026
bce94af
RL: full parameters on one no-sync island with dedicated engine cards
chowhsu Oct 21, 2026
8fe48c9
E6: pin the ports image with the SGLang compressed-tensors FP8 reload
chowhsu Oct 21, 2026
2f3d79c
round cuts: serialize and hash background shards in a writer process
chowhsu Oct 21, 2026
f74ac99
E6: neutral fp8-source help; full-parameter dedicated-engine group is…
chowhsu Oct 21, 2026
27f66dd
launcher: pin a Modal island to one GPU model with --modal-gpu-name
chowhsu Oct 21, 2026
d8d159c
publish fastpath: hash the policy while a colocated trainer offloads
chowhsu Oct 21, 2026
dfa4a58
E6: full-parameter dedicated-engine group runs without round cuts
chowhsu Oct 21, 2026
2509fde
wan: replay INIT after a mid-init redial, link probe with container r…
chowhsu Oct 21, 2026
156b5ec
Merge s26-e01-effeval into E0.3 ablation branch
chowhsu Oct 21, 2026
ca78ca0
Merge s26-e3-sync into E0.3 ablation branch
chowhsu Oct 21, 2026
755375e
Merge s26-e6-quant into E0.3 ablation branch
chowhsu Oct 21, 2026
2e1d8d3
E0.3: bias-stacking ablation drivers (Qwen3-0.6B, Miles, layers L0-L3)
chowhsu Oct 21, 2026
a78e73a
E0.3: head driver plan line without STEPS
chowhsu Oct 21, 2026
1c0df83
eval: opt-in trainer step profile (--rl-profile-trainer)
chowhsu Oct 21, 2026
91adbef
E0.3: per-round parser; multi-island layers replace slow containers w…
chowhsu Oct 21, 2026
fe5e612
round cuts: stage a background cut's device copies on the host at the…
chowhsu Oct 21, 2026
3c9ee84
E0.3 v2: 256 samples per round, no checkpoint store so fully_async ke…
chowhsu Oct 21, 2026
40cf73a
Revert "round cuts: stage a background cut's device copies on the hos…
chowhsu Oct 21, 2026
92cb83c
E0.3: parser groups v2 run ids by layer
chowhsu Oct 21, 2026
74c2f6f
round cuts: hand a background cut to its writer in one shared buffer
chowhsu Oct 21, 2026
9079c7e
Merge s26-e1-overhead into E0.3 ablation branch
chowhsu Oct 21, 2026
b77491c
eval: sample the island driver per phase under --rl-profile-trainer
chowhsu Oct 21, 2026
92f33bc
eval: sample the thread that drives the phases, not the enabling one
chowhsu Oct 21, 2026
0dec43d
eval: phase profile labels carry the caller chain
chowhsu Oct 21, 2026
2ec20f7
WIP: verify publications only on cut, first and every-K rounds
chowhsu Oct 21, 2026
b664b9d
round cuts: device-copy capture for a trainer that sleeps after the cut
chowhsu Oct 21, 2026
e79520d
round cuts: default interval 4; verify publications at that interval
chowhsu Oct 21, 2026
096bdf6
driver: mark only unverified publications in the publication event
chowhsu Oct 21, 2026
74e6904
Merge branch 's26-e1-overhead' into s26-e2-async
chowhsu Oct 21, 2026
8778950
WIP: S26 E2 sweep driver, --rl-async-buffer-rounds, adaptive TIS
chowhsu Oct 21, 2026
fd6ff26
RL: --rl-async-buffer-rounds and opt-in adaptive TIS (AIS) correction
chowhsu Oct 21, 2026
09582a7
probes: S26 E2 driver buffer override and staleness parsing
chowhsu Oct 21, 2026
e22ed34
probes: S26 E2 reuses the E0.3 task file
chowhsu Oct 21, 2026
117bd99
probes: keep the S26 GSM8K task files under data/ (inputs, not run logs)
chowhsu Oct 21, 2026
0f7f7a8
tests: do not leak the phase sampler from the --rl-profile-trainer sw…
chowhsu Oct 21, 2026
ad67598
Revert "tests: do not leak the phase sampler from the --rl-profile-tr…
chowhsu Oct 21, 2026
e5b5ef0
test: keep the phase profiler off after the profile tests
chowhsu Oct 21, 2026
29b80e9
RL: fully_async buffer depth defaults to the policy-age limit
chowhsu Oct 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
256 changes: 256 additions & 0 deletions data/gsm8k/gsm8k-tasks256.jsonl

Large diffs are not rendered by default.

512 changes: 512 additions & 0 deletions data/gsm8k/gsm8k-tasks512.jsonl

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions docker/miles-ports/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@
FROM docker.io/radixark/miles@sha256:4d69750720eb1a4b99976a3fed45ed018e1fc4fff3d240667fa17d258dfc6e0c

ARG MILES_REPOSITORY=https://github.com/michaellchung/miles
ARG MILES_COMMIT=44d41efd0a0428cb12b4ee34422de6f5e1ccb9d9
ARG MILES_COMMIT=9462de532f747cf688e090bbaf6b24f80e378fe8
ARG SGLANG_REPOSITORY=https://github.com/michaellchung/sglang
ARG SGLANG_COMMIT=2fa880182eefdb31e64d8ea70317be27f9f32121
# setuptools-scm version of SGLANG_COMMIT (describe v0.5.20-69-g4e4148f1b);
ARG SGLANG_COMMIT=754605964776322226a073763a6f636aa8233932
# setuptools-scm version of SGLANG_COMMIT (describe v0.5.20-72-g754605964);
# pinned because the one-commit clone has no tags to describe.
ARG SGLANG_VERSION=0.5.21.dev70+g2fa8801
ARG SGLANG_VERSION=0.5.21.dev72+g7546059

# Miles fork -> /root/miles (same path the base installed editable).
RUN rm -rf /root/miles \
Expand Down
3 changes: 2 additions & 1 deletion docker/miles-ports/make_layer.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@ def main() -> None:
p.add_argument("--out", type=Path, required=True)
a = p.parse_args()

check_pure_python(a.miles_src, a.miles_base_commit, a.miles_commit, ("miles/", "miles_plugins/"))
# tools/: stand-alone scripts run from the checkout (e.g. convert_hf_to_fp8.py), nothing built
check_pure_python(a.miles_src, a.miles_base_commit, a.miles_commit, ("miles/", "miles_plugins/", "tools/"))
check_pure_python(a.sglang_src, a.sglang_base_commit, a.sglang_commit, ("python/sglang/",))

entries: dict[str, tuple[str, bytes | None, int, str | None]] = {}
Expand Down
33 changes: 32 additions & 1 deletion docs/PROTOCOL.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ or allocation overflows are errors rather than panics.

| type | name | direction | payload |
|---:|---|---|---|
| 1 | HELLO | learner → syncer | protocol_version:u16 (=4), learner_id:u32, connection_generation:u64, dtype:u8 (1=f32, 2=bf16, 3=q4), num_fragments:u32, per-fragment layout, layout_fingerprint:[u8;32], session_contract_hash:[u8;32], optional syncer_profile_hash:[u8;32], num_streams:u16, optional compat_group trailer (`b"YCG1"`, u32 length, 1–64 bytes utf-8) |
| 1 | HELLO | learner → syncer | protocol_version:u16 (=4), learner_id:u32, connection_generation:u64, dtype:u8 (1=f32, 2=bf16, 3=q4, 4=f32 with bf16 pushes, 5=f32 with int8 pushes; flag 0x80 = bf16 downlink deltas), num_fragments:u32, per-fragment layout, layout_fingerprint:[u8;32], session_contract_hash:[u8;32], optional syncer_profile_hash:[u8;32], num_streams:u16, optional compat_group trailer (`b"YCG1"`, u32 length, 1–64 bytes utf-8) |
| 2 | INIT_PARAMS | learner → syncer | fragment_id:u32, full tensor bytes; only learner 0 may initialize |
| 3 | PULL_REQ | syncer → learner | fragment_id:u32, global_step:u64, round_attempt:u32 |
| 4 | PUSH_FRAGMENT | learner → syncer | learner_id:u32, fragment_id:u32, global_step:u64, round_attempt:u32, base_version:u64, local_step:u64, c_steps:u32, c_tokens:u64, base-relative learner-delta bytes |
Expand Down Expand Up @@ -223,6 +223,37 @@ The coordinator is one sequential scheduler actor. Pipelined rounds target
distinct fragments, and merge + version update + broadcast for a completion
is serialized. No two completions mutate one fragment concurrently.

## bf16 pushes over an f32 session (dtype 4)

Dtype 4 keeps INIT, BCAST and FINAL exact f32 and sends only PUSH deltas as
bf16 (round-to-nearest-even). The syncer decodes and negates them like dtype 2
and keeps f32 masters and momentum. The full-parameter policy sweep accepts
dtype 1 or 4 (S26 E3, `--rl-sync-push-dtype bf16`).

## int8 pushes over an f32 session (dtype 5)

Dtype 5 sends PUSH deltas as block-scaled int8: u32 block size B
(32..1048576), then per block of B values (the last block may be shorter) an
f32 scale (block absmax / 127) and one i8 per value (`-128` is invalid).
A value decodes to `q * scale`, so its error is at most absmax / 254. The
learner picks B (launcher `--rl-sync-push-int8-block`, default 128); it is
bound into the role-stream session contract. INIT, BCAST and FINAL stay f32.

## bf16 downlink deltas (dtype flag 0x80)

On an f32-bulk session (dtype 1, 4 or 5) the flag 0x80 changes BCAST_FRAGMENT
to `fragment_id:u32, version:u64, kind:u8, base_version:u64,
anchor_sha256:[u8;32]`, then the tensor: kind 0 (FULL) carries f32 values,
kind 1 (DELTA) carries `bf16(theta - anchor)`. Syncer and learner hold the
same f32 anchor per fragment: FULL sets it, DELTA adds the decoded delta in
f32; the digest is checked after every update. Every N-th version of a
fragment is FULL (`--bcast-delta-full-every N`, N >= 2; the syncer refuses a
flagged session without it and the reverse). Initial and reconnect re-sends
are always FULL with the shared anchor. A learner with a missing or wrong
anchor drops its connection, and the reconnect re-send restores it. The
syncer's masters, momentum, checkpoints and FINAL are unchanged and exact;
anchors are not checkpointed, so a resumed syncer starts with FULL.

## Q4 pushes

Q4 uses the same learner-delta semantics. INIT and BCAST stay bf16; PUSH is
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"tag": "ghcr.io/michaellchung/yeto-miles-ports:9462de5-10afe11",
"digest": "sha256:6e0a97d203cdd062c9f2fa35b6b834575cf05ee1f71fb45e921d8803b620f072",
"layer_tar_sha256": "08874741ace9733a576a2fa2b87736a6ebc46c8896806a3e025768b84e27e4ed",
"base": "docker.io/radixark/miles@sha256:4d69750720eb1a4b99976a3fed45ed018e1fc4fff3d240667fa17d258dfc6e0c",
"base_index": "sha256:90940828dcd4d54fd907ff668b43537cbd94778047580e4160d6560af548b74d",
"miles_commit": "9462de532f747cf688e090bbaf6b24f80e378fe8",
"sglang_commit": "10afe11a7ef2b53cedd9895cc4450474d85108b9",
"sglang_version": "0.5.21.dev71+g10afe11",
"peft_version": "0.20.0",
"peft_wheel_sha256": "0fbba16ffebfad3de96e06f2da6860fd860292324b85b6141909fa1e26ea9233"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"base": {
"index_digest": "sha256:90940828dcd4d54fd907ff668b43537cbd94778047580e4160d6560af548b74d",
"manifest_digest": "sha256:4d69750720eb1a4b99976a3fed45ed018e1fc4fff3d240667fa17d258dfc6e0c",
"miles_commit": "9e4260de047a704208535c0e90c531929879ab40",
"platform": "linux/amd64",
"repository": "docker.io/radixark/miles",
"sglang_commit": "e5bba1f9c433da5352e521a8bb826bab960e7836"
},
"builder": "scripts/build_miles_ports_image.sh (crane append); docker/miles-ports/Dockerfile equivalent",
"image": "ghcr.io/michaellchung/yeto-miles-ports",
"megatron_bridge": {
"commit": "8cd3466d14d2337c8492827b3712482c2b3e4866",
"patches": [
"lazy-modelopt (docker/miles-ports/megatron_bridge_init.py)"
]
},
"megatron_lm": {
"commit": "a84b105473eca9c9c6e49dbf1c8aa460c5cf796e",
"patches": [
"lazy-modelopt (docker/miles-ports/megatron_lm_lazy_modelopt.patch)"
],
"path": "/root/Megatron-LM",
"repository": "https://github.com/radixark/Megatron-LM"
},
"miles": {
"commit": "9462de532f747cf688e090bbaf6b24f80e378fe8",
"install": "base's editable install (pip install -e /root/miles --no-deps) kept (same path); /root is on the base's sys.path, so without PYTHONPATH import miles is a namespace package over the /root/miles checkout -- yeto runs with PYTHONPATH=$HOME/miles (regular package)",
"path": "/root/miles",
"repository": "https://github.com/michaellchung/miles",
"upstream_commit": "9e4260de047a704208535c0e90c531929879ab40"
},
"peft": {
"install": "wheel unpacked into the base's site-packages (pip install --no-deps equivalent)",
"version": "0.20.0",
"wheel": "peft-0.20.0-py3-none-any.whl",
"wheel_sha256": "0fbba16ffebfad3de96e06f2da6860fd860292324b85b6141909fa1e26ea9233"
},
"pure_python_overlay": true,
"schema": 1,
"sglang": {
"commit": "10afe11a7ef2b53cedd9895cc4450474d85108b9",
"install": "pip install -e /sgl-workspace/sglang/python[all] --no-deps (base's editable install, same path)",
"path": "/sgl-workspace/sglang",
"repository": "https://github.com/michaellchung/sglang",
"upstream_commit": "571212b636baca45e10fa3b4da11a289123f3235",
"version": "0.5.21.dev71+g10afe11"
},
"tag": "9462de5-10afe11"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"tag": "ghcr.io/michaellchung/yeto-miles-ports:9462de5-7546059",
"digest": "sha256:37acaca3e1eee8adc61bf3edbbd706ece36e40e9b7fd5463e54f56e3f4cc9b2b",
"layer_tar_sha256": "4eee8887e4d85fe79fad9da706bbcef5b734d0deb74206427651a9fd8cf270b4",
"base": "docker.io/radixark/miles@sha256:4d69750720eb1a4b99976a3fed45ed018e1fc4fff3d240667fa17d258dfc6e0c",
"base_index": "sha256:90940828dcd4d54fd907ff668b43537cbd94778047580e4160d6560af548b74d",
"miles_commit": "9462de532f747cf688e090bbaf6b24f80e378fe8",
"sglang_commit": "754605964776322226a073763a6f636aa8233932",
"sglang_version": "0.5.21.dev72+g7546059",
"peft_version": "0.20.0",
"peft_wheel_sha256": "0fbba16ffebfad3de96e06f2da6860fd860292324b85b6141909fa1e26ea9233"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"base": {
"index_digest": "sha256:90940828dcd4d54fd907ff668b43537cbd94778047580e4160d6560af548b74d",
"manifest_digest": "sha256:4d69750720eb1a4b99976a3fed45ed018e1fc4fff3d240667fa17d258dfc6e0c",
"miles_commit": "9e4260de047a704208535c0e90c531929879ab40",
"platform": "linux/amd64",
"repository": "docker.io/radixark/miles",
"sglang_commit": "e5bba1f9c433da5352e521a8bb826bab960e7836"
},
"builder": "scripts/build_miles_ports_image.sh (crane append); docker/miles-ports/Dockerfile equivalent",
"image": "ghcr.io/michaellchung/yeto-miles-ports",
"megatron_bridge": {
"commit": "8cd3466d14d2337c8492827b3712482c2b3e4866",
"patches": [
"lazy-modelopt (docker/miles-ports/megatron_bridge_init.py)"
]
},
"megatron_lm": {
"commit": "a84b105473eca9c9c6e49dbf1c8aa460c5cf796e",
"patches": [
"lazy-modelopt (docker/miles-ports/megatron_lm_lazy_modelopt.patch)"
],
"path": "/root/Megatron-LM",
"repository": "https://github.com/radixark/Megatron-LM"
},
"miles": {
"commit": "9462de532f747cf688e090bbaf6b24f80e378fe8",
"install": "base's editable install (pip install -e /root/miles --no-deps) kept (same path); /root is on the base's sys.path, so without PYTHONPATH import miles is a namespace package over the /root/miles checkout -- yeto runs with PYTHONPATH=$HOME/miles (regular package)",
"path": "/root/miles",
"repository": "https://github.com/michaellchung/miles",
"upstream_commit": "9e4260de047a704208535c0e90c531929879ab40"
},
"peft": {
"install": "wheel unpacked into the base's site-packages (pip install --no-deps equivalent)",
"version": "0.20.0",
"wheel": "peft-0.20.0-py3-none-any.whl",
"wheel_sha256": "0fbba16ffebfad3de96e06f2da6860fd860292324b85b6141909fa1e26ea9233"
},
"pure_python_overlay": true,
"schema": 1,
"sglang": {
"commit": "754605964776322226a073763a6f636aa8233932",
"install": "pip install -e /sgl-workspace/sglang/python[all] --no-deps (base's editable install, same path)",
"path": "/sgl-workspace/sglang",
"repository": "https://github.com/michaellchung/sglang",
"upstream_commit": "571212b636baca45e10fa3b4da11a289123f3235",
"version": "0.5.21.dev72+g7546059"
},
"tag": "9462de5-7546059"
}
1 change: 1 addition & 0 deletions openspec/changes/rl-resume-from-checkpoint/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ Modal 文档:退出处理函数有 30 秒宽限,被抢占时也调用;GPU
- **单岛切点**(沿用格式):adapter、优化器、学习率调度器、随机数、iteration、consumed_samples、pointer(下一轮号、策略版本、策略哈希、启动序号)+ 新增 `run_fingerprint`(算法、模型、LoRA 形状、并行布局、学习率配置、数据集指纹与洗牌种子)与 `lr_at_next_round`(下一轮应使用的学习率)与 `consumed_prompt_ids_digest`(已用题号集合的摘要,详细列表放账本)。
- **多岛**:每个岛存自己的切点(同上,路径 `<store>/islands/<岛名>/`);syncer 检查点同步到 `<store>/syncer/`;切点 pointer 多记 `outer_version`。
- **频率**:`--rl-cut-every N`(默认:0.6B 为 1,FN 为 2);最后一轮、收到"我方停机"时总是存一次。
- **Default since 2026-10-21 (E1)**: `--rl-cut-every` defaults to 4; publication checks (policy hash, engine read-back) run on the first publication and every 4th round; `--rl-verify-every-round` restores per-round checks. See the requirement "Round-cut interval and publication checks" in specs/rl-resume-from-checkpoint/spec.md.
- **保留**:`--rl-cut-keep K`(默认 2);新切点 MANIFEST 落盘并提交后才删旧的。
- **目录**:`<store>/<运行名>/cuts/<轮号>/{shards…, manifest.json, MANIFEST.sha256}` + `<store>/<运行名>/LATEST`(最后写,指向最近完整切点)。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,10 @@ launcher SHALL 接受 `--rl-checkpoint-store modal-volume://<卷名>[/前缀]`
#### Scenario: 续训后的 tape
- **WHEN** 第二次启动重跑了第一次未进切点的第 4 轮
- **THEN** 第一次的第 4 轮记录仍在,`rl_resume.discarded_rounds` 含 4

### Requirement: Round-cut interval and publication checks (E1, 2026-10-21)
The product default round-cut interval SHALL be 4 rounds (`--rl-cut-every 4`; `--rl-cut-every 1` cuts every round), plus the last round and our own stop. A publication SHALL hash the policy and read the engine weight checksums back on the first publication, on every round whose number is a multiple of the cut interval (which includes every round that keeps a round cut), and on every round with `--rl-verify-every-round`. Every other publication SHALL still check that the trainer holds the published policy (trainer weights version) and SHALL be recorded with `sync/publication_verified: false` (verified publications carry no such field). A publication that was not verified MUST NOT be committed as a round cut.

#### Scenario: an unverified round at a cut
- **WHEN** a cut is due at a safe point whose published policy was not verified
- **THEN** the cut is refused ("not verified") and the previous pointer stays the committed one
Loading
Loading