Tutorial Kedro: Pipeline Data Science yang Reproducible dan Terstruktur

# Kedro: Pipeline Data Science yang Reproducible dan Mudah Dirawat Sebagian besar proyek data science dimulai dari satu notebook dan perlahan berubah menjadi kekusutan sel, path file yang ditulis lan...

By Ruby Abdullah · · tutorial
KedroData SciencePipelineMLOpsReproducibilityPython

Kedro: Pipeline Data Science yang Reproducible dan Mudah Dirawat

Sebagian besar proyek data science dimulai dari satu notebook dan perlahan berubah menjadi kekusutan sel, path file yang ditulis langsung (hardcoded), serta kode yang hanya bisa berjalan di satu laptop. Kedro adalah framework Python open-source yang menerapkan disiplin software engineering pada pekerjaan data science, memberi proyek Anda struktur standar, cara deklaratif untuk mengelola data, serta pemisahan yang rapi antara kode, konfigurasi, dan data. Tutorial ini membahas konsep-konsepnya dan menunjukkan contoh lengkap yang dapat dijalankan.

Apa Itu Kedro dan Masalah yang Diselesaikannya

Kedro bukan scheduler dan bukan pula alat notebook. Ia adalah framework proyek: cara terstruktur untuk menata kode data science agar reproducible, dapat diuji, dan siap diserahkan ke engineer lain. Kedro dibuat di QuantumBlack (bagian dari McKinsey) dan kini dikelola di bawah LF AI & Data Foundation.

Siapa pun yang pernah merawat kode data science pasti mengenali masalah-masalah berulang berikut:

  • Kekacauan notebook. Logika tersebar di sel-sel yang harus dijalankan dengan urutan tepat. State tersembunyi membuat hasil mustahil direproduksi.
  • Path yang hardcoded. pd.readcsv("/Users/ruby/Downloads/datav3final.csv") hanya jalan di satu mesin dan langsung rusak saat rekan kerja meng-clone repository.
  • Tanggung jawab yang tercampur. Connection string, hyperparameter model, dan logika bisnis bercampur dalam satu file, sehingga mengganti environment berarti mengubah kode sumber.
  • Lineage yang tidak jelas. Tidak jelas fungsi mana menghasilkan artefak mana dan apa bergantung pada apa.

Kedro mengatasinya melalui beberapa prinsip inti:

  • Pemisahan kode, konfigurasi, dan data. Kode ada di src/, konfigurasi di conf/, data di data/. Masing-masing bisa berubah secara independen.
  • Data Catalog yang deklaratif. Dataset adalah entitas bernama yang dideskripsikan dalam YAML, bukan path mentah yang terselip di dalam kode.
  • Modularitas. Pekerjaan dipecah menjadi fungsi-fungsi murni kecil (node) yang dirangkai menjadi pipeline, sehingga pengujian dan penggunaan ulang menjadi mudah.
  • Reproducibility. Siapa pun bisa meng-clone repository, memasang dependensi, dan menjalankan kedro run untuk memperoleh hasil yang sama.

Yang penting, Kedro menyediakan struktur, bukan penjadwalan. Ketika Anda butuh orkestrasi mirip cron, retry, atau scheduler produksi, Anda men-deploy pipeline Kedro ke Airflow, Dagster, Argo, Databricks, atau sejenisnya. Kedro memberi bentuk pada proyek; alat-alat tersebut menjalankannya sesuai jadwal.

Instalasi dan Membuat Proyek

Kedro membutuhkan Python 3.9 atau lebih baru. Selalu pasang ke dalam virtual environment.

python -m venv .venv

source .venv/bin/activate # di Windows: .venv\Scripts\activate

pip install kedro

kedro info

Buat proyek baru. Kedro menggunakan starter (template); contoh di bawah memakai prompt tooling standar.

kedro new --name price-prediction

Anda akan ditanya tooling apa yang ingin disertakan (linting, testing, logging, dokumentasi, struktur data). Untuk tutorial ini kita asumsikan proyek bernama price-prediction untuk model regresi harga rumah.

Struktur Direktori Standar

price-prediction/

├── conf/

│ ├── base/

