Engineering deep dive · · Updated: · 13 min read

Multi-Reward RL, Part 2: Benchmarking GRPO, DAPO, and CISPO on Unseen Tasks

Seven trainer configurations, two reasoning modes, and a CISPO + REPO-R hybrid. On our DEX gym, the training leader did not win holdout—and the untrained thinking baseline changed the interpretation. Explore the measured results, every reward curve, and the limits of this one-seed study.

Follow-up: Part 3 scales the CISPO + REPO-R recipe to Qwen3.8-27B and 600 steps, with a one-change-per-run holdout ladder and an advantage-floor failure we found in a harsher environment.

Part 1 analyzed how PPO, GRPO, DAPO, and GDPO balance competing reward objectives in theory. In this follow-up empirical benchmark, we test the practical question engineering teams actually face: which trainer algorithm actually produces a model that solves brand-new, unseen problems?

We ran seven distinct RL algorithms on Qwen3-14B in our deterministic decentralized exchange (DEX) arbitrage gym across two reasoning regimes: No-think (direct execution) and Thinking-2048 (with chain-of-thought tokens enabled). The results revealed a severe cautionary tale for post-training teams.

The Generalization Trap: In thinking mode, CISPO achieved the highest training reward curve (0.8951 last-10 mean), yet its performance on frozen test tasks collapsed to 0.6068. Meanwhile, the raw Qwen3-14B base model—with thinking enabled and zero RL training—scored 0.6830. If you only look at your training curves, you will celebrate a run that is actively degrading your model.

The baseline changed the experiment.STARTING MODELNo-think0.385616 / 40 successfulSAME STARTING WEIGHTSThinking-20480.683037 / 40 successful50 TRAINING STEPSDAPO-refill · thinking0.710538 / 40 successfulMeasure this before crediting the trainer.+0.0275 above thinking base
Native holdout reward, not a success percentage. Each score comes from 40 sampled episodes across 10 held-out tasks. DAPO-refill had the highest observed thinking score; its refill mechanism did not trigger in this run.

1. What the agent does: The DEX gym

DEX stands for decentralized exchange. In our gym, the agent is presented with a frozen snapshot of automated market maker (AMM) liquidity pools: token reserves, exchange fees, gas prices, and routing constraints. The agent’s task is to find an optimal two-to-four pool arbitrage cycle and compute the exact input amount (amount_in_wei) that returns more of the starting asset after all fees and gas deductions.

WETH (Wrapped Ether) is the asset at both ends of the route. Consider an intuitive triangular arbitrage cycle: the model starts with WETH, swaps into USDC, swaps USDC into UNI, and swaps UNI back into WETH.

  • If the trade size is too small: The fixed Ethereum gas fees eat 100% of the price discrepancy, yielding a negative net return.
  • If the trade size is too large: The constant-product liquidity formula (x⋅y=kx \cdot y = k) causes severe price slippage, collapsing the margin.
  • If the pool sequence is invalid: The simulated EVM contract reverts and the transaction fails immediately.
One gym. Different ways to learn from it.Frozen DEX snapshotpools · fees · gasWETH → … → WETHQwen proposes a routepool order + amountinspect, refine, finalizeVerifier replays itconstraints + profitthree reward channelsTrainer → weight updatethe part we swapNew trainer ≠ new reward.
The model emits structured tool calls. Independent code scores the resulting route. The trainer changes how those scores influence the model; no new gym reward component is required for CISPO, ADAPO or REPO-R.

The agent interacts using structured tool calls: inspecting pool reserves, proposing a pool route and trade amount, evaluating feedback, and finalizing. The verifier replays the transaction bytecode using a native Foundry / revm EVM execution engine. It scores the verified mathematical execution on the simulated blockchain, rather than trusting any self-reported text output by the model.

Training reward = R_native + 0.05 × R_efficiency + 0.20 × R_reliability

The composite training reward consists of three distinct channels:

  • Native Task Score (R_native ∈ [0, 1]): The verified net profit margin returned to the starting wallet after all pool fees and gas costs.
  • Execution Efficiency (R_efficiency ∈ [0, 1]): Rewards solving the task compactly in 2–3 tool turns instead of exhausting all 6 turns: max(0, 1 − tool_steps / 6).
  • Reliability Gate (R_reliability ∈ {-1, +1}): +1.0 if the transaction executed cleanly without syntax errors or contract reverts; −1.0 if the call failed.
