পাঠ ১৪ · ৩৩-এর মধ্যে · মডিউল ২
Home / AI Courses / MLOps / Kubeflow Pipelines

Kubeflow Pipelines

KFP — K8s-native ML orchestrator
৮ মিনিট পড়া উচ্চ · Advanced Python DSL

এই পাঠে যা শিখবেন

  • KFP-এর core concept — component, pipeline, artifact
  • Python DSL দিয়ে pipeline define
  • Caching ও artifact lineage
  • Airflow vs KFP — কখন কোনটা

১ · কেন KFP, কেন আলাদা

Airflow general-purpose orchestrator। KFP ML-specific — K8s-native, container-per-step, artifact tracking built-in।

  • প্রতিটি step একটি container — strict isolation।
  • Artifact (data, model) automatic typed pass between components।
  • Caching automatic — same input → cached output।
  • UI-তে DAG + lineage graph visualization।

২ · Component

Component = containerized step। Three styles:

  • Lightweight Python component: function-based, KFP wraps in container।
  • Container component: existing Docker image-এ command + args।
  • Reusable component: YAML spec, share across pipelines।

৩ · Python DSL pipeline

Python · KFP v2 pipeline
from kfp import dsl, compiler

@dsl.component(
    base_image="python:3.11-slim",
    packages_to_install=["pandas", "scikit-learn"],
)
def fetch_data(date: str, output_csv: dsl.Output[dsl.Dataset]):
    import pandas as pd
    # download / generate data
    df = pd.DataFrame(...)
    df.to_csv(output_csv.path, index=False)


@dsl.component(
    base_image="python:3.11-slim",
    packages_to_install=["pandas", "scikit-learn", "joblib"],
)
def train_model(
    input_csv: dsl.Input[dsl.Dataset],
    output_model: dsl.Output[dsl.Model],
    n_estimators: int = 100,
):
    import pandas as pd, joblib
    from sklearn.ensemble import RandomForestClassifier
    df = pd.read_csv(input_csv.path)
    X, y = df.drop(columns=["label"]), df["label"]
    model = RandomForestClassifier(n_estimators=n_estimators, random_state=42)
    model.fit(X, y)
    joblib.dump(model, output_model.path)


@dsl.component(base_image="python:3.11-slim", packages_to_install=["scikit-learn", "joblib"])
def evaluate(
    input_model: dsl.Input[dsl.Model],
    input_csv: dsl.Input[dsl.Dataset],
    metrics: dsl.Output[dsl.Metrics],
):
    import pandas as pd, joblib
    from sklearn.metrics import roc_auc_score
    model = joblib.load(input_model.path)
    df = pd.read_csv(input_csv.path)
    auc = roc_auc_score(df["label"], model.predict_proba(df.drop(columns=["label"]))[:, 1])
    metrics.log_metric("auc", auc)


@dsl.pipeline(name="bangla-sentiment-train")
def training_pipeline(date: str = "2025-01-15", n_estimators: int = 100):
    data_op = fetch_data(date=date)
    train_op = train_model(input_csv=data_op.outputs["output_csv"], n_estimators=n_estimators)
    eval_op = evaluate(
        input_model=train_op.outputs["output_model"],
        input_csv=data_op.outputs["output_csv"],
    )


# Compile + submit
compiler.Compiler().compile(training_pipeline, "pipeline.yaml")
# UI দিয়ে upload, OR programmatically:
# client = kfp.Client(host="...")
# client.create_run_from_pipeline_func(training_pipeline, arguments={...})

    
Compiled pipeline.yaml → KFP UI বা Vertex Pipelines-এ submit। Artifacts (Dataset, Model, Metrics) — typed, automatically tracked।

৪ · Caching

KFP automatically caches component results। Same component + same inputs → reuse previous output।

  • Cache key: component spec hash + input hash।
  • Cache hit → no rerun, instant।
  • Disable per-component: set_caching_options(enable_caching=False)।
  • Useful when developing — change last component only, earlier cached।

৫ · GPU support

Python · GPU component
from kfp import dsl

@dsl.pipeline(name="gpu-train")
def gpu_pipeline():
    train_op = train_model(...)
    train_op.set_accelerator_type("nvidia.com/gpu")
    train_op.set_accelerator_limit(1)
    train_op.set_memory_limit("16Gi")
    train_op.set_cpu_limit("4")

    
KFP K8s GPU node-এ schedule করে। Resource requests + limits ML-friendly।

৬ · Vertex Pipelines compatibility

Same KFP DSL pipeline.yaml — Vertex AI Pipelines (GCP)-এও submit করা যায়। Portable: dev local KFP, prod Vertex Pipelines।

৭ · Airflow vs KFP

  • Airflow:
    • General-purpose, broader operator library।
    • Dynamic DAG limited।
    • Heavier control plane।
  • KFP:
    • ML-specific, container-per-step।
    • Type-checked artifact passing।
    • K8s-native — needs K8s।
  • Common pattern:
    • Airflow for ETL + scheduled ML retraining trigger।
    • KFP for actual ML pipeline execution।
    • Airflow trigger-করে KFP run।