│ │ ├── catalog.yml # definisi dataset

│ │ ├── parameters.yml # parameter pipeline

│ │ └── logging.yml

│ └── local/

│ └── credentials.yml # rahasia, jangan pernah di-commit

├── data/

│ ├── 01raw/ # data sumber yang immutable

│ ├── 02intermediate/ # data yang sudah bertipe dan bersih

│ ├── 03primary/

│ ├── 04feature/

│ ├── 05modelinput/

│ ├── 06models/

│ ├── 07modeloutput/

│ └── 08reporting/

├── notebooks/

├── src/

│ └── priceprediction/

│ ├── pipelines/

│ ├── pipelineregistry.py

│ └── settings.py

├── pyproject.toml

└── requirements.txt

Folder data/ yang berlapis mencerminkan konvensi data engineering: data mentah bersifat immutable, dan setiap lapisan berikutnya diturunkan dari lapisan sebelumnya. Anda bebas memakai lapisan ini sebagai label; Kedro tidak memaksakan makna tetap, tetapi konvensi ini membuat lineage langsung jelas terlihat.

Pemisahan antara conf/base dan conf/local adalah hal pokok. base menyimpan konfigurasi yang dipakai bersama semua orang dan di-commit ke version control. local menyimpan override khusus mesin dan rahasia, serta diabaikan oleh git. Inilah cara Kedro menjaga kredensial keluar dari kode.

Data Catalog

Data Catalog adalah jantung Kedro. Alih-alih membuka file di dalam kode, Anda mendeklarasikan setiap dataset sekali saja di conf/base/catalog.yml dan merujuknya berdasarkan nama di mana pun. Kedro yang menangani proses load dan save dengan konektor yang tepat.

# conf/base/catalog.yml

housesraw:

type: pandas.CSVDataset

filepath: data/01raw/houses.csv

housescleaned:

type: pandas.ParquetDataset

filepath: data/02intermediate/housescleaned.parquet

modelinputtable:

type: pandas.ParquetDataset

filepath: data/05modelinput/modelinput.parquet

pricemodel:

type: pickle.PickleDataset

filepath: data/06models/pricemodel.pkl

versioned: true

Beberapa hal yang perlu disorot:

  • Tidak ada path hardcoded di kode. Sebuah node menerima DataFrame yang sudah ter-load dan mengembalikan DataFrame; ia tidak pernah tahu di mana data berada. Untuk berpindah dari CSV ke Parquet, atau dari disk lokal ke S3, Anda mengubah YAML, bukan Python.
  • Banyak tipe dataset. Kedro menyediakan konektor untuk CSV, Parquet, Excel, JSON, pickle, tabel dan query SQL, Spark, data citra, dan lainnya, melalui paket kedro-datasets.
  • Versioning. Mengatur versioned: true membuat Kedro menulis output setiap run ke subfolder bertimestamp, sehingga artefak model tidak pernah tertimpa diam-diam.
  • MemoryDataset. Output apa pun yang tidak dideklarasikan di catalog otomatis disimpan di memori sebagai MemoryDataset dan diteruskan ke node berikutnya dalam run yang sama. Ini praktis untuk hasil antara sementara yang tidak perlu Anda persistkan.

Contoh SQL dan contoh cloud:

# Membaca dari database

customertable:

type: pandas.SQLTableDataset

credentials: dbcredentials

tablename: customers

loadargs:

schema: public

Menulis ke cloud storage

predictions:

type: pandas.CSVDataset

filepath: s3://my-bucket/predictions/output.csv

credentials: awscreds

Kredensial yang dirujuk berdasarkan nama (dbcredentials, awscreds) diselesaikan dari conf/local/credentials.yml, menjaga rahasia tetap di luar catalog yang di-commit.

Node

Node adalah pembungkus tipis di sekeliling fungsi Python murni. Fungsinya tidak tahu apa pun soal Kedro; node memetakan input dan output fungsi ke nama dataset di catalog.

# src/priceprediction/pipelines/dataprocessing/nodes.py

import pandas as pd

def cleanhouses(housesraw: pd.DataFrame) -> pd.DataFrame:

df = housesraw.copy()