The training reward is not the task scoreTraining reward = native + 0.05 × efficiency + 0.20 × reliability. Holdout reports native alone. Thinking mode, holdout component means.-0.20.00.40.81.2untrained model= 0.887 (native 0.683)DAPO-refill= 0.912 (native 0.710)CISPO= 0.770 (native 0.607)native task scoreefficiency bonusreliability bonusReliability alone can move the training reward by 0.4 (−0.2 to +0.2), so a curve can rise for reasons the native score does not see.
The training reward adds efficiency and reliability bonuses to the native task score, so it can move without the task score moving. Holdout results report the native score alone.

2. What we held fixed: The training contract

To isolate the impact of the RL trainer algorithms, every other variable was strictly controlled:

  • Model and Quantization: Qwen3-14B (revision 40c06982…), quantized NF4 weights with BF16 compute, LoRA rank 32, alpha 64.
  • Compute Hardware: One dedicated NVIDIA RTX PRO 6000 Blackwell 96 GB per training run, Hugging Face generation, fused SDPA attention, CUDA graphs disabled.
  • Optimizer Schedule: Fixed seed 42, learning rate 1e-5 with linear decay, 50 optimizer steps, group size 4, eight completions per fresh rollout batch, two policy updates per rollout. Curriculum learning disabled.
  • Reasoning Modes:
    • No-think: Chain-of-thought thinking disabled; max 1,024 generated tokens per tool turn (max 8,192 trajectory cap).
    • Thinking-2048: Model allocated up to 2,048 thinking tokens inside a 3,072-token turn budget (max 22,528 trajectory cap).
  • Frozen Holdout Evaluation: Evaluated on the final step-50 checkpoint. 5 task families × 2 held-out seeds × 4 samples = 40 episodes across 10 distinct unseen scenarios. Untrained starting checkpoints evaluated identically in both reasoning modes.

3. Trainer features: Seven algorithm bundles

In modern post-training, an RL algorithm is not a monolithic block. It is a bundle of three distinct modular decisions: which rollouts enter the training batch, how multiple rewards are combined into policy advantages, and how that advantage scales policy gradient updates.

Architectural choices across the seven benchmarked trainer configurations. PPO was excluded due to its separate Critic VRAM requirement.
ConfigurationLoss / averagingReward → advantageDynamic samplingControl
GRPOClipped surrogate; sequence-level averagingJoint reward → group normalizationOffMonitor only
DAPOClipped surrogate; token-level averagingJoint reward → group normalizationOffFixed asymmetric clip: 0.20 / 0.28
DAPO-refillSame DAPO lossSame as DAPOOn; at most 2 refill roundsSame fixed clip
GDPODAPO loss in this implementationNormalize each reward, then combineOffFixed asymmetric clip
CISPODetached, capped importance weightsJoint reward → group normalizationOffImportance-weight cap 1.20
DAPO + ADAPODAPO lossSame as DAPOOffEntropy feedback adjusts upper clip
DAPO + REPO-RDAPO lossToken-level advantage shapingOffEntropy feedback controls ζ
CISPO + REPO-R w5CISPO loss; cap stays 1.20Token-level advantage shapingOff / separate refill arm5-step target window; ζ ≥ 0

GDPO decouples reward-channel normalization before combining advantages. CISPO replaces ratio clipping with direct importance weight clipping (capped at 1.20). ADAPO and REPO-R introduce adaptive entropy control: ADAPO adjusts clipping bounds based on policy entropy, while REPO-R shapes token-level advantages. DAPO-refill activates replacement sampling when a rollout group exhibits zero reward variance, preventing zero-gradient wasted batches.

4. Full results: Train vs. holdout test

FINDING 01

The CISPO Inversion Trap

Train: 0.8951 → Test: 0.6068

CISPO had the highest training reward but the lowest holdout score. One likely reading: it kept raising the composite training reward without improving the native score on tasks it had not seen.

FINDING 02

Thinking Baseline Beats RL

Raw base: 0.6830 (37/40)

Untrained Qwen3-14B with 2,048 thinking tokens beat 6 of the 7 trained models. Always benchmark against an untrained thinking baseline.

FINDING 03

DAPO Leads Generalization

No-think: 0.6467 · Think: 0.7105

