← Blog

MLOps in 2026: A Practical Platform Guide

What MLOps actually requires in production: the platform layers, the lifecycle, and how to build an MLOps stack that ships and stays reliable.

MLOps in 2026: A Practical Platform Guide — hero image

Most teams arrive at MLOps the same way: a model that worked beautifully in a notebook starts behaving strangely in production, and nobody can say why. The training data has drifted, the feature that fed it is computed two different ways in two different places, and the only person who knows how to retrain it is on vacation. MLOps is the discipline that exists to make that situation not happen. It is the platform, the lifecycle, and the operational habits that let a model team ship models the way a good engineering team ships software: repeatably, observably, and without heroics.

This is a platform guide, not a definition piece, so we'll spend most of it on the thing an ML platform lead actually has to decide: which layers your stack needs, what tool goes in each one, what you build versus buy, and how the pieces wire into a reference architecture you can act on. We don't sell an MLOps product. We build ML systems for a living, so we've stood up these platforms, watched the wrong tool choice cost a quarter, and learned where the traps are.

What is MLOps, really — and the problem it solves

Answering what is MLOps in one sentence: it's the practice of applying DevOps principles (version control, automated testing, continuous delivery, and production monitoring) to machine learning systems, where the artifact you ship is not just code but a trained model and the data it learned from. That extra dimension is the whole reason MLOps is its own discipline. A web service has one thing that can change underneath it: the code. An ML system has three: the code, the model weights, and the live data distribution. Any of them can drift independently, and a change in one can silently degrade the other two.

So the problem MLOps solves is reproducibility under three moving targets. Given a model serving traffic today, can you answer: which exact code, which data snapshot, and which hyperparameters produced it; whether the features it sees in production match the ones it was trained on; and whether the world it's predicting against still looks like the world it learned from. If you can't answer those three questions on demand, you don't have an MLOps problem you can patch — you have a platform you haven't built yet.

The six layers of an MLOps platform

Every serious MLOps platform decomposes into six layers, and the most useful thing a platform lead can do early is name them explicitly, because each layer is a separate build-or-buy decision with a separate failure mode. The mlops architecture below is the spine the rest of this guide hangs off: data and versioning at the base, a feature layer above it, training and experiment tracking, CI/CD that promotes models, a serving layer, and a monitoring loop that closes back to retraining.

The six layers, bottom to top — and the loop that closes back
Data + versioning
DVC / LAKEHOUSE
Feature store
OFFLINE + ONLINE
Training + tracking
MLFLOW / W&B
CI/CD + registry
PROMOTE MODELS
Serving
BATCH / REALTIME
Monitoring
DRIFT -> RETRAIN

Read it as a stack with a feedback edge. Data flows up through features into training; a trained model is promoted through CI/CD into serving; monitoring watches serving and, when drift crosses a threshold, triggers retraining back at the top. The layers people skip when they're new to this are the feature store and the monitoring loop — which is exactly why train/serve skew and silent decay are the two failures that show up most. We'll take each layer in turn, because the tooling and the trade-offs are genuinely different at each level.

Data and versioning: the layer that makes everything else reproducible

The base layer answers one question: given a model, what exact data made it. Code versioning is solved — Git does it. Data versioning is the unsolved-by-default part, and the tool most teams reach for is DVC, which keeps large datasets out of Git while tracking their content hashes alongside the code that consumed them. The lakehouse platforms solve the same problem at a different scale: Databricks and Snowflake both offer time-travel on tables, so "the training set as of last Tuesday" is a query, not an archaeology project. Underneath, dbt handles the transformation lineage so you can trace a feature back to the raw rows that produced it.

Data validation belongs in this layer too, and skipping it is how garbage reaches the model unnoticed. Great Expectations lets you assert schema and distribution checks as part of the pipeline (column types, null rates, value ranges) so a malformed upstream feed fails loudly at ingestion instead of quietly poisoning the next training run. The principle for the whole layer: every dataset that touches a model gets a version and a validation gate, the same way every code change gets a commit and a test.

dvc.yaml yaml
# A DVC pipeline stage makes the data->feature->train chain reproducible.
# `dvc repro` re-runs only the stages whose dependencies changed, and
# every output is content-hashed so a model maps to exact input data.
stages:
  validate_raw:
    cmd: python validate.py data/raw/events.parquet
    deps:
      - data/raw/events.parquet      # tracked by content hash, not Git
      - validate.py
    outs:
      - data/validated/events.parquet
  build_features:
    cmd: python features.py
    deps:
      - data/validated/events.parquet
      - features.py
    outs:
      - data/features/train.parquet
  train:
    cmd: python train.py
    deps:
      - data/features/train.parquet
      - train.py
    params:
      - train.learning_rate          # versioned hyperparameters
      - train.max_depth
    outs:
      - models/model.pkl