df = df.dropna(subset=["price", "areasqm"])

df["pricepersqm"] = df["price"] / df["areasqm"]

df["hasgarage"] = df["garage"].fillna(0).astype(int)

return df

def buildmodelinput(housescleaned: pd.DataFrame) -> pd.DataFrame:

features = ["areasqm", "bedrooms", "bathrooms", "hasgarage", "pricepersqm"]

return housescleaned[features + ["price"]]

Menjaga fungsi tetap murni (tanpa I/O, tanpa state global) membuatnya sangat mudah diuji secara terpisah, tanpa melibatkan mesin Kedro sama sekali.

Pipeline

Pipeline menghubungkan node menjadi sebuah directed acyclic graph (DAG). Anda tidak menentukan urutannya secara eksplisit; Kedro menyimpulkannya dari input dan output yang dideklarasikan tiap node. Jika node B mengonsumsi apa yang dihasilkan node A, Kedro menjalankan A sebelum B.

# src/priceprediction/pipelines/dataprocessing/pipeline.py

from kedro.pipeline import Pipeline, node, pipeline

from .nodes import cleanhouses, buildmodelinput

def createpipeline(kwargs) -> Pipeline:

return pipeline(

[

node(

func=cleanhouses,

inputs="housesraw",

outputs="housescleaned",

name="cleanhousesnode",

),

node(

func=buildmodelinput,

inputs="housescleaned",

outputs="modelinputtable",

name="buildmodelinputnode",

),

]

)

String housesraw, housescleaned, dan modelinputtable adalah nama-nama yang sama yang didefinisikan di catalog. Itulah perangkaiannya: nama di catalog menghubungkan node ke data dan node satu dengan lainnya.

Pipeline Data Science

Sekarang pipeline kedua untuk pelatihan dan evaluasi. Perhatikan bagaimana parameter mengalir masuk melalui prefiks params:.

# src/priceprediction/pipelines/datascience/nodes.py

import logging

import pandas as pd

from sklearn.ensemble import RandomForestRegressor

from sklearn.modelselection import traintestsplit

from sklearn.metrics import meanabsoluteerror, r2score

logger = logging.getLogger(name)

def splitdata(modelinputtable: pd.DataFrame, parameters: dict):

X = modelinputtable.drop(columns=["price"])

y = modelinputtable["price"]

return traintestsplit(

X, y,

testsize=parameters["testsize"],

randomstate=parameters["randomstate"],

)

def trainmodel(Xtrain, ytrain, parameters: dict) -> RandomForestRegressor:

model = RandomForestRegressor(

nestimators=parameters["nestimators"],

maxdepth=parameters["maxdepth"],

randomstate=parameters["randomstate"],

)

model.fit(Xtrain, ytrain)

return model

def evaluatemodel(model: RandomForestRegressor, Xtest, ytest) -> dict:

preds = model.predict(Xtest)

mae = meanabsoluteerror(ytest, preds)

r2 = r2score(ytest, preds)

logger.info("MAE model: %.2f, R2: %.3f", mae, r2)

return {"mae": mae, "r2": r2}

# src/priceprediction/pipelines/datascience/pipeline.py

from kedro.pipeline import Pipeline, node, pipeline

from .nodes import splitdata, trainmodel, evaluatemodel

def createpipeline(kwargs) -> Pipeline:

return pipeline(

[

node(

func=splitdata,

inputs=["modelinputtable", "params:modeloptions"],

outputs=["Xtrain", "Xtest", "ytrain", "ytest"],

name="splitdatanode",

),

node(

func=trainmodel,

inputs=["Xtrain", "ytrain", "params:modeloptions"],

outputs="pricemodel",

name="trainmodelnode",

),

node(

func=evaluatemodel,

inputs=["pricemodel", "Xtest", "ytest"],

outputs="modelmetrics",

name="evaluatemodelnode",

),

]

)

Xtrain, Xtest, ytrain, dan ytest tidak ada di catalog, sehingga Kedro memperlakukannya sebagai dataset di memori yang diteruskan antar-node. pricemodel ada di catalog, jadi ia dipersistkan (dan diversi).