DAPO delivered the highest native holdout score in no-think mode (0.6467, 39/40), and DAPO-refill led thinking mode (0.7105, 38/40).

FINDING 04

The 5× Compute Tax

13.5 hrs vs 2.6 hrs

Thinking steps took 4.5–5.9× longer wall-clock time. You must balance the evaluation gain (+0.0275) against a 5× compute budget increase.

Higher training reward did not mean a better model on unseen tasksThinking-2048 mode, Qwen3-14B, 50 steps. Each dot is one trainer: training reward (last 10 points) vs. holdout score.0.600.640.680.8000.8250.8500.8750.900training reward, last 10 points (what the dashboard shows)holdout native score on 10 unseen tasksuntrained model 0.683GRPO 0.680DAPO 0.670DAPO-refill 0.710GDPO 0.660CISPO 0.607DAPO + ADAPO 0.625DAPO + REPO-R 0.646Only DAPO-refill finished above the untrained model, and its refill never triggered in this mode. One seed per run; 40 holdout episodes each.
Thinking mode: training reward over the last ten points against holdout score. CISPO had the highest training reward and the lowest holdout score.
RL clearly helps without thinking; with thinking, the untrained model is hard to beatHoldout native score on 10 unseen tasks (40 episodes). Blue: no-think. Orange: thinking-2048. Dashed: untrained Qwen3-14B.0.40.50.60.7untrained no-think 0.386untrained thinking 0.683no-think → thinkGRPO0.642 → 0.680DAPO0.647 → 0.670DAPO-refill0.584 → 0.710GDPO0.624 → 0.660CISPO0.619 → 0.607DAPO + ADAPO0.633 → 0.625DAPO + REPO-R0.572 → 0.646No-think: every trainer beats 0.386, DAPO best at 0.647. Thinking: 6 of 7 finish below the untrained 0.683; DAPO-refill is the exception at 0.711.
Holdout native score on 10 unseen tasks for each trainer, without thinking (blue) and with 2,048 thinking tokens (orange). Without thinking every trainer beats the untrained model; with thinking only DAPO-refill does.

No-think mode: Every trained model beats the starting baseline

No-think mode · snapshot September 14, 2026. “Train last-10” averages the final 10 fresh rollout rewards. “Holdout native” is the strict verifier score on unseen test scenarios.
ConfigurationStepsTrain meanTrain last-10Holdout nativeSuccessesStep, sStep-hours
Starting modelbaseline0——0.385616/40——
GRPO50/500.70380.77290.642438/401772.46
DAPOtop holdout50/500.65190.71420.646739/401762.45
DAPO-refill50/500.65640.75850.583934/402243.11
GDPO50/500.64880.77270.624536/401672.32
CISPO50/500.64860.74860.619036/401642.27
DAPO + ADAPO50/500.66940.75250.633237/401682.33
DAPO + REPO-R50/500.63730.70570.572431/401562.16

Without reasoning tokens, post-training delivers an unambiguous leap forward. The untrained base model scored only 0.3856 (passing 16/40 episodes). DAPO achieved 0.6467 (39/40 successes), closely followed by GRPO at 0.6424. Every single trained configuration substantially outperformed the starting model.

Thinking-2048 mode: The starting model sets a high bar

Thinking-2048 mode · snapshot September 14, 2026. “Train last-10” averages the final 10 fresh rollout rewards. “Holdout native” is the strict verifier score on unseen test scenarios.
ConfigurationStepsTrain meanTrain last-10Holdout nativeSuccessesStep, sStep-hours
Starting modelbaseline0——0.683037/40——
GRPO50/500.83620.88240.679838/4092912.90
DAPO50/500.80360.79160.670338/4093813.02
DAPO-refilltop holdout50/500.82750.85640.710538/40101614.10
GDPO50/500.81900.82530.660235/4093813.03
CISPOdiverged50/500.83880.8951↑0.606833/4090712.60
DAPO + ADAPO50/500.81850.88150.625034/4088712.32
DAPO + REPO-R50/500.82850.82060.646134/4092212.81
CISPO + REPO-R w550/500.81650.83320.624334/4093713.01
CISPO + REPO-R w5 + refill
partial
41/500.79080.8302——91210.39