The feature store: where train/serve skew goes to die

Train/serve skew is the most expensive bug in production machine learning, and the feature store is the layer built to eliminate it. The skew happens because feature logic gets written twice: once in the training pipeline, usually in pandas or Spark over historical data, and again in the serving path, usually in application code computing the same feature live. The two implementations drift (a different rounding rule, a timezone bug, a slightly different aggregation window) and the model sees inputs in production it never saw in training. Accuracy quietly tanks and no dashboard tells you why.

A feature store fixes this by making feature definitions write-once and serving them from two synchronized stores: an offline store (the warehouse) for point-in-time-correct training data, and an online store (a low-latency key-value layer) for serving. The same definition feeds both, so the training feature and the serving feature are the same code by construction. Feast is the open-source standard here and pairs with whatever warehouse and online store you already run; Tecton is the managed equivalent with streaming features built in; Databricks and Vertex AI ship their own feature stores inside their platforms. The detail that separates a real feature store from a glorified cache is point-in-time correctness — joining labels to features as they existed at prediction time, not as they look now, which is the only way to avoid leaking the future into your training set.

One feature definition, two stores — the skew-killer
FEATURE STORE: WRITE ONCE, SERVE TWICEFEATURE DEFINITIONone transform, version-controlledOFFLINE STOREwarehouse, point-in-time joinsfeeds TRAININGONLINE STORElow-latency KV, sub-10ms readsfeeds SERVINGTRAINING PIPELINEhistorical, batchSERVING ENDPOINTlive, per-requestSame definition both paths => zero train/serve skew by construction
A single feature definition materializes to an offline store for point-in-time-correct training and an online store for low-latency serving. Because training and serving read the same definition, the feature can't drift between them.

Training and experiment tracking: making runs reproducible and comparable

The training layer has two jobs that people conflate: orchestrating the compute that runs a training job, and tracking what each run produced so you can compare them. Experiment tracking is the one teams underbuild and regret. MLflow and Weights & Biases are the two standards; both log parameters, metrics, and artifacts per run, so six weeks later you can answer "which run produced the model in production and what was its validation AUC" without spelunking through Slack. MLflow's edge is its model registry, which becomes the handoff point to CI/CD; Weights & Biases leans harder into rich visualization and sweep orchestration.

Orchestration is the other half. For DAG-shaped pipelines, Airflow is the incumbent and Kubeflow Pipelines is the Kubernetes-native option that keeps training reproducible as containerized steps. Metaflow, originally from Netflix, optimizes for the data scientist's ergonomics — you write Python, it handles the orchestration and versioning underneath. For distributed training and hyperparameter search, Ray and Ray Tune scale a single training script across a cluster without rewriting it. The rule we hold to: a training run that isn't logged didn't happen, because in three months you won't be able to reproduce it, and an unreproducible model is a liability the first time it misbehaves.

train.py python
# Experiment tracking with MLflow: every run logs params, metrics, and
# the model artifact, then registers it so CI/CD has a promotion target.
import mlflow
import mlflow.sklearn
from xgboost import XGBClassifier

mlflow.set_experiment("churn-model")

with mlflow.start_run() as run:
    params = {"max_depth": 6, "learning_rate": 0.1, "n_estimators": 400}
    mlflow.log_params(params)              # reproducible hyperparameters

    model = XGBClassifier(**params).fit(X_train, y_train)
    auc = roc_auc_score(y_val, model.predict_proba(X_val)[:, 1])

    mlflow.log_metric("val_auc", auc)      # comparable across runs
    mlflow.sklearn.log_model(model, "model")

    # Register only if it clears the gate — CI/CD reads the registry,
    # not a model file someone emailed around.
    if auc >= 0.82:
        mlflow.register_model(
            f"runs:/{run.info.run_id}/model", "churn-model"
        )

CI/CD for models: the mlops pipeline that promotes the right one

An mlops pipeline is where ML CI/CD diverges hardest from software CI/CD. In software, the pipeline tests code and ships it. In ML, the pipeline has to test the model (its accuracy on a held-out set, its fairness across segments, its latency under load) and decide whether this model is better than the one currently serving. That last gate is the one without a software analog: you're not asking "does it pass" but "does it beat the incumbent," and the answer requires a champion-challenger comparison on the same evaluation set.

