What fine-tuning actually changes
Fine-tuning is the one technique on this page that touches a model's weights. Prompting, retrieval and caching all leave the weights exactly as they were and change what the model sees or how fast it answers. Fine-tuning is different: you train further on top of a base model, and the resulting weights are what you're now serving. That's the entire reason it's expensive to get wrong. You're not adjusting an input, you're changing the thing itself.
Which is exactly why it should be the last thing you reach for, not the first.
The ladder, and the three reasons to climb it
Prompt, then RAG, then caching, then fine-tune, in that order, and only past whichever step actually stops solving the problem. Most teams reaching for fine-tuning are actually trying to fix one of three things that don't need it at all: the model doesn't know something (that's retrieval), the model is slow or expensive per call (that's caching, or a smaller model), or the model's tone drifts (that's usually a better system prompt).
The three reasons that genuinely do need it: a rigid structured output a prompt can't hold consistently at scale; cost or latency distillation, where a big model already proves the task and you want a small one doing it cheaply; and a narrow domain vocabulary or tone a few-shot prompt only approximates.
Bedrock's fork: one API, four jobs
Say yes, and Bedrock's CreateModelCustomizationJob API asks which of four jobs you actually want, via its customizationType parameter. Match the reason to the job, not the other way around:
- Structured output →
FINE_TUNING, supervised on your own labelled input/output pairs. - Cost or latency distillation →
DISTILLATION. No training pairs to write: point Bedrock at a stronger teacher model and a weaker student, and it generates the synthetic set. GA May 2025, and AWS's own figures put distilled models at up to 500% faster and 75% cheaper than the teacher, under 2% accuracy loss on retrieval-style tasks. - Narrow domain tone →
CONTINUED_PRE_TRAININGif you have unlabelled domain data to accumulate, orFINE_TUNINGif you have labelled examples of the register you want. - A fourth job,
REINFORCEMENT_FINE_TUNING, is Nova-only today: you supply a reward function instead of a fixed answer key, which is the most direct fit for structured output and tool-calling reliability specifically, since "did the tool call parse" is gradable programmatically.
Serving it forks again, into three different bills
Bedrock's own documentation is plain: "if you customized a model, you must purchase Provisioned Throughput to be able to use it." That's the universal default: reserved capacity, billed hourly, whether a request arrives or not. Priced today, Amazon Nova Micro and Nova Pro cost the same $60.50/hr per model unit with no commitment, despite Micro costing a fraction of Pro on demand, because you're renting a model unit, not a token budget.
Since 16 July 2025 a narrower on-demand exception exists: Custom Model Deployment, for specific Nova models (Lite, 2 Lite, Micro, Pro, all us-east-1) and Meta Llama 3.3 70B Instruct (us-west-2), priced at the base model's own token rate, but only if the underlying model was customised on or after that date (15 September 2025 for Llama). Everything else, every Titan customisation, every model customised before those dates, still has exactly one way to serve it.
A third path skips CreateModelCustomizationJob entirely: Custom Model Import, for weights you trained yourself outside Bedrock. Billed per Custom Model Unit-minute, currently $0.05718 in us-east-1, scaling to zero five minutes after the last invocation, with a real cold start (seconds to a couple of minutes) as the trade-off.
Full write-up
The complete pricing table, the worked cost maths (steady 24/7 traffic vs a genuinely bursty workload), and where the sourcing came from: You probably don't need to fine-tune.