A 32B model that knows when not to refund
GRPO with a refund-policy reward on 180k resolved tickets. Replaced a prompt-chained frontier model.
+19 pts resolution · −81% costPOFE is the workspace where a team takes an open model and makes it great at one job. Curate the data, run SFT, DPO or GRPO, check every result against evals you trust, and ship the endpoint. No platform team required.
Every dataset, run, eval and endpoint is linked in one lineage graph, so any score on a dashboard traces back to the data and code that produced it.
| method | needs | best for |
|---|---|---|
| SFT | demonstrations | format, style, domain |
| DPO / ORPO | chosen vs rejected | tone, preferences |
| KTO | thumbs up / down | product feedback logs |
| GRPO | reward fn or verifier | reasoning, tool use, agents |
| PPO | reward model | open-ended RLHF |
| Distill | teacher model | shrinking cost 5–20× |
| slice | prod | sft-12 | grpo-07 |
|---|---|---|---|
| billing | .74 | .81 | .90 |
| refunds | .69 | .77 | .92 |
| account access | .83 | .85 | .87 |
| escalations | .61 | .66 | .79 |
| non-English | .72 | .70 | .74 |
# OpenAI-compatible. Swap the base URL, keep your code. curl https://api.pofe.ai/v1/chat/completions \ -H "Authorization: Bearer $POFE_KEY" \ -d '{ "model": "acme/support-agent@grpo-07", "messages": [{"role":"user","content":"Card charged twice"}] }' # endpoint: support-agent # replicas 2→9 (autoscale) · p50 212ms · p99 640ms # traffic grpo-07 10% · sft-12 90% (canary) # adapters 41 on one base (multi-LoRA)
Runs, not slides. Method, data version, eval delta and cost on one row, for every experiment your team has ever launched.
| Run | Base model | Method | Dataset | Eval Δ vs base | Curve | Compute | Status |
|---|---|---|---|---|---|---|---|
| support-agent-grpo-07 | Qwen/Qwen3-32B | GRPO | tickets-v4 | +17.4 pts | 165 GPU-h | training | |
| claims-extract-dpo-04 | meta-llama/Llama-3.3-70B-Instruct | DPO | claims-v7 | +9.1 pts | 118 GPU-h | done | |
| sql-copilot-grpo-12 | Qwen/Qwen3-8B | GRPO | sql-verifier-v2 | +21.8 pts | 39 GPU-h | done | |
| icd10-coder-sft-03 | google/gemma-4-31B-it | SFT | notes-deid-v5 | +14.2 pts | 23 GPU-h | done | |
| brand-voice-kto-02 | zai-org/GLM-5.3-Flash | KTO | feedback-q3 | +6.3 pts | 14 GPU-h | done | |
| kb-embed-ft-02 | nvidia/Nemotron-3.5-Embed-1B-BF16 | SFT | kb-pairs-v3 | +6.8 pts | 6 GPU-h | done | |
| router-distill-01 | Qwen/Qwen3-8B ← deepseek-ai/DeepSeek-V4-Flash | SFT | router-traces | n/a | queued | est. 56 GPU-h | queued |
On your own GPUs or reserved capacity, inference load follows your users' day. Post-training is batch work: preemptible, checkpointed every 15 minutes, happy to run at 03:00. Scheduled into the quiet hours, idle GPU-hours become models.
| Hour | Average inference load | Nodes training |
|---|---|---|
| 00:00 | 13% | 10 of 10 |
| 01:00 | 10% | 10 of 10 |
| 02:00 | 9% | 10 of 10 |
| 03:00 | 8% | 10 of 10 |
| 04:00 | 15% | 10 of 10 |
| 05:00 | 21% | 10 of 10 |
| 06:00 | 27% | 10 of 10 |
| 07:00 | 38% | 7 of 10 |
| 08:00 | 50% | 0 of 10 |
| 09:00 | 58% | 0 of 10 |
| 10:00 | 67% | 0 of 10 |
| 11:00 | 77% | 0 of 10 |
| 12:00 | 85% | 0 of 10 |
| 13:00 | 86% | 0 of 10 |
| 14:00 | 90% | 0 of 10 |
| 15:00 | 88% | 0 of 10 |
| 16:00 | 84% | 0 of 10 |
| 17:00 | 77% | 0 of 10 |
| 18:00 | 70% | 0 of 10 |
| 19:00 | 60% | 0 of 10 |
| 20:00 | 49% | 1 of 10 |
| 21:00 | 40% | 5 of 10 |
| 22:00 | 29% | 10 of 10 |
| 23:00 | 20% | 10 of 10 |
The workspace and the SDK are the same system: researchers live in Python, product teams in the UI, and both see the same runs, evals and lineage. A gated run deploys to wherever you serve, and production feeds the next run.
import pofe ws = pofe.workspace("acme-support") ds = ws.datasets.get("tickets-v4").split(eval=0.05) # reward: resolved, on-policy, no invented refunds @pofe.reward def resolution(sample, completion): r = ws.judges["resolution@v3"].score(sample, completion) if pofe.checks.mentions_refund(completion) and not sample.refund_ok: return -1.0 return r run = ws.train( base="Qwen/Qwen3-32B", method="grpo", adapter="lora:64", data=ds.train, rewards=[resolution], kl=0.05, compute=pofe.Compute(gpu="h100", count=8, max_price=2.60), ) run.gate(ws.evals["release-v2"], must_beat="prod")
# a deploy target is any OpenAI-compatible server that can load an adapter target = pofe.targets.OpenAICompatible( endpoint="https://<your-inference-endpoint>/v1", runtime="vllm", # or "sglang", a POFE endpoint, or your provider ) dep = run.deploy(target=target, model_id="acme/support-agent", canary=0.10)
from openai import OpenAI client = OpenAI(base_url="https://<your-inference-endpoint>/v1", api_key=os.environ["INFERENCE_API_KEY"]) r = client.chat.completions.create( model="acme/support-agent", # the tuned adapter, called like any model messages=[{"role": "user", "content": "I was charged twice"}], )
# your logs, your bucket: nothing leaves your account logs = ws.connectors.request_logs("s3://acme-logs/inference/") fresh = logs.since("2026-10-01").where(outcome="resolved").redact_pii() ws.datasets["tickets-v5"] = ws.datasets["tickets-v4"].extend(fresh).dedupe() ws.schedule(run.recipe, data="tickets-v5", every="30d")
Month 24 for a team shipping custom models on open base models, at assumed market rates. The sliders are yours.
Assumed market rates: serverless tokens by model class, dedicated at $3.00/H100-hour, training at $5.00/B200-hour. Not POFE prices. Method · Economics of custom models.
Fine-tuned models routinely look better than they are because the eval leaked or a judge agreed with itself. POFE tests the evals too.
| rubric | judge κ | leak | 95% CI | status |
|---|---|---|---|---|
| resolution | 0.81 | 0.0% | ±1.2 | trusted |
| policy-adherence | 0.86 | 0.0% | ±0.9 | trusted |
| tone | 0.47 | 0.0% | ±3.8 | recalibrate |
| kb-grounding | 0.79 | 6.4% | ±1.6 | contaminated |
| refusal-safety | 0.93 | 0.0% | ±0.3 | trusted |

“We had three teams fine-tuning three different ways and no way to compare them. Six weeks after moving to POFE we retired our largest API contract, and the tuned model beats it on every slice we care about.”
VP of Machine Learning · Fortune 100 insurer
GRPO with a refund-policy reward on 180k resolved tickets. Replaced a prompt-chained frontier model.
+19 pts resolution · −81% costSFT on de-identified notes plus DPO from coder corrections, on Databricks next to the source data.
0.91 exact matchManaged engagement: eval design, synthetic hard cases, and an 8B distilled model deployed on-prem.
4.1× faster reviewSame platform underneath. Start self-serve and call us for the hard part, or start managed and take the keys when your team is ready.
For engineers who know what they want to train. Bring a model and a JSONL, and press run.
For organisations that need the outcome, not the tooling. Our research engineers own it end to end.
Reproducible experiments, plus Post-training algorithms 101: one page per algorithm, from SFT to GRPO.
Why most groups carry no gradient, and when smaller groups win.
Read → StatisticsPower curves for 1–8 point gains, paired vs unpaired.
Read → Cost modelA break-even model and which assumptions actually move it.
Read →Something else? Ask an engineer and you'll get a technical answer, not a demo request.
Post-training is everything that happens to a model after pre-training: supervised fine-tuning (SFT) on examples of the behaviour you want, preference optimization such as DPO, and reinforcement learning such as GRPO or PPO against reward models or verifiable checks. It is how a general open model becomes a specialist that follows your formats, policies and tone. Our complete guide covers it end to end.
More than 200 open-weight base and instruct models, from 8B-class models such as Qwen/Qwen3-8B and meta-llama/Llama-3.1-8B-Instruct to large mixture-of-experts models such as deepseek-ai/DeepSeek-V4-Pro, moonshotai/Kimi-K3 and zai-org/GLM-5.3, plus embedding, reranking and transcription models. Large MoE models are trained as LoRA adapters on multi-GPU nodes. You can also bring your own checkpoint from Hugging Face, S3, GCS, Azure Blob or a Unity Catalog volume.
No. POFE sources H100, H200 and B200 capacity across a network of clouds and neoclouds and schedules your run where it is cheapest and available. If you already have reserved capacity, a Kubernetes or Slurm cluster, or Databricks GPU compute, POFE runs there instead.
Not if you don't want it to. In VPC and on-prem deployments the control plane only sees run metadata; datasets, checkpoints and logs stay in your buckets and your accounts.
A fine-tuning API gives you a job endpoint. POFE gives you the whole loop: data curation and synthesis, every major training method, eval suites with judge calibration, GPU sourcing, and inference deployment, all versioned together so you can see exactly which data and which run produced which score. And you can take the weights with you.
Wherever you serve today: a POFE endpoint, your own vLLM or SGLang servers, or your inference provider through its OpenAI-compatible API and adapter upload. The weights are yours either way.
Yes. Managed post-training is a white-glove engagement where our research engineers own the outcome: they design the evals, build the data, run the experiments and hand you a model that clears agreed metrics, plus the full pipeline so your team can keep iterating.
The demo runs in your browser with sample data and takes about three minutes. When you're ready for your own data, an engineer will set up a private workspace with a baseline eval.