The mechanics: a training run registers a candidate in the model registry; CI evaluates it against the held-out set and the production champion; if it clears the bar, it's promoted to staging, shadow-tested against live traffic, then rolled out behind a canary. This is also where mlops best practices earn their keep — gate on segment-level metrics, not just the aggregate, because a model that improves overall AUC while degrading on your highest-value customer cohort is a regression dressed as progress. Building this same monitoring discipline upstream is why we treat the registry, not a model file, as the single source of truth; teams that promote by copying a pickle file around eventually ship the wrong one.

CI/CD stage What it checksGateTool
Data validation Schema, null rates, distribution Hard fail on violation Great Expectations
Model quality AUC / F1 on held-out set Above absolute threshold MLflow eval + CI
Champion-challenger Candidate vs production model Beats incumbent, no segment regression Registry + eval job
Shadow / canary Live traffic, no user impact Latency + agreement in band KServe / Seldon traffic split
Rollout Progressive traffic shift Auto-rollback on metric breach Argo / GitHub Actions
An ML promotion pipeline reads top to bottom; a candidate only reaches serving if it clears every gate. The champion-challenger gate is the one with no software-CI equivalent.

Serving: batch, real-time, and streaming patterns

Serving is where the model meets traffic, and the first decision is the access pattern, because it dictates the whole rest of the layer. Batch serving scores a table on a schedule (a nightly churn score written back to the warehouse) and it's the cheapest, most reliable pattern; if your prediction can be a few hours stale, do this and skip the complexity. Real-time serving exposes the model behind an HTTP or gRPC endpoint for per-request inference, which you need when the prediction has to reflect the current request. Streaming serving scores events off a queue continuously, which fits fraud and anomaly use cases where latency matters but a request-response shape doesn't.

Tooling tracks the pattern. BentoML packages a model and its dependencies into a deployable service with batching and adapters built in, and it's the pragmatic default for most real-time needs. KServe and Seldon Core run on Kubernetes and give you autoscaling, canary traffic splitting, and multi-model serving for teams already living in that world. The managed endpoints (SageMaker, Vertex AI, and the lakehouse model serving from Databricks) trade control for not running the infrastructure yourself. The under-discussed serving cost is feature retrieval latency: in a 2026 platform we tuned, the gradient-boosted model inference ran at 6ms p95 while fetching its features from the online store took 40ms, so feature retrieval, not the model, set the real p95. That's the other half of why the feature store's online layer matters.

Where the latency budget actually goes on a real-time prediction
Feature retrieval (online store)
40ms (illustrative p95)
Often the dominant cost — and the one teams forget
Model inference (gradient-boosted)
6ms (illustrative p95)
The part everyone optimizes; rarely the bottleneck
Network + serialization
12ms (illustrative p95)
Gateway hop, payload encode/decode
Post-processing + logging
4ms (illustrative p95)
Score calibration, prediction logging

Monitoring and drift: closing the loop

Monitoring is the layer that separates a deployed model from an operated one, and it watches three distinct things that get lumped together. Operational metrics are the easy ones (latency, throughput, error rate) and your existing stack of Prometheus, Grafana, Datadog, and OpenTelemetry already handles them. Data drift is the input distribution shifting away from training: the features the model sees today don't match the ones it learned from. Concept drift is subtler and worse, because the relationship between inputs and the target has changed, so the model's logic is now wrong even though its inputs look normal. The reason this is hard is the feedback delay: you often don't get ground-truth labels for days or weeks, so you have to detect trouble from the inputs before the accuracy numbers can confirm it.

Evidently is the open-source workhorse for drift reports and dashboards, computing population-stability and distribution-distance metrics on your feature and prediction streams; Arize and the open-source Phoenix cover the same ground with a hosted, ML-observability-first posture. The discipline matters more than the tool: alert on input drift early, treat a drift alert as a signal to investigate rather than an automatic retrain trigger, and tie the loop back to your training pipeline so a confirmed shift can kick off a fresh run. We go deeper on the statistical tests and thresholds in our piece on data drift detection, which is worth reading before you wire up alerts, because a badly-tuned drift monitor that cries wolf is worse than none at all.

What a monitored model emits — the four signals to wire up (2026)
p50/p95/p99
OPERATIONAL
Latency, throughput, error rate — your existing APM
PSI / KL
DATA DRIFT
Input distribution distance vs training baseline
delayed
CONCEPT DRIFT
Accuracy vs labels — arrives days/weeks late
per-segment
FAIRNESS
Metric splits by cohort, not just aggregate

