← All writing
MLOps · 6 min read · 7 Aug 2026

MLOps Tools Compared: Ten Users Versus Ten Thousand

The right MLOps stack is a function of scale, not fashion. Here is how I think about what to adopt when, and why copying a big company's tooling too early is a common mistake.

Cover image for the article: MLOps Tools Compared: Ten Users Versus Ten Thousand

The problem with copying big company stacks

I have noticed a pattern in how people plan their MLOps stack: they read about the tooling used by companies serving millions of predictions a day, then try to replicate it for a project with ten active users and one model. This is backwards. A feature store, a real time monitoring dashboard with drift alerts, and a kubernetes-based serving mesh solve problems you do not have yet, and they introduce problems you will have immediately: more code to maintain, more failure modes, more time spent on infrastructure instead of the model.

The honest starting question is not "what tools do serious ML teams use" but "what will actually break for me at my current scale, and what tool removes that specific pain." At ten users, the dominant risk is usually that you cannot reproduce your own results from three weeks ago, or that you silently trained on data that leaked from your test set. At ten thousand users, the dominant risk shifts to silent model degradation, inconsistent features between training and serving, and the cost of a bad deploy multiplying across a large user base before anyone notices.

Matching tooling to the failure mode you are actually exposed to is the whole game. Below I go through the stack layer by layer: experiment tracking, data and feature management, serving, and monitoring, and give a concrete sense of when each investment pays for itself.

Experiment tracking and reproducibility

At ten users, your problem is memory, not infrastructure. You tried five learning rates and two feature sets last month and you cannot remember which combination produced the model currently in production. The fix here is deliberately unglamorous: a spreadsheet or a lightweight tracking tool that logs the git commit hash, the data version, the hyperparameters, and the resulting metric for every run. This alone eliminates most reproducibility disasters. You do not need a hosted tracking server with team permissions and a model registry with approval workflows; you need a habit, supported by a tool that makes the habit low friction.

The concrete failure I want to avoid: you report a model with 91 percent accuracy, someone asks you to reproduce it six months later, and you get 87 percent because the train/test split was regenerated with a different random seed, silently changing which rows leaked adjacency information across the split boundary. A tracking tool that pins the exact data snapshot, not just the code, is the thing that prevents this. This matters more than which specific tracking library you pick.

At ten thousand users, the same idea scales into a requirement for a proper model registry with lineage: which training run, which data snapshot, which approval, is currently serving traffic. The reason is not vanity, it is auditability. If a model starts behaving badly for a subset of users, you need to trace back to the exact training configuration within minutes, not by grepping through old commit messages. The tool changes, but the underlying discipline, know exactly what produced what, is identical at both scales. Only the consequence of skipping it changes.

server rack data center

Data, features, and serving

Feature stores are the clearest example of a tool whose value is almost entirely a function of scale. At ten users, if you have one model and one prediction pipeline, a feature store solves a problem that does not exist: keeping training and serving features consistent across multiple models and multiple teams. Building one anyway means maintaining a database, a sync job, and an API for a consistency guarantee you already have by construction, because there is only one code path computing features.

At ten thousand users with, say, four models sharing twenty overlapping features across a recommendation system and a churn model, the calculus flips. Now you have two separate codebases computing "average purchase value over the last thirty days" and they will drift apart: one uses calendar days, one uses rolling 30-day windows anchored to the request timestamp, and the discrepancy quietly degrades both models without throwing an error. A feature store is the tool that forces a single, versioned definition. The trigger for adopting one is not a headcount number exactly, it is the moment you have more than one model consuming overlapping features computed by more than one pipeline.

Serving infrastructure follows the same logic. At ten users, a single script behind a simple API endpoint, restarted manually if it crashes, is entirely appropriate; a container orchestration platform with autoscaling and rolling deploys is solving for load and availability problems you do not have. At ten thousand users, especially with uneven traffic, a bad deploy at 2pm on a Tuesday can degrade the experience for thousands of concurrent users before a human notices, so canary deployments and automated rollback stop being nice-to-haves and become the mechanism that limits blast radius. The right test is always: what is the cost, in users affected and time to detect, of the failure mode this tool prevents.

Monitoring and the practical takeaway

Monitoring is where I see the most wasted effort in both directions. At ten users, an elaborate drift-detection dashboard tracking population stability index across forty features is mostly noise; with so few predictions, you will not have the statistical power to distinguish genuine drift from sampling variation, and you will chase false alarms. What you actually need at this scale is a simple log of predictions and, where available, outcomes, checked by a human on a weekly basis. Manual inspection at low volume beats automated alerting tuned on too little data.

At ten thousand users, manual inspection becomes impossible and the statistical power problem reverses: you now have enough volume to detect real, meaningful shifts in input distributions or output calibration, and an automated system that flags when a feature's distribution has moved beyond a sensible threshold, or when live accuracy on labelled feedback drops below a set floor, earns its complexity. The key design decision is choosing thresholds that reflect real business cost rather than statistical significance alone, since with enough data almost every distribution comparison will be "significant" without being meaningful.

My practical takeaway is to size every tool against the specific failure it prevents and the actual cost of that failure at your current scale, not against what a much larger team uses. Start with the boring layer: reproducible experiment logs and a script that pins data versions. Add a feature store only when more than one model shares features computed by more than one pipeline. Add automated deployment safeguards when a bad release can plausibly harm users faster than a person can notice. Add statistical monitoring only once you have enough volume for the statistics to mean something. Adopting tools in this order costs you almost nothing extra later and saves you a great deal of wasted infrastructure now.

engineer looking at dashboard monitors
← All writing See the project case studies →