Mendaftarkan Pipeline dan Pipeline Default

Kedro menemukan pipeline melalui pipelineregistry.py. Di sini Anda merakit pipeline proyek lengkap, termasuk default yang berjalan ketika tidak ada pipeline spesifik yang disebut.

# src/priceprediction/pipelineregistry.py

from kedro.pipeline import Pipeline

from priceprediction.pipelines import dataprocessing as dp

from priceprediction.pipelines import datascience as ds

def registerpipelines() -> dict[str, Pipeline]:

dataprocessing = dp.createpipeline()

datascience = ds.createpipeline()

return {

"dp": dataprocessing,

"ds": datascience,

"default": dataprocessing + datascience,

}

Menambahkan dua pipeline dengan + menggabungkannya menjadi satu graph. Karena modelinputtable yang dihasilkan pipeline pertama dikonsumsi oleh pipeline kedua, Kedro secara otomatis mengurutkan keseluruhannya dengan benar dari ujung ke ujung.

Menjalankan Pipeline

Perintah dasar menjalankan pipeline default:

kedro run

Kedro menawarkan kontrol granular atas apa yang dijalankan:

# Jalankan hanya pipeline data science

kedro run --pipeline ds

Jalankan node tertentu berdasarkan nama

kedro run --nodes "trainmodelnode,evaluatemodelnode"

Jalankan dari satu node ke depan, atau sampai sebuah node

kedro run --from-nodes splitdatanode

kedro run --to-nodes buildmodelinputnode

Jalankan semua yang diberi tag untuk keperluan tertentu

kedro run --tags training

Opsi-opsi ini membuat iterasi menjadi murah: saat Anda hanya mengubah logika evaluasi, Anda bisa menjalankan ulang dari titik tersebut alih-alih menghitung ulang seluruh graph. Tag dilekatkan saat definisi node dan mengelompokkan node lintas pipeline.

Parameter dan Konfigurasi

Hyperparameter dan pengaturan yang dapat disetel berada di conf/base/parameters.yml, tidak pernah di-hardcode di dalam node.

# conf/base/parameters.yml

modeloptions:

testsize: 0.2

randomstate: 42

nestimators: 200

maxdepth: 12

Referensi params:modeloptions pada input sebuah node menyuntikkan dictionary ini ke dalam fungsi. Untuk merujuk satu nilai saja Anda bisa memakai akses bertitik, misalnya params:modeloptions.testsize.

Environment Konfigurasi

Kedro menggabungkan konfigurasi dari conf/base (bersama) dan conf/local (mesin Anda), dengan local menimpa base. Anda bisa membuat environment tambahan dan memilihnya saat runtime:

kedro run --env staging

Perintah ini memuat conf/staging di atas conf/base. Pola umum: base menunjuk ke data sampel, sementara local atau staging menunjuk ke tabel warehouse sungguhan, tanpa perubahan kode.

Kredensial dan Templating OmegaConf

Rahasia ditempatkan di conf/local/credentials.yml, yang diabaikan git:

# conf/local/credentials.yml

dbcredentials:

con: postgresql://user:password@host:5432/prod

awscreds:

clientkwargs:

awsaccesskeyid: AKIA...

awssecretaccesskey: ...

Kedro memakai OmegaConf sebagai config loader bawaannya, yang mendukung interpolasi variabel dan template yang dapat dipakai ulang. Anda bisa mendefinisikan anchor sekali dan memakainya ulang di seluruh catalog:

# conf/base/catalog.yml
parquet: &parquet

type: pandas.ParquetDataset

saveargs:

compression: snappy

housescleaned:

<<: parquet

filepath: data/02intermediate/housescleaned.parquet

modelinputtable:

<<: parquet

filepath: data/05modelinput/modelinput.parquet

Anda juga dapat menginterpolasi variabel environment dan parameter ke dalam catalog, sehingga konfigurasi tetap ringkas dan konsisten.

Memvisualisasikan Pipeline dengan Kedro-Viz

Kedro-Viz merender DAG Anda sebagai diagram interaktif, menampilkan node, dataset, dan bagaimana data mengalir di antaranya.

pip install kedro-viz

kedro viz run

