The end-to-end discipline for training, registering, deploying, and monitoring classic predictive ML models on the Lakehouse — DevOps + DataOps + ModelOps under one Unity Catalog governance plane.
MLOps on Databricks is the practice of managing the ML lifecycle — data → features → train/track (MLflow) → register (Unity Catalog) → deploy (serving/batch) → monitor — as governed, promotable code across dev, staging, and prod.
It turns one-off notebooks into reproducible, auditable production pipelines. Because models, features, and data all live in Unity Catalog, you get one access-control and lineage model for the whole lifecycle — and you ship by promoting reviewed code through environments rather than copying model files around.
Experiments hold runs; each run logs params, metrics, and artifacts. mlflow.autolog() captures them automatically, and log_model() packages the model in MLflow format.
Register to the three-level namespace catalog.schema.model; versioned, governed, lineage-tracked. Set registry_uri("databricks-uc") (default in MLflow 3).
A mutable named pointer like @Champion/@Challenger points at a version, decoupling deployment from the inference pipeline. Aliases replace the deprecated stages.
Feature tables in UC, joined to labels via FeatureLookup with point-in-time correctness — the same computation at train and serve time kills train/serve skew.
Promote code through dev → staging → prod so prod models are produced by reviewed, tested prod code. MLOps Stacks (Asset Bundles) scaffold the CI/CD.
Real-time via Model Serving (serverless, scale-to-zero REST), or batch inference over a Delta table. Lakehouse Monitoring profiles the inference table for drift and quality.
FeatureLookup joins, so train and serve use identical features.PySpark · Pythonimport mlflow
from mlflow import MlflowClient
mlflow.set_registry_uri("databricks-uc") # register to UC, not the workspace registry
with mlflow.start_run():
mlflow.autolog() # auto-log params, metrics, the model
model = clf.fit(X_train, y_train)
info = mlflow.sklearn.log_model(
model, name="model", input_example=X_train[:5],
registered_model_name="prod.ml_team.churn") # catalog.schema.model
# point the deploy alias at the new version — pipelines load models:/...@Champion
MlflowClient().set_registered_model_alias("prod.ml_team.churn", "Champion", info.registered_model_version)
input_example) plus CREATE MODEL on the schema and USE SCHEMA/USE CATALOG — the catalog and schema must already exist.Staging/Production stages; stages and the workspace Model Registry are deprecated — don't reach for them in new work.catalog.schema.model with versions and aliases; flipping the @Champion alias is a zero-downtime deploy that the serving/inference pipeline picks up without code changes."Verified against docs.databricks.com · June 2026