// Research / Custom Fine-tuning
DPO and GRPO for last-mile quality.
SFT teaches imitation. Preference optimization teaches preference. DPO/SimPO/KTO when you have preference pairs, GRPO with the DAPO patches when only a reward function captures the objective - on TRL, Unsloth, Axolotl, or VeRL depending on scale.

train/reward + composite reward funcs · ~2h warmup, exponential after first lucky rollout, plateau at ~20h
// What we see
SFT got you 80% of the way there. The last 20% needs a different tool.
01
SFT plateaus on subjective objectives
Brand voice, persuasiveness, reasoning quality, tool-use reliability - SFT output still reads as "close, but off." The remaining quality lives in preferences the next-token loss doesn't capture.
02
DPO has a real footgun called likelihood displacement
On noisy or semantically-similar pairs, DPO drives chosen and rejected probabilities up together - the margin looks fine while the model converges to a third style nobody asked for.
03
Reward hacking is the hard problem, not the algorithm
With GRPO the optimizer is the easy part - designing rewards the model can't game is the hard part. Length hacking, markdown abuse, EOS exploits, answer-without-reasoning are the canonical failures.
// Case Study
Beating AI detectors with a GRPO-trained rewriter
We tried SFT. We tried DPO. Both produced outputs that still read as AI to detectors. GRPO trained from scratch hit near-perfect detection-evasion in a 20-hour run on 8xH100 - and ships today as Surfer's AI Content Humanizer.
0%
AI-detection score post-humanize
20h
GRPO training on 8xH100
50K
words per humanize request

