Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 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
b799606
E0.3: keep the GSM8K task inputs under data/ (inputs, not run logs)
chowhsu Oct 21, 2026
1a3014f
E0.3: pass the task file as an explicit local path
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/s26_e03/gsm8k-tasks256.jsonl

Large diffs are not rendered by default.

512 changes: 512 additions & 0 deletions data/s26_e03/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"
}
Loading
Loading