98 commits from 13 contributors since v0.7.0.
1. Multi-Agent RL Algorithms
prime-rl integrates verifiers 0.3.0 for first-class multi-agent (single-policy) training support. Simply select a multi-agent environment with --env.id and mark all trainable agents. prime-rl will take care of the rest! Two new named algorithms were added for special multi-agent environments:
- RAE (Role-conditioned Advantage Estimation) — SPIRAL's per-agent EMA-baseline advantage for self-play environments. Each trainable agent keeps an EMA of its own rewards; advantage is scored against the pre-update baseline and folded in at a configurable decay (default 0.95), keyed by
agent_nameper env instance. - Hierarchical GRPO — for proposer-solver environments where a single group average is misleading. Solvers are compared only with other solver attempts on the same proposed problem; proposers are compared with other proposals from the same source task.
#3136 — RAE — role-conditioned advantage estimation for self-play envs (SPIRAL)
#3138 — Hierarchical GRPO for proposer-solver envs
#3165 — Multi-agent native metrics
#3104 — Adopt the multi-agent episode wire (verifiers 0.2.2.dev7)
2. NIXL & ModelExpress Weight Broadcast
The inference stack moves to vLLM 0.26.0. A new NIXL + ModelExpress weight-synchronization path provides direct trainer-to-vLLM weight transfer over NIXL with a declarative trainer-to-HF conversion graph and typed BF16/FP32 wire arenas. ZMQ is now the default rollout transport — rollout batches stream orchestrator → trainer over sockets instead of being written to disk, with filesystem still available as a fallback. A single global router now fronts all engines in every deployment type.
#3060 — NIXL + ModelExpress weight synchronization
#3166 — vLLM 0.26.0
#3149 — Default rollout transport to ZMQ + multi-node host injection
#3105 — Single global router in front of engines for all deployments
#3051 — uint16 routed-experts payload for >256-expert models
#3031 — Online quantization config
#3028 — Factor-derived YaRN scaling for Laguna
3. Extended Multimodal Support
Multimodal training now extends to SFT and gains context parallelism. Renderer-produced multimodal samples flow end to end through SFT — including image-safe truncation, mm_token_type_ids, multimodal processor outputs, and cat packing. The dense Qwen3.5 composite VLM body (HF vision encoder + custom PrimeRL text model) with MRoPE positions is supported. Context parallelism now extends to hybrid linear-attention and VLM models in SFT, and multimodal samples can be packed with CP. Ulysses CP breaks the num_kv_heads ceiling via GQA KV-head replication — critical for hybrid-Mamba GQA models like NemotronH Super/Ultra/Nano (2 KV heads), which were previously stuck at cp <= 2 and can now scale to cp = 64.
#3075 — Multimodal (VLM) SFT
#3099 — Context parallelism for hybrid + VLM SFT
#3103 — Pack multimodal samples with context parallelism
#3042 — Ulysses CP beyond num_kv_heads via GQA KV-head replication
#3032 — seq_lens as the packed-sample boundary contract
#2988 — Require renderer-based tokenization for SFT
#3044 — Unify the SFT loss path with the RL trainer
Misc
Trainer performance & attention backends: FlashAttention 3 is now the default, with attn = "auto" (FA4 on Blackwell, FA3 on Hopper, FA2 on older). The eager path and fa4 alias are removed. Nemotron-H packed Mamba conv uses the faster fla causal_conv1d kernel; unneeded gradients in the fused LM-head backward are skipped.
#3057 — FA3 as default, rename fa4 → flash_attention_4, remove eager
#3076 — attn = "auto" (FA3 on Hopper, FA4 on Blackwell)
#3192 — fla causal_conv1d for packed Mamba conv (Nemotron-H perf)
#3011 — Skip unneeded gradients in fused LM-head backward
#3063 — Require FLA for DeltaNet (Qwen3.5)
#3168 — B300/GB200/GB300 peak FLOPS for MFU
FP8 & quantization: MXFP8 training via TorchAO — MXFP8 linear for forward/backward and weight conversions, compatible with all-to-all and grouped GEMM. SM100-specific UE8M0 FP8 scales gated to Blackwell; SM100 FP8 weights emitted in vLLM kernel format.
#2910 — MXFP8 support
#3112 — UE8M0 FP8 scales only on SM100
#3036 — Emit SM100 FP8 weights in vLLM kernel format
Orchestrator architecture: env collections restructured around composable sources (verifiers env / serve / legacy blocks); env servers are now always standalone; all config shims removed; max_inflight_rollouts → max_inflight_episodes. The orchestrator now owns each v1 env's taskset and ships task data to env servers; infinite tasksets are supported.
#3150 — Rename env collections to sources, compose verifiers config blocks
#3162 — Standalone env servers
#3156 — Remove every config shim
#3151 — Rename max_inflight_rollouts → max_inflight_episodes
#3043 — Orchestrator owns v1 tasksets, ships task data to env servers
#2993 — Support infinite tasksets
Observability: local file monitor for JSONL metrics, effective reward/score as a second W&B overview panel, platform trace metadata via verifiers Trace fields.
#3111 — Local file monitor for JSONL metrics
#3153 — Effective reward and eval score in W&B overview
#3061 — Stamp platform trace metadata via verifiers Trace fields
CI & infrastructure: nightly FFT workflow with cron, GHCR image build fixes, workflow actions bumped to Node 24, Docker Hub push removed, GPU integration test timeouts increased.
#3118, #3142 — Nightly FFT workflow + cron
#3127, #3121, #3131, #3132, #3133, #3134 — Nightly FFT config and dispatch fixes
#3125, #3126 — GHCR image build fixes
#3078 — Bump workflow actions to Node 24 majors
#3080 — Remove Docker Hub push workflow
#3100 — Increase GPU integration test timeouts
Config & examples: overhauled public configs and examples, expanded inline TOML tables, dev tooling (tmux helper, Claude Code / Codex selection).
#3085 — Overhaul public configs/ and examples/
#3167 — Expand inline TOML tables to sections
#3040, #3039 — Dev tooling: tmux agent window, SUCCESS window
#3029 — Remove CHANGELOG.md
Plus numerous verifiers / research-environments / renderers submodule bumps and dependency pins.
Breaking
- Env collections → sources:
[[orchestrator.train.env]]/[[orchestrator.eval.env]]→.source;TrainEnvConfig/EvalEnvConfig→TrainSourceConfig/EvalSourceConfig. Old paths are removed, not aliased. A source composes the verifiersenv/serve/legacyblocks. #3150 - Standalone env servers: the orchestrator never spawns env servers via subprocess.
OrchestratorConfig.env_addressesmaps each(split, name)source to a derivedtcp://address; there is noaddressfield on the source'sserveblock. #3162 - Config shims removed: all deprecated config aliases and compatibility shims are removed. Existing configs must use the canonical field names. #3156
max_inflight_rollouts→max_inflight_episodes: renamed to reflect multi-agent episode semantics. #3151- Default attention → FA3 / auto:
model.attndefaults to"auto"(FA4 on Blackwell, FA3 on Hopper, FA2 on older). Thefa4alias andeageroption are removed — useflash_attention_4andflash_attention_2respectively. #3057, #3076 - Default rollout transport → ZMQ:
rollout_transportdefaults toZMQTransportConfig(). Setrollout_transport.type = "filesystem"to restore the old behavior. #3149 - SFT requires renderer-based tokenization:
use_token_clientis fully removed; SFT must use the renderer path. #2988
Bug Fixes
#3197 — Accept seq_lens contract kwargs in GlmMoeDsaModel.forward
#3201 — Auto-resolve parsers for Laguna, GPT-OSS, and Trinity
#3184 — Standalone inference at dp=1 EP + poolside_v1 tool-call regex
#3182 — Count unscored reward components as zero in rollout metrics
#3164 — Checkpoint and resume the orchestrator train data position
#3159 — Read overview quality metrics from effective subset
#3152 — Compute trainable rate over effective rollouts
#3148 — Plot overview time panels on relative wall time
#3129 — Set cp=4 for GLM-4.5-Air advanced examples
#3124 — Skip identity HF↔PrimeRL conversion (fixes RO model-cache crash on dense Qwen3)
#3123 — Eval at checkpoint step on resume via eval.retrigger_on_resume
#3116 — Sync docs to public-docs on stable release only
#3113 — Replay strided views on inference (NIXL fix)
#3079 — Auto-attn falls back to FA2 on non-SM100 Blackwell
#3077 — Fallback to FA2 for workstation Blackwell (SM103) in auto-attn
#3073 — Fix GPU unit tests broken by FA3 default
#3069 — Skip no-op weight conversion for dense models
#3096 — Don't resolve Hub envs when parsing orchestrator configs
#3094 — dp=1 EP replicas launch dense-style (vLLM rejects external-LB at dp=1)
#3084 — Re-pin verifiers for MCP transport resilience under high concurrency
#3053 — Bake optional dependencies into CUDA image
#3050 — Hold batch ship on the trainer's published version
#3035 — Install DeepEP wheel by architecture
#3030 — Restrict startup weight sync to resume and NCCL
Contributors
@mikasenghaas, @hallerite, @samsja, @S1ro1, @JannikSt, @hubert-marek, @JohannesHa, @eexwhyzee, @rasdani, @snimu, @eligotts, @xeophon, @MarioSieg