Build vs buy: which layers to own and which to rent

Nobody builds all six layers from scratch anymore, and nobody should buy a single monolithic platform that claims to do all six either. The first wastes a year; the second locks you into one vendor's opinion at every layer. The honest framing is per-layer. The integrated platforms (Databricks, SageMaker, Vertex AI) give you most of the stack with one bill and one support contract, which is the right call when your team is small and your priority is shipping a first model rather than building a platform. The composable open-source path of MLflow plus Feast plus Evidently plus BentoML on your own Kubernetes gives you control and avoids lock-in, at the cost of being the integrator yourself and owning the uptime of the glue.

Lean integrated (Databricks / SageMaker / Vertex AI)

Small team, first models, priority is shipping not platform-building, fine with one vendor's opinion per layer. You get the whole stack with one contract and you write zero glue. The cost is per-call pricing and a soft ceiling on customization — but most teams hit production faster this way and earn the right to specialize later.

Composable open-source (MLflow + Feast + Evidently + BentoML)

You have platform engineers, real lock-in or compliance pressure, and workloads weird enough that a one-size platform pinches. You own control and avoid the vendor's ceiling — and you own being the integrator, patching the glue, and carrying the on-call. Worth it at scale; premature for a two-person ML team shipping their first model.

A reference MLOps architecture you can act on

Pulling the layers together, here's a reference mlops platform that a team of a few engineers can actually stand up and operate, biased toward the composable open-source path because it's the one that needs the diagram — the integrated platforms hand you most of this pre-wired. The shape: versioned data feeds a feature store; the feature store feeds both training and serving; training logs to a tracker and registers to a registry; CI/CD promotes from the registry through gates into serving; and monitoring watches serving and closes the loop back to training when drift is confirmed.

Reference MLOps architecture — the full loop, wired
REFERENCE MLOPS ARCHITECTUREDATA + VERSIONDVC, dbt, lakehouseFEATURE STOREFeast / TectonTRAININGKubeflow, Ray, MLflowREGISTRY + CI/CDMLflow, Argo, gatesSERVINGBentoML, KServeonline features served per-requestMONITORINGEvidently, Arize, Grafanaconfirmed drift => retrainForward path solid; feedback loop dashed. Each box is an independently adoptable layer.
A concrete, composable reference stack. Solid edges are the forward path from data to served predictions; the dashed edge is the monitoring feedback loop that triggers retraining when confirmed drift crosses a threshold. Every box maps to a named tool you can adopt independently.

The ML lifecycle MLOps actually automates

The platform exists to automate a lifecycle, and naming the steps makes it obvious which ones you've left manual. The loop runs: problem framing and data collection; feature engineering; experimentation and training; evaluation against the incumbent; deployment through CI/CD; monitoring in production; and retraining when drift or a fresh label batch demands it. The maturity of a team isn't how good its models are; it's how many of those steps run without a human in the path. A team where retraining means manually re-running a notebook is at the start; a team where a confirmed drift alert kicks off a gated, auto-evaluated retrain that a human only approves is near the end.

There's a deliberate order to automating these steps, and it's not the order people instinctively reach for. Automate experiment tracking and the model registry first, because they're cheap and they make everything downstream auditable. Automate CI/CD promotion gates next, because that's where the wrong model reaches users. Automate the monitoring loop third. Save fully-automated retraining for last and only after you trust the gates, because an automated retrain feeding an automated promotion with weak gates is a machine for shipping regressions at speed. The infrastructure decisions underneath all of this (what compute, what orchestration, what storage) deserve their own treatment, which we give in our guide to ML infrastructure, because the platform layers in this guide all run on top of choices made there.

MLOps anti-patterns: where platforms quietly fail

After enough of these builds, the failures rhyme, and recognizing them early is worth more than any single tool choice. The over-engineered platform is the most common: a two-person team that builds a six-layer Kubernetes-native stack to serve one batch model that a scheduled SQL job and a tracked notebook would have handled, then spends its quarter operating the platform instead of improving the model. The opposite failure is the notebook-to-prod hop, where a model goes from a data scientist's laptop straight to serving with no registry, no versioned data, and no monitoring — it works until the day it doesn't and there's no thread to pull.

MLOps vs DevOps vs DataOps: where the boundaries fall

