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 diconf/, data didata/. 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 rununtuk 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: truemembuat 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
MemoryDatasetdan 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 clean
houses(housesraw: pd.DataFrame) -> pd.DataFrame:
df = houses
raw.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 clean
houses, 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 split
data, 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 price
prediction.pipelines import dataprocessing as dp
from price
prediction.pipelines import datascience as ds
def register
pipelines() -> 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
save
args:
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("houses
cleaned", 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-airflowmengonversi 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
nameagar 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
01rawhingga08_reportingmembuat lineage mendokumentasikan dirinya sendiri. - Versikan model Anda. Atur
versioned: truepada 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 packagemenghasilkan 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.