model-serving

KServe Serves Models. ZenML Ships ML Systems.

KServe is excellent at production model serving on Kubernetes — autoscaling, rollouts, and multi-framework runtimes. ZenML covers everything KServe doesn't: building reproducible pipelines, tracking artifacts and lineage, and delivering models to production with confidence. Use KServe for the endpoint, ZenML for the lifecycle that produces it. Together, they turn a model file into a governed, repeatable production system.

Open-source and vendor-neutral

  • ZenML is fully open-source, giving you complete control over your AI infrastructure.
  • Avoid platform lock-in — run the same pipelines across any cloud or on-prem environment.
  • Benefit from a transparent, community-driven development process.
Dashboard mockup showing local-to-production workflow

Composable stack architecture

  • Choose your own orchestrator, experiment tracker, artifact store, and model deployer.
  • Swap infrastructure components without rewriting pipeline code.
  • Integrate new tools instantly as they emerge without waiting for vendor support.
Dashboard mockup showing integrations

Code-first, Python-native workflows

  • Define pipelines in pure Python with simple decorators — no YAML or DSL to learn.
  • Start locally with pip install and scale to production on any cloud.
  • Version control your entire ML workflow alongside your application code.
Dashboard mockup showing productionalization workflow
ADEO logo
ZenML has proven to be a critical asset in our machine learning toolbox, and we are excited to continue leveraging its capabilities to drive ADEO's machine learning initiatives to new heights
François Serra

François Serra

ML Engineer / ML Ops / ML Solution architect at ADEO Services

Explore in Detail What Makes ZenML Unique

FeatureZenMLKServe
Workflow Orchestration
Yes

Built around defining and running end-to-end ML/AI pipelines with steps, artifacts, and repeatable executions across environments

Not supported

Orchestrates serving resources on Kubernetes, not training or evaluation workflows — no native pipeline or DAG system

Integration Flexibility
Yes

Composable stack with 50+ MLOps integrations — swap orchestrators, trackers, and deployers without code changes

Not supported

Deep integration with K8s serving runtimes, but scoped to inference — doesn't integrate across the broader ML toolchain

Vendor Lock-In
Yes

Cloud-agnostic by design — stacks make it easy to switch infrastructure providers and tools as needs change

Yes

Open-source CNCF project not tied to any cloud — lock-in is to Kubernetes itself and optionally Knative/Istio for key features

Setup Complexity
Yes

pip install zenml — start locally and progressively adopt infrastructure via stack components without needing K8s on day one

Not supported

Requires installing Kubernetes controllers, CRDs, and optionally Knative and networking dependencies for full feature set

Learning Curve
Yes

Python-first abstraction matches how ML engineers write training code, with infrastructure details pushed into configuration

Not supported

Approachable for K8s-native teams but demands comfort with CRDs, cluster networking, and serving runtime concepts

Scalability
Yes

Delegates compute to scalable backends — Kubernetes, Spark, cloud ML services — for unlimited horizontal scaling

Yes

Designed for scalable multi-tenant inference with request-based autoscaling, scale-to-zero, and canary rollout patterns

Cost Model
Yes

Open-source core is free — pay only for your own infrastructure, with optional managed cloud for enterprise features

Yes

Apache-2.0 with no per-seat or per-request fees — costs are infrastructure and operations, with scale-to-zero reducing waste

Collaboration
Yes

Code-native collaboration through Git, CI/CD, and code review — ZenML Pro adds RBAC, workspaces, and team dashboards

Not supported

Relies on Kubernetes-native collaboration (GitOps, cluster RBAC) — no ML-specific collaboration layer for experiments or artifacts

ML Frameworks
Yes

Use any Python ML framework — TensorFlow, PyTorch, scikit-learn, XGBoost, LightGBM — with native materializers and tracking

Yes

Multi-framework serving support (TensorFlow, PyTorch, scikit-learn, XGBoost, ONNX) plus growing GenAI/LLM runtimes

Monitoring
Yes

Integrates Evidently, WhyLogs, and other monitoring tools as stack components for automated drift detection and alerting

Yes

Serving-time metrics via Prometheus, payload logging, and drift/outlier detection integrations — scoped to inference endpoints

Governance
Yes

ZenML Pro provides RBAC, SSO, workspaces, and audit trails — self-hosted option keeps all data in your own infrastructure

Not supported

Governance inherited from Kubernetes (RBAC, namespaces) — ML-specific governance like training-to-deploy lineage is out of scope

Experiment Tracking
Yes

