The Speed Problem in Production ML

John Rotter - Forward Deployed Engineer
by John Rotter

Three places speed disappears between a good idea and a live decision.

August 28, 2026

I spend most of my week embedded with AI and ML engineering teams, getting their models into production. One pattern holds across all of them: models get better through fast iteration.

Production is where the useful information lives. Real traffic tells you what the model gets wrong, what changed since you trained it, and what to fix next. A team that ships in a day gets that answer tomorrow. A team that ships quarterly waits a season to find out whether it was right at all, and every handoff, approval, and manual step along the way pushes the answer further out.

Fraud makes it concrete. Attackers change tactics in days. Deploy a new signal the same afternoon you spot the pattern and you're adapting while the attack is still live. Take a quarter and you're learning about it in a meeting after it's too late.

The model matters less than the loop around it: idea to production, feedback, next version. What decides who wins is how fast that loop turns, and whether the data is still fresh when it arrives.

You probably already recognize this

I see some version of these on almost every team I sit with.

A data engineer rewrites the training dataset's feature logic so the production system can serve it in a different language than it was prototyped in. The two versions drift when the offline job buckets a timestamp one way and the online path buckets it slightly differently. Six weeks later the model is quietly worse and no one can say why. On a pricing model, that drift means prices that are slightly wrong on every transaction.

An ML engineer wants to improve a feature that's already live. First she has to work out what depends on it and what breaks if she changes it. That takes days to assemble, so the safe move is to leave it alone. Good features rot this way. The risk model keeps scoring this week's applicants on last quarter's behavior and everyone knows it's stale. No one wants to be the one who touched it.

A team finishes a retrain that beats the live model on every metric they track. Everyone's excited for about a day. Then shipping it turns into a week of manual effort: reconfigure the infrastructure, update the serving setup, move traffic over, watch nothing fall over. The better model sits on a branch, finished, helping no one, while the team rebuilds the same release path they built last time.

If any of that feels familiar, you have a speed problem.

The speed problem is three problems

When I dig in, slowness is almost always three separate problems wearing one complaint. Most teams have all three.

Data iteration speed is how fast a new signal goes from "we should use this" to live and serving, and how safely you can change it once it's there.

Handoff speed is the time lost as the work crosses from data engineers to data scientists to ML engineers to platform engineers, each with their own tools and their own idea of what the feature means.

Deployment speed is how fast an approved, retrained model actually starts serving once the data and infrastructure are ready.

They hide in different parts of the org, which is why slowness never has one owner. All three tax the same thing: how often you get to make the product better.

The iteration gap

The version I see most starts with a data scientist and a validated signal, a feature that probably lifts the model. Finding it takes an afternoon.

Getting it in front of the live model can take a quarter.

The idea was never the hard part. Everything after the notebook is the hard part: rebuilding the feature for the serving path, making the data behind it dependable, and shipping the pipeline that carries it. A two-hour test turns into an engineering project. The lift it would have delivered sits idle for months.

Multiply that across every promising feature and the cost stacks up fast. Finding good signals is not what teams struggle with. Getting them from experiment to production is.

The handoff tax

Follow one feature through a normal stack. A data engineer defines it in Python against the warehouse. A data scientist or ML teammate reimplements it against whatever serves the model. It gets handed to the platform engineers who own serving, then to whoever owns monitoring. It's a slow tax you pay on every idea, and again on every new model, so the bill grows with everything you add.

The tax compounds through repetition. A team gets a signal working for one model. Months later a second team needs nearly the same thing and starts from zero, because nothing tells them the work exists or that it can be trusted. There's no shared catalog of definitions already proven in production, so every new model starts from a blank page and pays the full relay again. Creating features comes easily to every team I sit with. Finding and reusing the ones the company already built is the part nobody's stack supports.

The deployment gap

Speed leaks in one more place: after the model is already good.

Shipping a new model version is usually a manual project. Teams reconfigure infrastructure, rewire the application, and move traffic by hand. Slow deployment costs you safety as well as speed.

Shadow mode is the safeguard that gets dropped first. A new model scores real traffic while nothing acts on its output, so you can compare it against the live one before committing. That check takes time nobody has when shipping already eats a week. Teams either ship on faith or stop shipping.

Stale data is slow data

A feature is only as good as the data behind it the instant the model reads it. A batch-first stack serves last night's numbers as if they were today's. Take a common example: a customer's transaction count over the last hour can't be computed by an overnight job. For a pricing model dependent on demand at the moment the page finishes loading, or an agent deciding what to do about an account right now, an hour-old number is a guess. Shipping fast on stale data only gets you to the wrong answer sooner.

What good looks like

Create and ship new features and models with the friction pulled out.

Someone has an idea in the morning and it's changing production decisions by that afternoon. The feature is defined once, in Python or SQL, and that one definition feeds both training and serving, so skew never gets a chance to start. The model reads data computed fresh from source, acting on what's true right now instead of last night's numbers. Because anyone can see what a change will touch before they make it, people improve features that already work. Shipping a new version is a branch and an apply: it runs through CI, it's reversible, and shadow-testing is cheap enough that the safe move is also the fastest one. The model gets sharper every week instead of drifting.

That's what Chalk's Context Engine is built to do: one definition of your data, carried from training through to real-time inference, computed fresh from source, with lineage and governance in the same system. What you get is a loop you can move fast in and still trust. You also get the room to add the next model or use case without standing up another team to babysit it. That's how a team keeps getting better as it grows instead of slowing down under its own weight.

Ship ML like you ship code

The best AI and ML teams I work with share one habit: they ship models the way strong engineering orgs ship code. The loop is fast, governed, and repeatable, on data that's fresh at the moment it's used.

Most groups can build a model that works. The ones that win move a new signal to a live, trusted decision fastest and keep their models on current data while they do it.

Getting there is rarely something you do alone. That's the work my team does. Chalk's forward deployed engineers are embedded in your codebase alongside the people building on Chalk. Our team includes Putnam winners and former Jane Street quants, and we've watched this loop break and get rebuilt across enough production systems to find the bottleneck fast. We stay until shipping an idea takes hours instead of a quarter.

Iteration speed is the first thing I look for with a new team. It usually explains who's pulling ahead and who's still waiting on their own pipeline.

Want to stay up-to-date with Chalk?

Subscribe for updates on what we’re building (and shipping!) at Chalk