Kubeflow Pipelines — container-per-step on K8s Typed artifacts auto-passed Component 1 fetch_data → Dataset Component 2 train_model GPU pod → Model Component 3 evaluate → Metrics Artifact store (S3/GCS) — typed, lineage tracked Dataset, Model, Metrics — auto persisted, auto mounted
প্রতিটি component আলাদা K8s pod-এ চালু। Artifact (Dataset, Model, Metrics) auto-persist artifact store-এ; পরের component automatic mount।
Bangladesh-এ KFP adoption Airflow-এর চেয়ে কম, কিন্তু GPU-heavy ML team-এ growing। Vertex Pipelines (GCP Mumbai) — managed, no K8s ops।

ভাবনার প্রশ্ন

প্র ০১"KFP vs Airflow — ML-এর জন্য কোনটা better?"

"Better" depends — both excel different aspects।

KFP advantages:

  • Container-per-step — strict isolation, no dependency hell।
  • Typed artifacts — Dataset, Model, Metrics built-in।
  • Auto caching — dev iteration fast।
  • Lineage UI — built-in।
  • GPU resource declarative।
  • Vertex Pipelines portable।

Airflow advantages:

  • Mature, battle-tested।
  • Operator library vast (Snowflake, Slack, Hadoop)।
  • Smaller K8s requirement।
  • Wider community।
  • Non-ML use cases-ও cover।

Decision matrix:

  • K8s shop, ML-only → KFP।
  • Mixed ETL+ML, broader ops → Airflow।
  • GCP shop → Vertex Pipelines (KFP under the hood)।
  • Both possible — Airflow scheduler triggers KFP runs।

Bangladesh context:

  • Most BD ML teams Airflow — already use for ETL।
  • Pure-ML platform team adopting KFP — clean separation।
  • Cloud-native (GCP) shops Vertex Pipelines fast adoption।

মূল উপলব্ধি: Airflow general; KFP ML-specific। K8s-and-ML-only → KFP cleaner। Otherwise Airflow। Both can coexist।

প্র ০২"Caching when valuable, when harmful?"

Caching speed boost; কিন্তু wrong-cache silent bug।

When valuable:

  • Idempotent components, deterministic input।
  • Dev iteration — change last component, earlier cached।
  • Expensive components (large data preprocess)।

When harmful:

  • External state-dependent component (e.g., reads "today's S3 data")।
  • Random behavior in component — cached randomness misleading।
  • Bug fix — cached result still old version।

Cache key design:

  • Include execution date as parameter — daily refresh।
  • Include image SHA — image rebuild → cache invalidate।
  • Include code version (git SHA via env var)।

Practice:

  • Default enabled in dev।
  • Disable in production — explicit decision।
  • Or: enable in production with strict cache key (date + image SHA)।

মূল উপলব্ধি: Caching = dev productivity tool, production correctness risk। Discipline cache key carefully। Production-এ caching default-off safer।

প্র ০৩"Component reuse — কীভাবে effectively?"

Component reuse — KFP-এর strength, কিন্তু practical challenge।

Patterns:

  • Generic components (e.g., "evaluate-classification") — reusable across projects।
  • Versioned component library — internal git repo।
  • Parametrize: same train code, different model class।

Anti-patterns:

  • "God component" doing everything — not reusable।
  • Hardcoded paths — non-portable।
  • Ambiguous schema — hard to plug in।

Versioning strategy:

  • Component image SHA tag।
  • Pipeline pin specific component version।
  • Backwards-compatible interface।

মূল উপলব্ধি: Reuse — design discipline + version management। Without — chaos quickly।

প্র ০৪"Failed pipeline run debug — KFP-এর সাথে workflow?"

KFP debug — UI + kubectl combination।

UI level:

  • Pipeline graph — failed component highlighted।
  • Click → logs।
  • Inputs/outputs visible।

kubectl level:

  • kubectl describe pod — events।
  • kubectl logs — full output।
  • kubectl exec — interactive (if pod still running)।

Common failures:

  • OOM kill — increase memory_limit।
  • Image pull error — registry auth।
  • GPU unavailable — node selector mismatch।
  • Volume mount — artifact path issue।

Re-run from failed:

  • UI "rerun" — full pipeline।
  • "Retry from failed" — only failed onwards (caching helps)।

মূল উপলব্ধি: KFP debug = pipeline UI + K8s tools। Caching speeds re-run iteration। Logs structured retain।

অনুশীলন

  1. Compile: উপরের pipeline compile করুন। YAML inspect করুন।

    compiler.Compiler().compile(training_pipeline, "pipeline.yaml")। YAML-এ Argo Workflow spec দেখা যাবে — KFP underlying Argo এ compile।

  2. Local KFP: Minikube/kind-এ KFP install। Pipeline upload + run।

    Kubeflow standalone install instructions follow। UI port-forward। YAML upload, run-এ আধা ঘণ্টা।

  3. চিন্তা: ৪-component KFP pipeline — Bangla NLP-এর জন্য। Component reuse-এ কী potential?
    • tokenize-bangla — reusable across NLP projects।
    • train-classifier — generic, parameterize model class।
    • evaluate-multi-class — fairness gates parameterized।
    • register-mlflow — generic registry push।

আরও পড়ুন

পূর্ববর্তী পাঠ
পাঠ ১৩ · Training orchestration