v0.50.0 closes the GRPO/RL gap with Unsloth and Axolotl. 22 features across objective variants, long-context + memory-efficient RL, multi-turn agent rollouts, stability/efficiency knobs, and Process Reward Models + Vision RL.
This is a schema-only release: every new flag parses, every cross-validator fires, every error message names the actual problem. Live loss kernels, vLLM sleep-mode plumbing, ART/RULER/NeMo Gym/OpenEnv launchers, and the PRM trainer wrapper land in v0.50.1 — schema accepts the values now so configs are stable.
What's New
7 GRPO objective variants
New training.grpo_variant:
gspo— Group Stabilized Policy Optimization (Unsloth)dapo— Decoupled Advantage Policy Optimization (Unsloth + Axolotl)dr_grpo— Doubly Robust GRPO (Unsloth + Axolotl)bnpo— Batch Normalized Policy Optimization (Unsloth)two_sided— symmetric clipping (requiresgrpo_delta)rft— Reinforced Fine-Tuning (Unsloth)standard— default GRPO (DeepSeek-R1 style)
Plus grpo_fp16: true (explicit FP16 RL, complementing existing FP8 RL).
Long-context + memory-efficient RL
training.long_context_grpo: true— schema gate for Unsloth-grade long-context GRPO (380K B200 / 110K H100); wires Tiled MLP from v0.56.0 Part A once it lands.training.vllm_sleep_mode: true— between-rollouts vLLM standby (Unsloth + Axolotl).
Multi-turn agent rollout backends
New training.rollout_backend:
art— OpenPipe ART multi-turn agent rollouts (Unsloth)ruler— RULER agent eval framework (Unsloth)nemo_gym— NVIDIA NeMo Gym single/multi-turn rollouts (Unsloth + Axolotl)openenv— genericrollout_funcprotocol (Unsloth + Axolotl)
7 GRPO stability/efficiency knobs (Axolotl + Unsloth parity)
ref_model_ema_alpha— exponential moving average for policy → reference syncreplay_buffer_size— bounded replay buffer for rolloutsasync_grpo_prefetch— overlap rollout + traintis_threshold+mask_truncated_completions— truncated importance samplingdefer_rerolling— defer re-rolling identical promptsskip_zero_advantage— skip backward pass on zero-advantage samplesoff_policy_mask_threshold— token/sequence off-policy mask gate
Process Reward Models + Vision RL
- New top-level
task='prm'— Process Reward Model / stepwise-supervised training (paired withdata.format='prm'from v0.42.0). - New
training.vision_grpo: true— Vision RL / VLM RL on Qwen2-VL / Pixtral / InternVL (requiresmodality='vision'andtask ∈ {grpo, ppo}).
Install / Upgrade
pip install --upgrade soup-cliOr via Docker:
docker pull ghcr.io/makazhanalpamys/soup:v0.50.0Security
5 sequential review agents (python-review, code-review, security-review, tdd-guide, verification-loop) flagged HIGH/MEDIUM/LOW findings; every finding was fixed before commit:
- Explicit
field_validator(mode='after')forgrpo_deltaNaN/Inf rejection (Pydanticle=1.0only incidentally rejects NaN; made explicit so a future Pydantic change cannot regress the guard). - Null-byte rejection on
taskANDbackendstrings in long-context-GRPO and vLLM-sleep compat helpers; matchesvalidate_grpo_variant/validate_rollout_backendpolicy. - Bool guard on
use_ring_attentionparameter (parity with the bool-before-int policy enforced on every numeric field this release). grpo_fp16added to the GRPO-only task-gate — silently no-opping ontask='sft'is no longer possible.vllm_sleep_moderequirestask='grpo'— sleep mode is a between-rollouts feature, meaningless on SFT._reject_bool_on_grpo_numericsfield_validator rejectsboolon every Part D numeric field +grpo_deltabefore Pydantic'sTrue→1coercion (matches v0.30.0Candidate/ v0.41.0 Part Blr_groups/ v0.43.0 Part B policy).
All new closed-allowlist validators (validate_grpo_variant, validate_rollout_backend) reject non-string / bool / empty / null-byte / oversize inputs with actionable case-insensitive normalisation. Registries wrapped in MappingProxyType (matches v0.36.0 _REGISTRY policy); specs are frozen dataclasses (matches v0.32.0 SpikeRecoveryStrategy policy).
Test count: 6490 → 6729 (+239 across 5 new test files).
Known Limitations
- Every live loss kernel and launcher is deferred to v0.50.1.
apply_variant_loss(GRPO variants),apply_vllm_sleep_mode,launch_rollout(ART/RULER/NeMo Gym/OpenEnv), andbuild_prm_trainerall raiseNotImplementedErrorwith explicitv0.50.1markers. Same stub-then-live pattern as v0.27.0 MII / v0.37.0 multipack / v0.41.0 LLaMA Pro / v0.45.0 plugins / v0.46.0 ExecuTorch / v0.48.0 curriculum / v0.49.0 LongLoRA. - Long-context GRPO requires Tiled MLP (scheduled to land in v0.56.0). Until then,
long_context_grpo: trueparses but the runtime fallback prints an advisory. - Vision RL allowlist does not verify that the base model is actually a VLM (Qwen2-VL / Pixtral / InternVL); the upstream trainer surfaces the error loudly when it fails to load the vision tower.
- PRM trainer routing not registered —
task='prm'schema-validates butsoup trainwill print "PRM trainer not yet wired (v0.50.1)" until the live wrapper lands. - Stability knobs do not interact at v0.50.0 — the 7 new Part D fields all schema-validate but none are wired into a live callback in this release;
replay_buffer_size,defer_rerolling, andskip_zero_advantageare pure schema lock-ins. vllm_sleep_modeis a vLLM ≥0.7 feature — Soup does not auto-upgrade vLLM when the flag is set; users mustpip install -U vllmthemselves.grpo_fp16is captured but not yet routed — the flag rejects on non-grpo tasks per code-review HIGH fix, but the live mixed-precision picker still uses the v0.32.0auto_mixed_precisionpath; full FP16-RL routing lands in v0.50.1.
🤖 Generated with Claude Code