Everything so far has been pieces. This lesson is the whole project: what actually happens between "we decided to fine-tune" and "it's serving traffic" — including the two things nobody puts in a plan, which are how you'd know it was a mistake and how you'd undo it.
Hosted or self-hosted?
| Hosted fine-tuning | Self-hosted (open weights) | |
|---|---|---|
| You provide | a JSONL file and a config | hardware, training code, serving stack |
| You get | a private model id behind an API | the weights, portable anywhere |
| Ops burden | none | real and ongoing |
| Cost shape | per token, at a premium over the base model | GPU time — cheap at volume, wasteful when idle |
| Control | whatever the provider exposes | everything, including LoRA rank and quantization |
| Data residency | the provider's regions and terms | wherever you run it |
Sensible default: start hosted. It removes every variable except the two that decide the project — is the dataset good, and does the result beat a prompt. Move to self-hosting when volume, residency or a specific open model demands it.
Baseline before anything
The single most important sentence in this lesson: build the evaluation set and score the prompted baseline before you train anything.
Not because it is tidy, but because without it the project is unfalsifiable. "The fine-tune is good" means nothing without "compared to what?" And the outcome teams least expect is the most common one: the prompted baseline is already good enough, and the project ends there. That is a success. You saved six weeks.
The baseline should be a genuine attempt — a proper system prompt, well-chosen few-shot examples, a sensible temperature — not a deliberately weak strawman that your fine-tune is guaranteed to beat.
What the timeline really looks like
| Phase | Typical duration | What dominates |
|---|---|---|
| Eval set + baseline | ~1 week | deciding what "good" means, and labelling |
| Dataset | 3–6 weeks | human labelling, the guide, agreement, de-duplication |
| Training | hours to days | waiting; a couple of config sweeps |
| Evaluation | ~1 week | task quality, regression, safety, cost |
| Rollout | 1–2 weeks | shadow running and a gradual ramp |
| Ownership | forever | re-tuning when the base model or the requirements move |
Data is weeks; training is hours. If a plan you are shown reverses that proportion, the plan hasn't met a dataset yet — and saying so in an interview is a strong signal.
Versioning: what to record
A fine-tuned model without its provenance is unreproducible. Six months later someone asks why v3 behaves differently from v2, and the weights alone cannot answer.
model: support-reply-v3
base_model: <exact base version string> # NOT a floating alias
dataset:
version: support-2026-08
examples: 2,847
built_from: tickets 2026-01..2026-07, agent-reviewed
split: grouped by account + time (70/15/15)
training:
method: LoRA
rank: 16
alpha: 32
epochs: 2 (early stop on val_loss)
learning_rate: 1.5e-4
eval:
task_win_rate_vs_prompted: 61%
grounding_violations: 0.4% (baseline 0.6%)
general_regression: none > 1pt
cost_per_reply: -38%
p95_latency: -12%
approved_by: <name>, 2026-08-29
rollback_to: prompted-v11Note the last line. Every model version needs a named thing to roll back to, and it should be written down before launch rather than improvised during an incident.
Rolling it out
A model version is a deploy. Treat it like one.
- Shadow run. Send a copy of live traffic to the new model, serve none of its responses, and diff against production. It costs only compute and it catches the failures your eval set missed — which, by definition, are the ones you didn't think of.
- Ramp. 5% → 25% → 100%, watching quality and cost at each stage, not just errors.
- Keep the old path warm. Rollback should be one config change, not a redeploy.
- Watch behavioural signals, not just dashboards — edit rate, escalation rate, retry rate. They move before anyone files a complaint.
Wait — it scores better but users say it's worse
This happens often enough that it deserves its own section. Three causes, all common:
1. Catastrophic forgetting. The model got better at the task and worse at everything around it — ordinary conversation, refusals, a second language, follow-up questions. Your task eval set is blind to all of it. This is the most common answer.
2. Train-serve mismatch. The model was trained without the system prompt or context block that production sends. It excels on the eval harness (which mirrors training) and behaves oddly in the app.
3. An unrepresentative eval set. If it was authored rather than sampled from real traffic, a high score means "good at the cases we imagined".
A higher score on a narrow eval set is fully compatible with a worse product. The fix is structural: always run a general-capability regression set alongside the task set (lesson 7 gives you one), and always shadow-run before switching.
💡 And when it happens: roll back first, investigate second. A five-point eval gain is not worth an unquantified regression, and rolling back costs one config change.
Stop conditions
A project plan that can only end in shipping is not a plan. Write these down at the start, when nobody is emotionally invested:
- Before training: if the prompted baseline already meets the bar, stop. Ship the prompt.
- After the first 300 examples: if the measured gain from 300 is flat, more data probably won't save it — the task definition or the approach is wrong.
- After evaluation: if it doesn't clearly beat the baseline on task quality while holding general capability, safety and cost, don't ship it. The weeks already spent are not a reason to ship — that is the sunk-cost fallacy with a GPU bill attached.
🎯 Selection-round radar: "Walk me through a fine-tuning project" rewards structure over detail. Lead with eval set and prompted baseline first, be honest that data is weeks and training is hours, insist on a general-capability regression check, and finish on shadow run, gradual ramp, one-switch rollback. Naming a stop condition unprompted is the detail that lands.
Common mistakes
- Training before an eval set exists.
- Comparing against a deliberately weak prompted baseline.
- Planning days for data and weeks for training.
- Pinning to a floating base-model alias instead of an exact version.
- No recorded dataset version, so v2 can never be reproduced.
- Switching all traffic at once with no shadow phase.
- Shipping a marginal result because the project already cost six weeks.
- No named rollback target agreed before launch.
Quick recap
| Concept | One-liner |
|---|---|
| Hosted vs self-hosted | start hosted; self-host for volume, residency or an open model |
| Baseline first | without it the project is unfalsifiable — and it often ends the project |
| Timeline | data is weeks, training is hours |
| Versioning | base version, dataset version, config, eval scores, rollback target |
| Rollout | shadow → 5% → 25% → 100%, with one-switch rollback |
| Better score, worse product | forgetting, train-serve mismatch, or an unrepresentative eval set |
| Stop conditions | written before starting, so sunk cost can't make the decision |
Practice Zone — PYQs from real selection rounds
Six MCQs, then two tasks: plan a project end to end with stop conditions, and debug a fine-tune that scores well and feels worse.
What is the practical difference between a hosted fine-tune and self-hosting your own?
Asked in

