Repository navigation
docs(aorlta): getting-started guide for new users - #610
Conversation
…r needs first docs/GETTING-STARTED.md puts the steps in order: what a run needs (and what is untested: fewer GPUs, other GPUs, other models), the CPU tests as CI runs them, the site file and the job's environment, a score run before a training run, measured times, reading the outputs, the settings people change, and what each of the job's exit codes and the common run stops mean. The README now says the test suite must not run with -n auto on a many-core machine, that only the Qwen3.5 family works as it stands, that the stand-in dataset is not published and the example pool is too small to run, and that the fake components do not read the configured pool or checks.
There was a problem hiding this comment.
🟡 Changes recommended
The getting-started guide misstates checkout requirements, scoring versus training submissions, the scored-fraction denominator, and where to find failed-iteration diagnostics, leaving readers with misleading setup and troubleshooting guidance.
4 open issues
What changed in this PR
This documentation-only PR adds an onboarding path for AORLTA, from CPU checks through GPU scoring and training, and clarifies current limitations.
Changes:
- Adds a getting-started guide covering prerequisites, setup, outputs, settings, and troubleshooting.
- Replaces unrestricted pytest parallelism with bounded test commands.
- Clarifies model support, dataset availability, and what fake-component runs validate.
| File | Description |
|---|---|
aorlta/README.md |
Links the guide and clarifies testing commands and prerequisites. |
aorlta/docs/GETTING-STARTED.md |
Adds step-by-step setup, run, and troubleshooting guidance. |
Review effort: Balanced
…help, and a pointer from the aorta README GETTING-STARTED.md: how to place engines, trainer ranks and checks on 1, 2, 4 or 8 GPUs of one node, measured peak memory per GPU (labelled estimates beside them), how to share a node, how to switch models and what limits that today, and where checkpoints and adapters go. The README gains a Getting help section (open an issue with the new AORLTA template, label aorlta; docs feedback as docs: issues). The top-level README points to aorlta/ as early and evolving.
There was a problem hiding this comment.
🟡 Changes recommended
The getting-started guide references unshipped configs and an unsupported GPU setting, reports an unreproducible VRAM measurement, and promises an unimplemented checkpoint-to-PEFT export workflow.
7 open issues
Document only shipped configs and supported GPU layouts · New Use the committed config for the VRAM measurement · New Clarify that checkpoint-to-PEFT export is not implemented · New Document where failure diagnostics are recorded Clarify that the scored-fraction denominator excludes generated samples Separate the scoring and training submission instructions Clarify that real-component jobs require an aorta checkout
Review effort: Balanced
…nd of the GPU layout Co-authored-by: Cursor <cursoragent@cursor.com>
…t scrolling Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
🟡 Changes recommended
The documentation overstates when parse repairs occur and presents the AORTA checkout as optional despite unconditional preflight imports, potentially causing real jobs to fail during setup.
8 open issues
Missing parse feedback prevents stand-in repair retries · New Clarify that checkpoint-to-PEFT export is not implemented Use the committed config for the VRAM measurement Document only shipped configs and supported GPU layouts Document where failure diagnostics are recorded Clarify that the scored-fraction denominator excludes generated samples Separate the scoring and training submission instructions Clarify that real-component jobs require an aorta checkout
Review effort: Balanced
…e or with main - Every GPU run needs the aorta checkout (AORLTA_AORTA_ROOT): the import pre-flight loads two of its backends whatever the profile, and exits 99 without it. Its own row, and out of the stand-in-only environment line. - The score run and the training run are two submissions; give the training command. - min_scored_fraction is over the candidates handed to the reward service, not every chain generated (also in the README's correctness table). - A scored_fraction_below_threshold stop writes no summary for the failing iteration: read stop.detail.policy and stop.detail.unsettled in run_result.json. - Name the pull requests that add the worked examples (#613), plugins (#611) and the adapter exporter (#612) where a passage depends on them; drop hipk.run.gpus as if it were a config key; a checkpoint is not a PEFT adapter.
There was a problem hiding this comment.
🔵 Needs a closer look
The setup guide incorrectly presents the launcher's required aorta checkout as optional, causing documented custom and Q&A Slurm jobs to exit 99 when that checkout is absent.
8 open issues
Missing parse feedback prevents stand-in repair retries Clarify that checkpoint-to-PEFT export is not implemented Use the committed config for the VRAM measurement Document only shipped configs and supported GPU layouts Document where failure diagnostics are recorded Clarify that the scored-fraction denominator excludes generated samples Separate the scoring and training submission instructions Clarify that real-component jobs require an aorta checkout
Review effort: Balanced
amd-vivekag
left a comment
There was a problem hiding this comment.
Review summary
Verdict: fix-before-ship
The guide is the right shape: score before train, exit codes, and the GPU layout. A few of the steps a new user would follow do not match the code, and the one-GPU section points at configs this branch does not contain.
Docs only. I checked the claims against the loop, the stand-in parser, and the run job's import preflight.
Findings: 0 High · 5 Medium · 0 Low
Copilot's note that a real job still needs an aorta checkout is right, and so is the stand-in repair edge. The score-vs-train command and the missing summary on a scored-fraction stop are the same kind of mismatch.
| subgraph rollout["2-3 generate: TokenSpeed engines at policy v(n-1), K chains per prompt"] | ||
| turn["one request per chain and turn, with its own seed"] --> parse{"parse the reply<br/>rollout.parse_adapter"} | ||
| parse -- "an answer" --> compile{"compile check<br/>rollout.compile_adapter (none: skipped)"} | ||
| parse -- "rejected, a turn left" --> feedback["repair turn<br/>rollout.feedback_template"] |
There was a problem hiding this comment.
[Medium] The stand-in parser never takes this repair edge.
StandinParse returns ParseOutcome("rejected") with no message, and the chain ends no_code_block when rejection is missing, even if a turn is left. A repair turn happens only when the parser fills in rejection (the HIP and Q&A plugins do).
Fix: draw the stand-in edge as "no code block → end", and keep "rejected, a turn left → repair" for a parser that sets rejection. Copilot flagged this too.
There was a problem hiding this comment.
Fixed in b5f1ee7: a reply rejected with no reason (the stand-in parser's missing code block) now ends the chain in the diagram, and the repair edge is drawn only for a parser that sets rejection.
There was a problem hiding this comment.
Resolved — confirmed on the current head.
| | images | built by the job | TokenSpeed at commit `3b684074c0ef79bc8bc00b31cda8dc2850e4b71f` (`git clone https://github.com/lightseekorg/tokenspeed && git -C tokenspeed checkout 3b684074c0ef79bc8bc00b31cda8dc2850e4b71f`, then `TS_SRC=$PWD/tokenspeed`), built by the job from its `docker/Dockerfile.amd`; and the trainer image on top of it from `docker/Dockerfile.trainer`. | | ||
| | model | `Qwen/Qwen3.5-4B` at revision `851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a` | The job runs offline, so download it first: `HF_HOME=<cache> hf download Qwen/Qwen3.5-4B --revision 851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a`. `model.base_dir` is the snapshot directory under `<cache>/hub/`. Only the Qwen3.5 family works as it stands: the turn templates use Qwen3.5's control-token ids (`rollout/templates.py`), and the trainer needs transformers' Qwen3.5 linear-attention fast path (`trainer.require_fast_path`). Another Qwen3.5 size, or a fine-tune of it, is the supported change. | | ||
| | prompts | a pool of your own | The stand-in configs read a kernel dataset (`kernels.json` and `listings/`) that is not published. `examples/standin-pool/` shows its format but is too small for a run: the stand-in landing check alone picks 40 kernels of 60 to 400 instructions. | | ||
| | stand-in check tools | only for the stand-in profiles | `standin-static` runs rocjitsu's `rj_waitcheck` (ROCm/rocm-systems branch `shared/rocjitsu/sanitizers`, built from source, with a libstdc++ that has GLIBCXX_3.4.31); `standin-gpu` adds ConSan (`librocjitsu_dbi_hooks.so` from the same build) and ASan (the ROCm 7.0.2 `*-asan` packages' `lib/asan`), through aorta's sanitizer backends at commit `d22f6116235c05395a0241a83d6f7e952a988454`. None of these is packaged; a task with checks of its own needs none of them. | |
There was a problem hiding this comment.
[Medium] A real job still refuses to start without an aorta checkout.
jobs/aorlta-imports-check.py loads aorta.models and aorta.waitcheck for every real run, and the job exits 99 when that fails. A task whose profile never uses those backends still needs AORLTA_AORTA_ROOT.
Fix: say that here. The preflight should load those two modules only when the profile names an aorta adapter (that change is on the run job). Copilot flagged this too.
There was a problem hiding this comment.
There was a problem hiding this comment.
Resolved — confirmed on the current head.
| Both are one job, submitted from `aorlta/` with the config committed: | ||
|
|
||
| ```bash | ||
| mkdir -p runs && CONFIG=configs/score-standin.yaml sbatch jobs/aorlta-run.sbatch |
There was a problem hiding this comment.
[Medium] This is the only command, and it only scores.
configs/score-standin.yaml is orchestrator.mode: score. The paragraph says to train next, and "both are one job" reads as if this submission trains.
Fix: show the training submission too (CONFIG=configs/dev-standin.yaml sbatch jobs/aorlta-run.sbatch). Copilot flagged this too.
There was a problem hiding this comment.
Done in 7b72c88: score and train are now two submissions, and the dev-standin.yaml training command follows the score run.
There was a problem hiding this comment.
Resolved — confirmed on the current head.
| | `trainer.ranks`, `trainer.devices`, `trainer.lr`, `trainer.micro_batch_tokens` | the LoRA trainer; the LoRA itself is r 16, alpha 32 (`LORA_R`, `LORA_ALPHA` in `orchestrator/wiring.py`) | | ||
| | `trainer.max_generation_gap`, `trainer.gap_statistic` | how far the trainer's log-probs may be from the engine's before a sample is left out | | ||
| | `orchestrator.iterations`, `orchestrator.run_seed` | the run's length and seed | | ||
| | `orchestrator.min_scored_fraction` | the share of an iteration's samples that must be scored before it trains (0.9 by default); after one retry of the unsettled checks, a shortfall stops the run | |
There was a problem hiding this comment.
[Medium] The fraction is over candidates handed to the reward service, not every sample.
A chain an engine lost, or one the leak check quarantined, is not in the denominator (loop.py, handed_over). 18 scored out of 18 handed passes even when the iteration started more chains.
Fix: say "the share of candidates handed to the reward service". Copilot flagged this too.
There was a problem hiding this comment.
Done in 7b72c88: it now says the share of candidates handed to the reward service, here and in the README's correctness table.
There was a problem hiding this comment.
Resolved — confirmed on the current head.
| seeds. TokenSpeed on AMD defaults to a greedy sampler that ignores temperature and seed; the engines are started | ||
| with `sampling_backend: triton`, and this check is what catches it if that ever stops taking effect. | ||
| - the round trip is not PROVEN: a weight update did not reach the engines. Nothing is trained or scored. | ||
| - the scored fraction is short: too many checks did not settle (look at the counts by reason in the summary). A |
There was a problem hiding this comment.
[Medium] That stop is raised before the iteration's summary exists.
scored_fraction_below_threshold returns before summary.json is written. The counts by reason are not in a summary for the failed iteration.
Fix: point at run_result.json for the stop, and at the reward service's own log for which checks did not settle. Copilot flagged this too.
There was a problem hiding this comment.
Done in 7b72c88: it points at run_result.json, whose stop.detail.policy has the counts before and after the retry and stop.detail.unsettled lists each unsettled check (candidate, leg, reason, worker), so the service log isn't needed for that.
There was a problem hiding this comment.
Resolved — confirmed on the current head.
|
|
||
| | GPUs | layout | runs | | ||
| |---|---|---| | ||
| | 1 | `engines: [0]`, `ranks: 1` (beside the engine), CPU checks | the Q&A example (`configs/qa-*.yaml`, `configs/arith-*.yaml`); measured below | |
There was a problem hiding this comment.
[Medium] These configs, the 187 GiB row, and the PEFT export are not on this branch.
configs/qa-*.yaml, configs/arith-*.yaml and configs/hipk-*.yaml arrive in #613, and tools/export_adapter.py in #612. hipk.run.gpus is a key inside that example's profile, not a run-config key. Merging this guide first sends a reader at files the checkout does not have.
Fix: land this after #612 and #613, or mark those sections as coming with those PRs. Copilot flagged this too.
There was a problem hiding this comment.
Resolved — confirmed on the current head.
…e export and compare tools come with #612 and #613 - The README's iteration diagram drew every parse rejection with a turn left as a repair turn. A repair happens only when the parser sets a rejection reason (the worked examples' parsers do); standin.parse sets none, so its reply with no code block ends the chain (rollout/chain.py, no_code_block). - The score-run paragraph names tools/export_adapter.py (#612) and tools/eval_compare.py (#613) as additions. - The aorta checkout row says #611 makes the import pre-flight load aorta's backends only for profiles that use them.
There was a problem hiding this comment.
🟢 Approval recommended
No active review issues block the AORLTA onboarding documentation changes.
No open issues 🎉
8 resolved since last review
Missing parse feedback prevents stand-in repair retries Clarify that checkpoint-to-PEFT export is not implemented Use the committed config for the VRAM measurement Document only shipped configs and supported GPU layouts Document where failure diagnostics are recorded Clarify that the scored-fraction denominator excludes generated samples Separate the scoring and training submission instructions Clarify that real-component jobs require an aorta checkout
Review effort: Balanced
|
@amd-vivekag your six points are addressed in 7b72c88 and b5f1ee7, with a reply in each thread. Could you take another look? |
amd-vivekag
left a comment
There was a problem hiding this comment.
No review comments — approving. The earlier findings are fixed on this head.

The team is going to try AORLTA on their own tasks, so I walked through the README and ADAPTING.md from a fresh clone, the way a new user would. This is the docs half of what came out of that.
docs/GETTING-STARTED.md: the steps in order. What a run needs, and what is untested (fewer than 8 GPUs, MI300X/MI355X, models outside the Qwen3.5 family). The CPU tests the way CI runs them. The site file and the job's environment. A score run before a training run, with the times measured onmain. Reading the outputs, the settings people change, and what each job exit code and common run stop means.-n autoon a many-core box (it runs out of memory). Only Qwen3.5 works today. The stand-in dataset isn't published and the example pool is too small to run on.--components fakedoesn't read the configured pool or checks.Also:
aorlta, which now exists);Docs and an issue template only, no code change. Some lines refer to files in #611–#613 (the Q&A configs, the export tool), so this is best merged after them.
How I checked it: on a fresh clone of
mainI followed the steps and the CPU suite passed in all three parts. I also ran a score run and a 3-iteration stand-in training run on MI350X; the times in the guide come from those runs.