Repository navigation
v0.9.0
105 commits from 11 contributors since v0.8.0.
Highlights
1. Adaptive Concurrency
The orchestrator and evals process now size in-flight episodes from live vLLM pressure. The controller grows into available capacity, backs off before KV-cache thrash, and cancels the youngest work during overload. Set equal minimum and maximum limits to keep fixed concurrency.
#3285 — Adaptive concurrency for RL
#3309 — Adaptive concurrency for online evals
#3307 — Soft and hard KV-cache caps
#3313 — Staleness-aware cancellation
2. Local Run Dashboard
uv run dashboard shows live metrics, configs, rollout traces, rendered tokens, tool context, and merged logs. Interactive RL and SFT runs start one shared local daemon. Local agents can drive the open dashboard and create reports with verified trace citations.
#3351 — Local run dashboard
#3371 — Auto-started dashboard daemon
#3374 — Dashboard usability fixes
#3377 — Tool context and rendered tokens
#3387 — Agent commands and verified reports
#3268, #3271, #3375 — Run directories, attempt logs, and PRL_OUTPUT_DIR
3. Agentic Evals for SFT
SFT can launch rollout-based eval environments beside training. Single-node runs split trainer and inference GPUs, while multi-node runs use separate trainer and eval jobs. NCCL is the default weight transport. Filesystem transport supports LoRA and external inference.
#3256 — Online evals during SFT
#3323 — NCCL weight transport for SFT evals
4. Full CPU Optimizer Offload
Full offload keeps gradients, FP32 master weights, and optimizer state in host memory. Optimizer chunks run on the CPU while GPU backward continues. AdamW and SignSGD are supported, and SignSGD uses 8 bytes of host memory per parameter.
#3234 — Overlap CPU optimization with backward
#3303 — SignSGD support
#3305 — Fused AdamW defaults
#3383 — Safe cache release before weight broadcast
5. Custom CUDA Kernels
The new prime-kernels submodule and release-wheel pipeline ship architecture-specific CUDA kernels without changing the pure-Python prime-rl wheel. The first opt-in kernel provides fused MoE forward paths for Blackwell with BF16 and MXFP8 variants.
#3154 — Custom vendored kernels
#3321 — Prebuilt release wheels
6. Composable Curricula
Each training source can use a checkpointed task sampler and named admission gates. Built-in curricula provide reward-weighted difficulty pools and advantage-range gates. Rejected groups remain observable while the orchestrator backfills the training batch.
#3261 — Composable curricula
#3297 — Native episode scoring and admission
Dependencies
- verifiers:
0.3.0→0.3.1. #3372 - renderers:
0.1.9→0.1.10. #3367 - prime-pydantic-config:
0.4.2→0.4.3. #3256 - vllm-router:
0.1.26→0.2.0. #3274 - GPU packages now live in the optional
gpuextra. Dashboard dependencies live in the optionaldashboardextra. #3370, #3351 prime-kernelsis available through the optionalkernelsextra with prebuilt x86_64 and aarch64 wheels. #3154, #3321
Breaking
- vLLM config: move inference settings to
[inference.vllm]for RL and[vllm]for standalone inference. Use native vLLM field names. The oldmodel,parallel, flat vLLM fields, andvllm_extrapaths are removed. #3202 - Concurrency config: replace
orchestrator.max_inflight_episodeswith[orchestrator.concurrency]. Removeorchestrator.oversampling_factor. Replaceeval.max_inflight_episodeswith[eval.concurrency]. #3285, #3309 - Monitor config: use
[monitors.wandb],[monitors.file], and[monitors.prime]. Distribution logs, W&B sample tables, usage reporting, andfinal_summary.jsonare removed. Readmetrics.jsonlfor local metrics. #3275 - SFT deployment config: rename
deployment.num_gpustodeployment.num_train_gpus. Rename multi-nodedeployment.num_nodestodeployment.num_train_nodes. #3256 - Final weight broadcast: remove
weight_broadcast.broadcast_final. The trainer now broadcasts every policy version, including the final one. #3385 - Run directory and resume config: output now uses
output_dir / run.dir. Moveckpt.resume_stepto top-level[resume]. Renameclean_output_dirtoclean. Resolved component configs move to<run_dir>/configs/resolved/. #3268, #3351 - SLURM artifacts: generated scripts and completion markers move to
<run_dir>/launcher/. SLURM output moves to<run_dir>/launcher/logs/. Update manualsbatchcommands and log collection paths. #3324 - Checkpoints:
[ckpt.weights],ckpt.weights_only, and persistentweights/snapshots are removed. DCP checkpoints are the persistent training artifact. Filesystem broadcasts use sharded safetensors. #3315, #3316 - Benchmark mode:
bench,--bench, andBenchConfigare removed. Run short normal training jobs and readmetrics.jsonl. #3272 - GPU installation: bare
uv syncno longer installs the training and inference stack. Useuv sync --all-extrasor add--extra gpu. #3370 - Local run helper:
scripts/tmux.shis removed. Useuv run dashboard. #3351 - Environment API: only v1 environments are supported. Remove
[legacy]blocks. Drop the-v1suffix from taskset IDs, such asreverse-text-v1→reverse-text. #3226 - Multi-tenant training: multi-tenant discovery, eviction, and per-run optimizer settings are removed. Configure one inference endpoint as a string in
client.base_url; lists are no longer accepted. #3189 - Rollout filters:
pre_batch_filtersandpost_batch_filtersare removed. Configure a curriculum sampler and admission gates instead. Exact zero-advantage pruning remains atorchestrator.train.filter_zero_advantages. #3261 - Environment submodule:
deps/research-environmentsmoves todeps/prime-envs. Existing clones must sync the new submodule path. #3241 - Metrics:
optim/zero_grad_ratioand its Prometheus gauge are removed. #3249
Changelog
- chore: release v0.8.0 by @samsja in #3207
- chore: revert release v0.8.0 version bump by @samsja in #3208
- fix: disable dynamo on Ulysses all-to-all to prevent FSDP×compile NCCL deadlock by @samsja in #3195
- perf(docker): cut ghcr image build from 74m to 16m by @eexwhyzee in #3160
- chore: bump verifiers to 0.3.0 by @mikasenghaas in #3205
- chore: bump version to 0.8.0 by @samsja in #3209
- feat!: vllm pass-through inference config by @mikasenghaas in #3202
- feat: per-source env-server address via serve.address by @mikasenghaas in #3218
- feat: remove multi-tenant by @mikasenghaas in #3189
- fix(slurm): export ORCH_PROCID so the orchestrator actually launches by @mikasenghaas in #3225
- chore: bump verifiers for the unbounded model-call timeout by @mikasenghaas in #3227
- chore: bump research-environments for the toolset register() fix by @hallerite in #3230
- feat(laguna): support per-element attention gating by @mikasenghaas in #3229
- feat!: drop v0 env compat by @mikasenghaas in #3226
- feat: change default DPPO masking thresholds to 0.1 by @mikasenghaas in #3236
- feat: auto-resolve parsers for Nemotron 3.5 (Lightning) by @eexwhyzee in #3237
- chore: bump renderers for Nemotron 3.5 (Lightning) renderer by @eexwhyzee in #3239
- chore: point at the renamed prime-envs repo by @mikasenghaas in #3241
- chore: remove the control/ output subdir by @mikasenghaas in #3243
- fix: revert default DPPO masking thresholds to 0.2 by @mikasenghaas in #3244
- chore: bump verifiers and prime-envs to latest main by @mikasenghaas in #3245
- chore: bump verifiers to latest main by @mikasenghaas in #3246
- fix: skip weight pre-download for random-init debug runs by @samsja in #3247
- docs(k8s): drop dead docs links and fix PVC name in Helm README by @chethanuk in #3242
- chore: bump verifiers for prime-sandboxes 0.2.36 by @mikasenghaas in #3259
- perf!: remove the zero-gradient-ratio metric by @samsja in #3249
- chore(ruff): pin path-dep import classification by @hallerite in #3263
- feat: dynamic pass-through vLLM inference metrics to W&B by @mikasenghaas in #3240
- docs: remove retired zero-gradient metric by @atirna in #3267
- feat: warn when inference queue exceeds inflight-episode budget by @mikasenghaas in #3269
- chore: bump verifiers for prime vm runtime default by @mikasenghaas in #3270
- feat: run dir + resume from path by @mikasenghaas in #3268
- feat: per-attempt log directories by @mikasenghaas in #3271
- feat!: remove the benchmark mode by @mikasenghaas in #3272
- chore: bump vllm-router wheel to v0.2.0 by @eexwhyzee in #3274
- feat: refactor monitors by @mikasenghaas in #3275
- feat: overlap CPU optimizer with backward by @samsja in #3234
- fix(tests): migrate remaining --wandb.* flags to --monitors.wandb.* by @eexwhyzee in #3280
- perf(docker): split the uv dependency layer and add registry-backed build cache by @eexwhyzee in #3279
- chore: bump verifiers to latest main by @mikasenghaas in #3286
- fix(monitors): allow overriding the platform base URL via $PRIME_API_BASE by @eexwhyzee in #3287
- feat: online evals during sft by @mikasenghaas in #3256
- fix(tests): migrate full-offload SFT fixture to num-train-gpus by @mikasenghaas in #3291
- fix(docker): re-include the wandb monitor package in the build context by @eexwhyzee in #3292
- chore: simplify ignore files to outputs/ by @mikasenghaas in #3295
- feat(orchestrator): add composable curricula by @hallerite in #3261
- feat: sign-SGD support for full CPU optimizer offload by @samsja in #3303
- chore: bump workflow actions to latest versions by @mikasenghaas in #3306
- feat: adaptive concurrency by @mikasenghaas in #3285
- chore: move transport code to prime_rl.transports by @mikasenghaas in #3308
- Increase chunk size to 8k by @MarioSieg in #3302
- Remove pipeline sync in inner loss function loop by replacing the bra… by @MarioSieg in #3294
- feat: adaptive concurrency for online evals by @mikasenghaas in #3309
- feat: soft and hard kv cap by @mikasenghaas in #3307
- Mario/cpu optimization dataloader by @MarioSieg in #3299
- fix(tests): seed qwen3_moe parity test RNG and widen grad tolerance by @samsja in #3290
- Turn fused adamw on by default except when we do cpu offloading by @MarioSieg in #3305
- refactor(orchestrator): score native episodes by @hallerite in #3297
- fix: validate scheduler steps at config time by @mikasenghaas in #3318
- Add custom vendored kernels by @MarioSieg in #3154
- Relock prime-kernels after refreshing the v0.8.0 wheels by @MarioSieg in #3321
- feat: rank-parallel sharded save for filesystem broadcast by @mikasenghaas in #3315
- feat: remove weight checkpointing by @mikasenghaas in #3316
- feat: support Qwen3.8 by @eexwhyzee in #3314
- feat: enable nccl for sft online evals by @mikasenghaas in #3323
- fix(orchestrator): apply taskset system_prompt override on the RL path by @hallerite in #3327
- fix(orchestrator): label eval avg@k by episode group size by @hallerite in #3328
- docs(training): correct saved episode references by @hallerite in #3329
- refactor(orchestrator): rename sampler to generation source by @hallerite in #3330
- fix: meta load order by @garrett361 in #3333
- fix(sft): resumed runs restart the data stream with num_workers > 0 by @mikasenghaas in #3332
- feat: drop on in-queue staleness + first-class cancellation type by @mikasenghaas in #3313
- refactor(orchestrator): make dispatch contracts explicit by @hallerite in #3334
- chore: bump verifiers to latest main by @mikasenghaas in #3337
- chore: fold source sub-configs into dotted keys by @mikasenghaas in #3344
- chore: glm-4.5-air swe example to bf16 + bash harness by @mikasenghaas in #3343
- fix: only pkill zombie torchrun/vLLM processes in CI by @mikasenghaas in #3346
- feat: expose repository skills to codex by @mikasenghaas in #3347
- feat: drop orchestrator-side renderer for trace-stamped mm token map by @mikasenghaas in #3349
- chore: clean up trainer and orchestrator logging by @mikasenghaas in #3345
- fix: treat a resume past max_steps as the last step by @mikasenghaas in #3352
- chore: remove dead extra_headers_from_state config by @mikasenghaas in #3353
- refactor: rename transports.rollouts to transports.batch by @mikasenghaas in #3354
- refactor: split InferencePool into InferenceClient and AdminClients by @mikasenghaas in #3355
- feat: serve the LoRA adapter under the base model name by @mikasenghaas in #3358
- feat: uniform four-stage handshake for weight broadcasts by @mikasenghaas in #3357
- fix: health-check only the router when admin clients bypass it by @mikasenghaas in #3359
- chore: bump verifiers and prime-envs to latest main by @mikasenghaas in #3363
- fix(nccl): avoid cloning received weight tensors by @S1ro1 in #3365
- docs(install): document pre-commit hook install step by @garrett361 in #3366
- chore: bump renderers to 0.1.10 by @mikasenghaas in #3367
- feat: add local run dashboard by @mikasenghaas in #3351
- fix(orchestrator): make dispatch failures explicit by @hallerite in #3364
- feat: rename proc-title prefix to PRL by @mikasenghaas in #3369
- chore: bump verifiers to 0.3.1 by @mikasenghaas in #3372
- feat: slim uv sync by @mikasenghaas in #3370
- feat: auto-started dashboard daemon by @mikasenghaas in #3371
- fix: misc dashboard improvs by @mikasenghaas in #3374
- feat(configs): add PRL_OUTPUT_DIR env var for default output_dir by @garrett361 in #3375
- fix: silence W&B Weave advertisement on wandb.init by @hallerite in #3380
- fix: synchronize before the pre-broadcast empty_cache by @mikasenghaas in #3383
- fix: preserve final eval during teardown by @mikasenghaas in #3324
- feat(dashboard): expose tool context and rendered tokens by @rasdani in #3377
- feat(dashboard): agent view commands + report tab with verified citations by @eligotts in #3387
- fix: align evals with applied policies by @mikasenghaas in #3385
- Full comparison: v0.8.0...v0.9.0