Native metadata tracking plus seamless integration with MLflow, Weights & Biases, Neptune, and Comet for rich experiment comparison

Not supported

Does not track experiments — serves whatever model artifact is provided and exposes runtime-level status and metrics

Reproducibility
Yes

Automatic artifact versioning, code-to-Git linking, and containerized execution guarantee reproducible pipeline runs

Not supported

Serving configs are reproducible via K8s manifests, but end-to-end reproducibility of training data, code, and environments is out of scope

Auto-Retraining
Yes

Schedule pipelines via any orchestrator or use ZenML Pro event triggers for drift-based automated retraining workflows

Not supported

Can roll out new model versions once produced, but does not automate retraining or the upstream triggers that decide when to retrain

Code comparison

ZenML and KServe side by side

ZenML
from zenml import pipeline, step, Model
from zenml.integrations.mlflow.steps import (
    mlflow_model_deployer_step,
)
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
import numpy as np

@step
def ingest_data() -> pd.DataFrame:
    return pd.read_csv("data/dataset.csv")

@step
def train_model(df: pd.DataFrame) -> RandomForestRegressor:
    X, y = df.drop("target", axis=1), df["target"]
    model = RandomForestRegressor(n_estimators=100)
    model.fit(X, y)
    return model

@step
def evaluate(model: RandomForestRegressor, df: pd.DataFrame) -> float:
    X, y = df.drop("target", axis=1), df["target"]
    preds = model.predict(X)
    return float(np.sqrt(mean_squared_error(y, preds)))

@step
def check_drift(df: pd.DataFrame) -> bool:
    # Plug in Evidently, Great Expectations, etc.
    return detect_drift(df)

@pipeline(model=Model(name="my_model"))
def ml_pipeline():
    df = ingest_data()
    model = train_model(df)
    rmse = evaluate(model, df)
    drift = check_drift(df)

# Runs on any orchestrator, logs to MLflow,
# tracks artifacts, and triggers retraining — all
# in one portable, version-controlled pipeline
ml_pipeline()
KServe
import asyncio
from kubernetes import client
from kserve import (
    KServeClient, constants,
    V1beta1InferenceService, V1beta1InferenceServiceSpec,
    V1beta1PredictorSpec, V1beta1SKLearnSpec,
    RESTConfig, InferenceRESTClient,
)

async def main():
    name, namespace = "sklearn-iris", "kserve-test"
    isvc = V1beta1InferenceService(
        api_version=constants.KSERVE_V1BETA1,
        kind=constants.KSERVE_KIND,
        metadata=client.V1ObjectMeta(
            name=name, namespace=namespace
        ),
        spec=V1beta1InferenceServiceSpec(
            predictor=V1beta1PredictorSpec(
                sklearn=V1beta1SKLearnSpec(
                    storage_uri="s3://my-bucket/iris/model.joblib"
                )
            )
        ),
    )
    ksc = KServeClient()
    ksc.create(isvc)
    ksc.wait_isvc_ready(name, namespace=namespace)

    rest = InferenceRESTClient(
        RESTConfig(protocol="v1", retries=5, timeout=30)
    )
    result = await rest.infer(
        f"http://{name}.{namespace}",
        {"instances": [[6.8, 2.8, 4.8, 1.4]]},
        model_name=name,
    )
    print(result)

asyncio.run(main())

# Deploys and serves a model on Kubernetes.
# No pipeline orchestration, experiment tracking,
# artifact lineage, or retraining automation.
# Focused purely on the inference endpoint.
01.

Open-Source and Vendor-Neutral

ZenML is fully open-source and vendor-neutral, letting you avoid the significant licensing costs and platform lock-in of proprietary enterprise platforms. Your pipelines remain portable across any infrastructure, from local development to multi-cloud production.

02.

Lightweight, Code-First Development

ZenML offers a pip-installable, Python-first approach that lets you start locally and scale later. No enterprise deployment, platform operators, or Kubernetes clusters required to begin — build production-grade ML pipelines in minutes, not weeks.

03.

Composable Stack Architecture

ZenML's composable stack lets you choose your own orchestrator, experiment tracker, artifact store, and deployer. Swap components freely without re-platforming — your pipelines adapt to your toolchain, not the other way around.

Book Your Free ZenML Strategy Talk

Broaden Your AI Orchestration Understanding with ZenML

Ready to Deliver Models to
KServe with Reproducible Pipelines?

See ZenML's superior model orchestration in action Discover how ZenML offers more with your existing ML tools Find out why data security with ZenML outshines the rest