When chain-of-thought thinking tokens are enabled, the starting model achieves 0.6830 straight out of the box (passing 37/40 episodes). Only DAPO-refill surpassed the untrained model on native holdout reward (0.7105, an incremental gain of +0.0275). GRPO (0.6798) and standard DAPO (0.6703) finished slightly below the base model’s score despite high success rates (38/40), demonstrating that success counts and solution quality answer different questions.

5. Explore the curves: Rollout telemetry

Each 50-step run generated 25 fresh rollout reward checkpoints (even optimizer steps update on rollouts generated on odd steps). The chart below shows three of them in thinking mode:

The best-looking end of training belonged to the worst holdout scoreThinking-2048 mode: training reward on fresh rollouts (every other step), no smoothing. It is noisy: one batch of 8 completions per point.0.50.60.70.80.91.01.1step 1step 10step 20step 30step 40step 50CISPOtrain last-10 0.895holdout 0.607DAPOtrain last-10 0.792holdout 0.670DAPO-refilltrain last-10 0.856holdout 0.710Training reward includes efficiency and reliability bonuses; holdout uses the native task score on tasks the run never saw.
Raw training reward in thinking mode for CISPO, DAPO and DAPO-refill. One batch of eight completions per point, so the curves are noisy; the late averages and the holdout scores tell different stories.

Use the interactive explorer below to compare any two trainer configurations across the 50-step trajectory:

CISPO · mean 0.8388 · 25 batchesCISPO + REPO-R w5 · mean 0.8165 · 25 batches
-0.200.000.250.500.751.001.2511020304050CISPO · step 1: 0.708017CISPO · step 3: 0.953178CISPO · step 5: 0.842710CISPO · step 7: 0.833925CISPO · step 9: 0.716074CISPO · step 11: 0.787146CISPO · step 13: 0.720173CISPO · step 15: 0.962763CISPO · step 17: 0.699492CISPO · step 19: 0.883526CISPO · step 21: 0.776956CISPO · step 23: 1.013888CISPO · step 25: 0.555751CISPO · step 27: 0.765734CISPO · step 29: 0.798723CISPO · step 31: 1.093313CISPO · step 33: 0.884916CISPO · step 35: 0.870928CISPO · step 37: 0.937840CISPO · step 39: 0.973666CISPO · step 41: 0.800041CISPO · step 43: 0.892790CISPO · step 45: 0.981199CISPO · step 47: 0.566612CISPO · step 49: 0.949583CISPO + REPO-R w5 · step 1: 0.708017CISPO + REPO-R w5 · step 3: 0.685857CISPO + REPO-R w5 · step 5: 0.740580CISPO + REPO-R w5 · step 7: 0.708557CISPO + REPO-R w5 · step 9: 0.756640CISPO + REPO-R w5 · step 11: 0.897562CISPO + REPO-R w5 · step 13: 0.812017CISPO + REPO-R w5 · step 15: 0.807996CISPO + REPO-R w5 · step 17: 0.848704CISPO + REPO-R w5 · step 19: 1.009395CISPO + REPO-R w5 · step 21: 0.928267CISPO + REPO-R w5 · step 23: 1.006660CISPO + REPO-R w5 · step 25: 0.658180CISPO + REPO-R w5 · step 27: 0.781008CISPO + REPO-R w5 · step 29: 0.731481CISPO + REPO-R w5 · step 31: 0.989723CISPO + REPO-R w5 · step 33: 0.947463CISPO + REPO-R w5 · step 35: 0.748010CISPO + REPO-R w5 · step 37: 0.551544CISPO + REPO-R w5 · step 39: 0.685541CISPO + REPO-R w5 · step 41: 0.905815CISPO + REPO-R w5 · step 43: 0.938511CISPO + REPO-R w5 · step 45: 0.782173CISPO + REPO-R w5 · step 47: 0.881300CISPO + REPO-R w5 · step 49: 0.901488Optimizer step · fresh rollout on odd steps only
Logged composite reward; fixed vertical scale; no smoothing. Even optimizer steps reuse the previous rollout and add no new reward point. Refill rows can average several generation rounds, so they do not measure exactly the same batch population as ordinary rows. Run IDs: 1789312185 and 1789375757.

Over its last ten reward points CISPO averaged 0.895 in thinking mode and DAPO 0.792, yet on unseen tasks DAPO scored 0.670 and CISPO 0.607. The training reward is measured on training tasks and includes bonuses, so it is no substitute for a frozen holdout.

6. Time and memory: The cost of thinking