Before launching any training run, the single most valuable thing to have ready is:
Asked in

Your fine-tuned model beats the prompted baseline on your eval set but users complain it is worse. Most likely cause?
Asked in

What is the safest way to roll out a fine-tuned model?
Asked in

What should be version-controlled for a fine-tune to be reproducible?
Asked in

A privacy consideration specific to fine-tuning that RAG avoids is:
Asked in

Hands-on tasks:
Your team has decided to fine-tune a model to write product descriptions in a retailer's brand voice. Lay out the project from decision to production, including what would make you stop.
Asked in

A fine-tuned classifier scores 94% on the task eval set (baseline 89%) but support tickets say answers are 'weird' since launch. Walk through the diagnosis.
Asked in

FAQ
How often should a fine-tuned model be retrained?
Driven by triggers rather than a calendar: the base model version changes, the task or brand requirements change, the input distribution shifts, or monitoring shows quality drifting. A quarterly review of those triggers is a reasonable default cadence.
Can I A/B test a fine-tuned model against the prompted version?
Yes, and it is the strongest evidence available — you get behavioural signals from real users rather than proxy scores. Do it after shadow running and a small ramp, and pick your success metric in advance so the result can't be argued into acceptability afterwards.
What happens to my fine-tune when the provider deprecates the base model?
It goes away with it — which is the version-lock risk in its sharpest form. Providers give notice, but the work is yours: re-run data prep, training and evaluation on the new base. Budget for it, and keep the dataset and config versioned precisely so it's a re-run rather than a rebuild.
Next lesson: how you actually know any of this is working — Lesson 7: Evaluating LLMs →