Perintah ini membuka browser di http://127.0.0.1:4141 dengan graph lengkap. Berguna untuk onboarding anggota tim baru, mendeteksi dependensi yang tidak diinginkan, dan menjelaskan alur kerja ke pihak non-teknis. Kedro-Viz juga dapat menampilkan metrik experiment tracking dari waktu ke waktu ketika Anda mencatatnya melalui catalog.

Bekerja Secara Interaktif: Catalog, IPython, dan Jupyter

Kedro dirancang untuk berdampingan dengan notebook, bukan melarangnya. Beberapa perintah menjembatani kedua dunia:

# Daftar dan inspeksi dataset yang dideklarasikan

kedro catalog list

Luncurkan sesi IPython dengan catalog, context, dan pipeline sudah dimuat

kedro ipython

Luncurkan Jupyter dengan sesi Kedro tersedia

kedro jupyter notebook

Di dalam sesi IPython atau Jupyter Anda mendapat objek catalog siap pakai, sehingga eksplorasi memakai dataset yang sama dengan pipeline:

houses = catalog.load("housesraw")

houses.describe()

Simpan hasil eksperimen kembali melalui catalog

catalog.save("housescleaned", cleaneddf)

Alur kerja yang disarankan adalah membuat prototipe di notebook, lalu memindahkan logika yang sudah stabil ke dalam node sehingga menjadi bagian dari pipeline yang reproducible.

Memperluas Kedro: Hooks dan Plugin

Hooks memungkinkan Anda menjalankan kode kustom pada titik-titik tertentu dalam siklus hidup: sebelum atau sesudah node berjalan, sebelum atau sesudah pipeline berjalan, setelah catalog dibuat, dan seterusnya. Inilah mekanisme resmi untuk urusan lintas-potong seperti logging kustom, validasi data, atau pengiriman notifikasi.
# src/priceprediction/hooks.py

import logging

from kedro.framework.hooks import hookimpl

logger = logging.getLogger(name)

class ModelTrackingHooks:

@hookimpl

def afternoderun(self, node, outputs):

if node.name == "evaluatemodelnode":

metrics = outputs.get("modelmetrics", {})

logger.info("Mencatat metrik ke sistem tracking: %s", metrics)

Daftarkan hooks di settings.py:

# src/priceprediction/settings.py

from priceprediction.hooks import ModelTrackingHooks

HOOKS = (ModelTrackingHooks(),)

Plugin memperluas perintah kedro itu sendiri atau menambah integrasi. Yang umum mencakup kedro-viz, kedro-datasets, plugin deployment Airflow dan Argo, serta integrasi MLflow seperti kedro-mlflow.

Deployment: Struktur di Sini, Penjadwalan di Sana

Kedro mengemas proyek Anda sebagai distribusi Python standar:

kedro package

Perintah ini menghasilkan wheel di dist/ yang berisi pipeline Anda, beserta konfigurasi yang dibutuhkan untuk menjalankannya. Dari sana, pipeline Kedro berjalan di orkestrator apa pun yang sudah Anda pakai. Kerangkanya konsisten: Kedro mendefinisikan apa yang dijalankan dan bagaimana dirangkai; orkestrator menangani kapan dijalankan, retry, dan penskalaan.

  • Airflow. Plugin kedro-airflow mengonversi pipeline Kedro menjadi DAG Airflow, memetakan tiap node Kedro ke sebuah task Airflow.

  pip install kedro-airflow

kedro airflow create

  • Dagster. Integrasi komunitas dan plugin mengekspos node Kedro sebagai ops/asset Dagster, sehingga graph Kedro berjalan di dalam lapisan penjadwalan dan observability Dagster.
  • Argo Workflows / Kubeflow. Template menerjemahkan pipeline menjadi langkah-langkah workflow Argo untuk eksekusi yang native di Kubernetes.
  • Databricks. Kedro berjalan di Databricks baik sebagai job yang dikemas maupun melalui tooling workflow Databricks, yang cocok untuk catalog berbasis Spark.

Dalam setiap kasus Anda menulis pipeline sekali di Kedro dan memilih target deployment tanpa menulis ulang logika bisnis.

