experiments/<name>/, containing config.yaml (the tuning entry point), README.md, and recipe.lock.json (the method lock). Create a repository first with sf init, then run the commands below inside that repository. Disk layout and upload excludes: Lab layout. Inheritance details: config.yaml.
Create an experiment
- From the method catalog
- Fork an existing experiment
config.yaml: write only the diff
An experiment config inherits from official bases viadefaults and only writes the keys you want to change:
experiments/my-grpo/config.yaml
Hardware and distributed details (parallelism, GPU memory tuning, NCCL) are not written in the experiment config — they are delivered from the server-side registry via
--profile at submission time. Switching GPU types for the same experiment requires no config change.Local validation
- Key validity: struct mode; misspelled config keys fail immediately;
- Types and ranges: learning rate, batch, etc. are checked against declared types and value ranges;
- Batch size relationships: methods like GRPO validate the divisibility relationship between rollout batch and train batch (divisible but unequal lengths produce an off-policy warning; not divisible is an error);
- Data declarations: required
--model/--train-datafor verl / TRL are caught early if missing.
sf submit automatically runs the same validation; --no-validate skips it (not recommended).
Browse methods and hyperparameters
/methods) has a visual version of the same catalog.
Comparing runs in the console
The jobs area on a project detail page is a dense comparison matrix:- Job name and status stay fixed while metric/config columns scroll horizontally;
- Rows and columns are both virtualized, so hundreds of runs × hundreds of columns render only nearby cells;
- All latest metrics and config values that vary across runs are visible by default; constant config columns are available from the Columns panel;
- Search jobs, filter status, search/hide/pin columns, and select 2–4 runs for review comparison.