clean up fully async example and mv to examples/infra_features - #2485
Merged
Conversation
The fully-async example is an infra feature, so it belongs next to random_async, true_on_policy and the other entries under examples/infra_features/ -- random_async's README already describes itself as its "minimal sibling". run-qwen3-4b-fully_async.sh goes with the move rather than being ported. It was the only shell launcher of the three in the directory and demonstrated nothing the two python ones do not: the three changes the README calls out (train_async.py, MILES_EXPERIMENTAL_ROLLOUT_REFACTOR=1, --fully-async) are all in run_qwen3_5_4b_fully_async_eval.py, which is the same 4B size class and now the documented quick start. The only thing unique to the .sh was a commented-out --max-weight-staleness, and the README already explains that knob. external_eval_fn is imported by dotted path in two places -- tests/fast/rollout/ test_checkpoint_eval.py and tests/e2e/megatron/test_qwen3_4b_fully_async_eval.py -- so both move to examples.infra_features.fully_async, along with the same path inside the launcher itself and the docstring reference in miles/rollout/checkpoint_eval.py. The README's file list was also missing run_qwen3_30b_a3b_fully_async.py; it is listed now.
yueming-yuan
requested review from
Shi-Dong,
fzyzcjy and
guapisolo
as code owners
August 12, 2026 21:55
examples/README.md still had it as a top-level recipe, with a ./fully_async link that no longer resolves. Its group description already covered the move -- infra_features/README.md names "the async rollout loop" as one of the behaviours its examples exercise.
Roughly 30 of its 48 lines restated the two doc pages, which together run 583 lines and cover the same ground in more depth: "How It Works" is the walkthrough page's "What's happening underneath", "Config Differences" is its "What changes vs. the default recipe", and the Evaluation section is a summary of the user guide's three eval modes. Duplicated prose in a README nobody updates alongside the docs is a drift liability, so it is replaced by links to both pages. Two things were wrong rather than merely redundant. The README named the external eval fn as `external_eval_fn.ExternalSglangEvalFn`, but --eval-function-path takes the dotted module path, so anyone copying it got an ImportError; it now matches what the launcher passes. And `MILES_EXPERIMENTAL_ROLLOUT_REFACTOR=1` was stated twice within forty lines. Also points at examples/experimental/openenv/glm52_tbench2 as the frontier-scale reading of the same flag: GLM-5.2 744B-A40B on terminal-bench-2 across 16 GB300 nodes, one Daytona sandbox per episode.
They were buried in a See also section at the bottom; a reader landing in this directory should see where the real documentation is before scrolling. They are also full https://miles.radixark.com/docs/... URLs now, matching the root README: the site-relative form I used first does not resolve when GitHub renders the file. The GLM-5.2 pointer keeps its own section at the end, since it is a next step rather than required reading.
Contributor
|
probably need to rebase and fix conflicts. i added auto doc webpage generation. now docs/examples fully mirrors /examples |
nblintao
approved these changes
Aug 12, 2026
nblintao
left a comment
Contributor
There was a problem hiding this comment.
LGTM. Need to rebase - we no longer need manual changes to docs/examples/fully-async.md
Zhichenzzz
approved these changes
Aug 12, 2026
Shi-Dong
approved these changes
Aug 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The fully-async example is an infra feature and belongs under
examples/infra_features/, next torandom_async,true_on_policyand the rest —random_async/README.mdalready calls itself its "minimal sibling".The shell launcher goes with the move
run-qwen3-4b-fully_async.shis deleted rather than ported. It was the only shell launcher of the three in that directory, and it demonstrated nothing the two python ones do not — the three changes the README calls out (train_async.py,MILES_EXPERIMENTAL_ROLLOUT_REFACTOR=1,--fully-async) are all present inrun_qwen3_5_4b_fully_async_eval.py, which is the same 4B size class and is now the documented quick start. The only thing unique to it was a commented-out--max-weight-staleness, which the README explains anyway.What the move touches beyond the paths
external_eval_fnis loaded by dotted module path, not by file path, so the move is not purely mechanical. Three call sites follow it:tests/fast/rollout/test_checkpoint_eval.py—importlib.import_module(...), and this one runs in CItests/e2e/megatron/test_qwen3_4b_fully_async_eval.py—--eval-function-path ...run_qwen3_5_4b_fully_async_eval.pyPlus the docstring reference in
miles/rollout/checkpoint_eval.py, therandom_asyncREADME, and the two doc pages. Incidentally the example README's file list never mentionedrun_qwen3_30b_a3b_fully_async.py; it does now.Testing
pytest tests/fast/rollout/test_checkpoint_eval.py tests/manual/launch_scripts tests/fast/launch_scripts tests/fast/test_ray_launcher_unbuffering.py— 586 passed. The first of those is what proves the dotted path still resolves; the last is the guard that counts ray launchers, which drops by one with the deleted script.pre-commit run --all-filesclean, and no doc page links at the old location.