// What we do
Three paths past the SFT ceiling.
DPO/SimPO/ORPO/KTO when you have preference pairs and want a cheap last-mile lift. GRPO (with the DAPO/Dr.GRPO patches that fix the original) when only a reward function captures your objective. Reward design as a first-class research problem - because that's the part that decides whether RL works.
DPO and the family - when you have preferences
DPO for pairwise preferences, SimPO for length bias, ORPO for one-stage SFT+DPO, KTO for thumbs-only signal.
- DPO / SimPO / ORPO / KTO / IPO on TRL, LlamaFactory, Unsloth, Axolotl
- Single-H100 8B runs with Unsloth's 30% VRAM savings
- Preference pairs from production traces, support tickets, or bias-corrected LLM-as-judge
- Held-out preference eval catches likelihood displacement early
GRPO + the patches that make it actually work
Vanilla GRPO breaks at scale - we deploy the patches the field converged on: DAPO, Dr.GRPO, GSPO/GMPO for MoE.
- DAPO-patched GRPO (clip-higher, dynamic sampling) on TRL / VeRL / OpenRLHF
- vLLM colocate or SGLang disaggregated rollouts depending on long-tail variance
- Truncated importance sampling to handle inference-vs-training engine mismatch
- Verifiable rewards (math/code/schema/tool-use) plus calibrated LLM-judge for subjective dimensions
Reward design + reward-hacking defenses
Reward design treated as the engagement itself - multiple complementary signals, calibrated against humans.
- Composite rewards (correctness + structure + style) with explicit weighting
- Calibrated LLM-judge with RaR rubrics, bias correction, human anchor
- Adversarial probes hand-crafted before training starts
- Length, entropy, reward, and held-out validation tracked simultaneously
// Method fit
RL fine-tuning earns its keep when SFT plateaus.
skip it if
SFT already gets you to your quality bar
If your eval shows SFT already lands at the target metric, RL fine-tuning is overkill - extra cost, extra failure modes, no upside.
Supervised Fine Tuning (SFT)You can't define a reward signal
RL needs something to optimize - preference pairs for DPO and family, a programmatic or model-based reward for GRPO. Fix the eval first.
Custom LLM Evaluation FrameworksYou don't have evals yet
Optimization without evals is just hope with a confident dashboard. Start with the eval engagement, then layer DPO/GRPO on top.
Custom LLM Evaluation FrameworksYou're still pre-PMF and it's not your core product
Ship first, find fit, then tune what stabilizes. If the model IS your core product, the timing is fine.
use it if
You've done SFT, the eval shows a gap, and you can articulate it in a way an algorithm can score - preference pairs, programmatic reward, calibrated judge.
You're working on a subjective or verifiable objective where SFT structurally can't reach the bar: brand voice, persuasiveness, reasoning quality, tool-use reliability, code/math correctness, safety calibration.
You ship at a scale where the last 5–10% of quality is worth it - cost of one bad output × traffic > engagement cost.
// How we work
Eval and reward first. SFT bootstrap. Then DPO or GRPO.
Every engagement starts with the eval suite and the reward function - the two things that decide whether RL fine-tuning will work at all. Then SFT as a baseline if you have demonstrations. Then the right algorithm for the signal you actually have, on the stack that fits the scale.
01
Build the eval and the reward function
Eval suite mined from production traces. Rewards verifiable where possible - math, code execution, schema compliance, tool-use success - calibrated LLM-as-judge where subjective. Adversarial probes designed before training.
02
SFT bootstrap with the right framework for the scale
Unsloth for single-GPU long-context (90% VRAM reduction, FP8 GRPO at 5GB), Axolotl for config-driven multi-GPU, LlamaFactory for breadth. An SFT cold start of 100 examples materially improves downstream RLVR.
03
DPO/SimPO/ORPO/KTO or GRPO depending on the signal
Pairwise preferences → DPO/SimPO/ORPO on single H100, 24-48h, β tuned per dataset. Programmatic reward → GRPO with DAPO patches on TRL v1.0, OpenRLHF, or VeRL. Handoff: training pipeline, eval suite, reward-hacking probes.
// Expert insight
“Preference optimization used to be a finicky process. Recent developments - GRPO and the follow-ups (DAPO, Dr.GRPO, GSPO) - made it much more steady. SFT is great for fine-tuning structure and general concept, but it often fails to capture nuance. GRPO reliably gets you the last-mile performance now, and the tooling caught up - TRL v1.0, Unsloth, VeRL, vLLM rollouts - to the point where it's no longer a research project.”
Michał Pogoda-Rosikoń
Co-founder @ bards.ai
// Why bards.ai
GRPO in production - behind a top-tier SaaS content tool.
Reading the paper gets you a notebook. Shipping a GRPO model that beats production AI detectors and survives reward hacking takes scars from runs that didn't work.
GRPO shipped in production
GRPO models shipped past objectives SFT and DPO couldn't reach - including the rewriter behind a top-tier SaaS content tool.
Tooling fluency across the stack
TRL v1.0 for orthodox runs, Unsloth for single-GPU long-context, Axolotl for config-driven SFT, VeRL/OpenRLHF for multi-node RL, vLLM/SGLang as the rollout engine.
DPO/SimPO/ORPO/KTO/GRPO/DAPO fluency
Each implemented from the papers and shipped for the right problem. We follow the field through DAPO, Dr.GRPO, GSPO.
Jaxpot - our open-source RL stack
JAX-based vectorized self-play with leagues, MCTS, and reproducible configs. Built and maintained in-house.
10+ peer-reviewed publications
CLARIN-PL spinoff. The team has reviewed RL papers in NeurIPS / ICML cycles and reproduced the ones worth reproducing.
We tell you when RL is the wrong tool
Many problems are better solved with SFT, prompt engineering, or a different base model. We say so before you spend GPU budget.
// FAQ
Common questions about preference optimization
When SFT has plateaued on a subjective objective and you have pairwise preference data. DPO directly optimizes "prefer A over B" without needing a separate reward model - it's cheap (single H100, 24-48h on a small model) and well-behaved with clean preferences. The catch: with noisy or semantically-similar pairs, DPO can hit likelihood displacement - both chosen and rejected probabilities move together, the margin metric looks fine while the model gets worse on real evals. SimPO (length-normalized, no reference model) and ORPO (collapses SFT+DPO into one stage) sidestep different parts of this. Calibrated held-out evals catch the failure mode; vibes don't.
GRPO (DeepSeek-R1) drops the value model and uses group-relative advantages - dramatically less memory, often ~50% reduction vs PPO, and runs on a single GPU with vLLM colocated rollouts. It's mathematically equivalent to RLOO up to a scaling constant. The original GRPO has known issues at scale (entropy collapse, length bias, zero-gradient batches) that DAPO and Dr.GRPO patch. We default to DAPO-style clip-higher + dynamic sampling + token-level loss; the tradeoff is more knobs but a more stable curve.
DAPO (ByteDance, Mar 2025) hits AIME 2024 = 50 in half the steps of DeepSeek-R1-Zero-Qwen-32B by adding clip-higher (asymmetric ε to keep low-prob exploration tokens alive), dynamic sampling (drop prompts where every rollout agrees - zero gradient), token-level loss instead of sequence-level (fixes length bias), and overlong reward shaping (don't penalize truncated answers). Dr.GRPO removes the std-dev normalization in the advantage and the per-sequence length normalization - both were sources of bias. Plain GRPO often shows response length growing after rewards plateau; the patches stop that.
Three layers. (1) Multiple complementary rewards - a single reward is easy to game; three weighted rewards aren't. (2) Adversarial probes designed up front - we hand-craft outputs that score high but read terrible; if the model produces those, the reward function is the bug. (3) Track length, entropy, training reward, and held-out validation simultaneously per Cameron Wolfe's playbook. KL regularization helps for some setups; for verifiable-reward GRPO runs (DAPO and follow-ups), most groups now drop the KL penalty entirely - it isn't necessary and can hurt. The 2025 Anthropic paper on natural emergent misalignment from reward hacking is required reading; we treat reward hacking as a safety surface, not just a quality bug.
Less than people assume. Argilla/HF shipped Zephyr-141B with 7k pairs via ORPO. SmolLM3 used DPO/APO with HelpSteer-style mixes. At the larger end, Tülu 3 used 337–360k preference pairs for the 70B/405B mixes - and the key finding was that *unique prompts* matter; duplicating prompts with different responses doesn't help. Start small, evaluate on held-out preferences, scale up only when the eval shows the data is the bottleneck. Human preferences run $5–20 per sample; calibrated AI preferences (RLAIF) run under $0.01.
LoRA, in most cases, more aggressively than people assume. Thinking Machines published recent work showing LoRA matches full fine-tuning even at rank-1 for RL - because policy gradients carry only ~1 bit per episode of information vs ~1000× more for SFT tokens. Optimal LoRA learning rate is roughly 10× the full-FT rate. LoRA underperforms when (a) the dataset is large enough to look like pre-training, (b) batch size is huge, or (c) it's not applied to all linear layers (especially MLPs and MoE). Lewis Tunstall's framing: "LoRA forgets less, which is why DPO with LoRA often works really well - it acts as a regularizer."
SFT bootstrap on 8B with ~100K examples on 8×H100: ~20h, ~$620. DPO on the same scale: single H100, 24-48h, often under $50. GRPO depends entirely on rollout cost - multi-day on 8×H100 is normal for production-quality runs, with vLLM/SGLang as the rollout engine being the lever that matters. Engagement timeline: eval + reward function design week one, SFT bootstrap week two, DPO or GRPO iteration weeks three through six, total 6–10 weeks for production-grade engagements with multiple reward components and tight quality bars. Every week ships a measurable improvement, not a status update.
// Related services
Adjacent problems we solve
- Learn more
Custom Fine-tuning
Supervised Fine Tuning (SFT)
Reproducible fine-tuning with correct chat templates and eval gates - a QLoRA 7B on 50K examples lands in 12-24h and $30-60 of compute.
- Learn more
Custom Fine-tuning
Synthetic Data Pipelines
Teacher distillation plus the part that matters: dedup, reward-model filtering, and contamination checks that discard the 80% of synthetic data that would hurt you.
- Learn more
Custom Fine-tuning
Reinforcement Learning for Agents
PPO with self-play leagues on JAX - thousands of parallel environments per GPU for games and multi-agent decision problems.
// Let's ship it
Get past the SFT ceiling - without burning your reward budget on a bad run.
Bring your model, evals, and the gap. You'll get an algorithm choice - DPO, KTO, GRPO + DAPO, or an honest "don't bother" - and a number within a business day.
Michał Pogoda-Rosikoń
Co-founder @ bards.ai