Experiment Tracking

Untuk melacak run, metrik, dan parameter, Kedro berintegrasi dengan MLflow melalui kedro-mlflow, yang mencatat parameter, metrik, dan artefak model secara otomatis saat pipeline berjalan. Kedro juga punya experiment tracking bawaan yang ringan dan menampilkan metrik di Kedro-Viz ketika Anda mendeklarasikan dataset metrik di catalog. Kedua pendekatan menjaga catatan eksperimen tetap terikat pada versi pipeline persis yang menghasilkannya.

Praktik Terbaik

  • Jaga fungsi node tetap murni. Tanpa I/O file, tanpa state global, tanpa efek samping tersembunyi. Catalog menangani persistensi; node menangani logika.
  • Beri nama pada segalanya. Beri setiap node sebuah name agar dapat dialamatkan dari CLI dan terbaca di Kedro-Viz.
  • Satu tanggung jawab per pipeline. Pisahkan pemrosesan data dari data science, dan jaga pipeline tetap kecil serta dapat dirangkai.
  • Jangan pernah commit rahasia. Kredensial berada di conf/local, yang tetap di luar version control.
  • Manfaatkan lapisan data. Mengikuti konvensi 01raw hingga 08_reporting membuat lineage mendokumentasikan dirinya sendiri.
  • Versikan model Anda. Atur versioned: true pada dataset model dan output agar run dapat diaudit.
  • Uji node secara langsung. Karena fungsi murni, unit test tidak memerlukan context Kedro.
  • Promosikan kode notebook menjadi node. Bereksplorasilah di notebook, tetapi pindahkan apa pun yang penting ke dalam pipeline.

Kesimpulan dan Poin Utama

Kedro membawa struktur software engineering ke data science tanpa memaksa Anda meninggalkan gaya eksploratif yang membuat bidang ini produktif. Dengan memisahkan kode, konfigurasi, dan data, serta merangkai fungsi-fungsi murni menjadi pipeline deklaratif, Kedro mengubah notebook sekali pakai menjadi proyek yang bisa di-clone, dijalankan, dan dipercaya oleh rekan kerja mana pun.

Poin utama:

  • Kedro adalah framework proyek, bukan scheduler. Ia mendefinisikan struktur; alat seperti Airflow, Dagster, dan Argo menyediakan penjadwalan.
  • Data Catalog menghapus path hardcoded dan memusatkan setiap definisi dataset dalam YAML.
  • Node adalah fungsi murni; pipeline merangkainya menjadi graph yang urutannya disimpulkan Kedro secara otomatis.
  • Konfigurasi, parameter, dan kredensial dipisah per environment, tidak pernah di-hardcode.
  • Kedro-Viz memvisualisasikan DAG, dan hooks/plugin memperluas perilaku serta berintegrasi dengan MLflow dan target deployment.
  • kedro package menghasilkan artefak portabel yang bisa Anda jalankan di orkestrator pilihan Anda.

Mulailah dari yang kecil: modelkan satu pipeline dengan dua atau tiga node, deklarasikan dataset-nya di catalog, dan jalankan dengan kedro run. Disiplin ini langsung berbuah begitu orang kedua perlu menyentuh proyek tersebut.

Artikel Terkait

Tutorial ClearML: Platform MLOps Open-Source untuk Experiment Tracking dan Pipeline Automation

Tutorial ClearML: Platform MLOps Open-Source untuk Experiment Tracking dan Pipeline Automation ClearML adalah platform M...

Tutorial Metaflow: Framework MLOps dari Netflix untuk Data Science

Tutorial Metaflow: Framework MLOps dari Netflix untuk Data Science Metaflow adalah framework open-source yang dikembangk...

Tutorial Marimo: Notebook Python Reaktif dan Reproducible

Marimo: Notebook Python yang Reaktif dan Reproducible Marimo adalah notebook Python yang menyimpan isinya sebagai berkas...

ZenML: Framework Pipeline MLOps yang Modular dan Cloud-Agnostic

ZenML: Framework Pipeline MLOps yang Modular dan Cloud-Agnostic Pendahuluan Membangun model machine learning yang akurat...