Test-time reasoning comes with a heavy computational invoice. Across all seven algorithms, an average thinking step took 4.5–5.9× longer than a no-think step. Fifty training steps required approximately 12.3–14.1 hours of GPU execution in thinking mode, compared to 2.2–3.1 hours in no-think mode.

Thinking made every training step about 5× slowerMean wall-clock seconds per optimizer step on one RTX PRO 6000 Blackwell (96 GB), 50 steps per run.0 s250 s500 s750 s1000 sGRPO929 s · 5.2×177 sDAPO938 s · 5.3×176 sDAPO-refill1016 s · 4.5×224 sGDPO938 s · 5.6×167 sCISPO907 s · 5.5×164 sDAPO + ADAPO887 s · 5.3×168 sDAPO + REPO-R922 s · 5.9×156 sthinking-2048no-think50 steps: 12.3–14.1 GPU-hours with thinking vs. 2.2–3.1 without. The thinking-mode gain over the untrained model was +0.028 at best.
Mean seconds per optimizer step. Thinking made steps 4.5 to 5.9 times slower, for at most +0.028 over the untrained model on holdout.
Peak VRAM consumption during thinking-mode training on NVIDIA RTX PRO 6000 Blackwell 96 GB. Memory measured in GiB (binary).
ConfigurationPeak allocated, GiBPeak reserved, GiB
GRPO69.176.9
DAPO66.574.0
DAPO-refill68.576.3
GDPO68.376.1
CISPO70.077.8
DAPO + ADAPO71.879.6
DAPO + REPO-R68.075.5
CISPO + REPO-R w566.974.4
CISPO + REPO-R w5 + refill (partial)70.377.8

In thinking mode, peak memory stayed between 66.5 and 71.8 GiB allocated (74.0–79.6 GiB reserved), within the 96 GB budget of the Blackwell GPU. The primary operational bottleneck is wall-clock rollout latency, not GPU memory.

7. Combining features: The CISPO + REPO-R hybrid

Can we rescue CISPO’s optimization speed while fixing its generalization collapse? We tested a hybrid architecture: using CISPO’s capped importance weights (cap 1.20) combined with REPO-R’s token-level advantage shaping.

To stabilize entropy dynamics, we introduced a nonnegative window-5 controller: the first 5 optimizer steps record entropy drift without intervention (ζ = 0). Once calibrated, the entropy control strength is constrained strictly to 0 ≤ ζ ≤ 0.05.

The completed hybrid achieved 0.6243 native holdout reward and 34/40 successes, outperforming standalone CISPO (0.6068, 33/40). While this +0.0175 lift confirms that advantage shaping mitigates policy collapse, the hybrid still trailed the raw untrained thinking baseline (0.6830).

Enabled is not the same as exercised

In no-think mode, DAPO-refill triggered 19 replacement rollout rounds. In thinking mode, DAPO-refill triggered zero refills—the model never produced an all-identical reward batch. Therefore, we cannot attribute the thinking DAPO-refill lead (0.7105) to the refill mechanism itself; it functioned identically to standard DAPO under that seed.

8. What to test next: Next iteration & replication

Based on these findings, our production post-training recommendations for multi-step reasoning workflows are:

  1. In No-Think Mode: Standard DAPO and GRPO are clear, cost-effective winners. They raised the holdout score from 0.386 to about 0.64–0.65 (16/40 to 38–39/40 successes) in about 2.5 GPU-hours.
  2. In Reasoning Mode: Always evaluate your untrained base model with reasoning enabled before declaring training success. DAPO-refill is the primary candidate for replication.
  3. Never Pick a Checkpoint by Training Curves: CISPO proved that soaring training curves can mask test-set degradation. All promotion decisions must be gated by frozen holdout benchmarks.
  4. Multi-Seed Replication: Expand seed sweeps (seeds 43, 44) across novel scenario families to confirm that DAPO-refill’s +0.0275 edge holds across market distributions.

Evidence and method references

All raw empirical telemetry is publicly available. The public JSON export contains complete run manifests, SHA256 hashes, all 791 recorded optimizer steps, 396 fresh reward logs, and 680 evaluated holdout episodes. The Markdown companion provides searchable per-step records.

Foundational algorithm publications: DeepSeekMath / GRPO; DAPO; GDPO; MiniMax-M1 / CISPO; ADAPO and REPO-R.