The terms overlap enough to confuse a budget conversation, so here's the clean separation. DevOps ships code: version control, CI/CD, and production operations for software. DataOps ships data: reliable, tested, observable data pipelines — and it's the foundation MLOps stands on, because a feature store and a drift monitor are only as good as the data feeding them. MLOps ships models, adding the things neither of the others needs: experiment tracking, a model registry, champion-challenger evaluation, and drift monitoring. The practical upshot for a platform lead is that you can't buy your way out of weak DataOps with strong MLOps tooling. If your data pipelines are unreliable, every layer above them inherits the unreliability, and the slickest feature store in the world can't fix a feed that's wrong upstream.

DisciplineShipsAdds on topKey tools
DevOpsCodeCI/CD, IaC, prod opsGit, GitHub Actions, Argo, Terraform
DataOpsDataPipeline reliability, data tests, lineageAirflow, dbt, Great Expectations
MLOpsModelsTracking, registry, eval, drift monitoringMLflow, Feast, Evidently, BentoML
Three disciplines, three shipped artifacts. MLOps is the superset that needs DataOps as its foundation — you can't bolt model reliability on top of unreliable data.

FAQ — MLOps platform questions, answered straight

What is MLOps in simple terms?

MLOps is DevOps for machine learning: the practice of versioning, testing, deploying, and monitoring ML systems so models ship repeatably and stay reliable in production. The difference from plain DevOps is that an ML system has three things that can change underneath it — the code, the trained model, and the live data distribution — so MLOps adds experiment tracking, a model registry, champion-challenger evaluation, and drift monitoring on top of standard software-delivery practices.

What are the layers of an MLOps platform?

Six: data and versioning (DVC, lakehouse time-travel, dbt); a feature store that serves the same feature definition to training and serving (Feast, Tecton); training and experiment tracking (MLflow, Weights & Biases, Kubeflow, Ray); CI/CD that promotes models through quality and champion-challenger gates; serving in batch, real-time, or streaming form (BentoML, KServe, SageMaker, Vertex AI); and monitoring that watches operational metrics plus data and concept drift (Evidently, Arize) and closes the loop back to retraining.

Do I need a feature store?

You need one the moment a feature is computed in more than one place — typically when the same feature is built in your training pipeline and again in your live serving path. That duplication causes train/serve skew, the most expensive bug in production ML, where serving inputs silently diverge from training inputs and accuracy decays with no obvious cause. A feature store eliminates it by serving one definition to both an offline store for training and an online store for serving. If you only ever score in batch from the same code that trained the model, you can defer it.

What are the most important MLOps best practices?

Version data alongside code so every model maps to exact inputs; track every training run so production models are reproducible; promote through CI/CD gates including a champion-challenger comparison and segment-level metrics, not just aggregate accuracy; eliminate train/serve skew with a feature store; and monitor data and concept drift, not just latency. Automate in that order, tracking and registry first and retraining last, and keep a human in the loop on retrain decisions until your gates have months of evidence behind them.

What is the difference between MLOps and DevOps?

DevOps ships code and operates software in production. MLOps ships models, which means it has to manage two artifacts DevOps doesn't (the trained model and the data it learned from) and add the practices those demand: experiment tracking, a model registry, model evaluation against the incumbent, and drift monitoring. MLOps builds on DevOps and on DataOps (reliable data pipelines); it doesn't replace either, and weak DataOps undermines any MLOps platform stacked on top of it.

Should I build my MLOps platform or buy an integrated one?

Decide per layer, not all-or-nothing. A small team shipping its first models should lean on an integrated platform such as Databricks, SageMaker, or Vertex AI to reach production fast with one contract and no glue code to maintain. A team with platform engineers, real lock-in or compliance pressure, and unusual workloads should compose open source (MLflow, Feast, Evidently, BentoML) for control, accepting that they become the integrator and own the uptime of the glue. Most teams start integrated and specialize the layers that pinch as they grow.

How do you monitor for model drift?

Watch three things separately. Operational metrics (latency, error rate) ride your existing APM like Grafana or Datadog. Data drift, the input distribution shifting from training, is detected with distribution-distance metrics like population stability index or KL divergence, computed by tools like Evidently or Arize on your live feature stream, and it's your early warning because it doesn't need labels. Concept drift, the input-to-target relationship changing, only confirms once ground-truth labels arrive, often days or weeks later. Alert early on input drift, treat alerts as investigations rather than auto-retrain triggers, and close the loop back to your training pipeline.

MLOPS

Build an MLOps platform that ships models and keeps them reliable.

We design ML platforms layer by layer — feature stores that kill train/serve skew, CI/CD that promotes the right model, and monitoring that closes the loop. If you're operationalizing machine learning, talk to the team that has made these calls across 200+ engagements.

Talk to engineering

Want help shipping this?

An engineer reads every inbound. Same business day on most replies.