Pendahuluan
Pipeline, Deployment, dan MLOps adalah konsep yang sangat penting bagi data scientist saat ini. Membangun model di Notebook saja tidak cukup. Mendeploy pipeline dan mengelola proses ujung-ke-ujung dengan praktik terbaik MLOps menjadi fokus yang kian meningkat bagi banyak perusahaan. Tutorial ini membahas beberapa konsep penting seperti Pipeline, CI/CD, API, Container, Docker, Kubernetes. Anda juga akan mempelajari kerangka kerja dan pustaka MLOps di Python. Terakhir, tutorial ini menunjukkan implementasi ujung-ke-ujung untuk membuat container aplikasi web ML berbasis Flask dan mendeploy-nya di cloud Microsoft Azure.
Konsep Utama
MLOps
MLOps adalah singkatan dari Machine Learning Operations. MLOps berfokus pada penyederhanaan proses mendeploy model machine learning ke produksi, kemudian memelihara dan memantaunya. MLOps merupakan fungsi kolaboratif, biasanya terdiri dari data scientist, ML engineer, dan DevOps engineer. Kata MLOps merupakan gabungan dari dua bidang berbeda, yaitu machine learning dan DevOps dari rekayasa perangkat lunak.
MLOps dapat mencakup segala hal mulai dari data pipeline hingga produksi model machine learning. Di beberapa tempat, Anda akan melihat implementasi MLOps hanya untuk deployment model machine learning, namun Anda juga akan menemukan perusahaan yang menerapkan MLOps di banyak area pengembangan Siklus Hidup ML, termasuk Exploratory Data Analysis (EDA), Pra-pemrosesan Data, Pelatihan Model, dan sebagainya.
Walaupun MLOps berawal sebagai serangkaian praktik terbaik, MLOps perlahan berkembang menjadi pendekatan mandiri untuk manajemen siklus hidup ML. MLOps berlaku untuk seluruh siklus hidup—mulai dari integrasi dengan pembuatan model (software development lifecycle dan continuous integration/continuous delivery), orkestrasi, dan deployment, hingga kesehatan, diagnostik, tata kelola, dan metrik bisnis.

Mengapa MLOps?
Ada banyak tujuan yang ingin dicapai perusahaan melalui MLOps. Beberapa yang umum adalah:
- Automasi
- Skalabilitas
- Reproducibility (kemampuan direproduksi)
- Pemantauan
- Tata kelola
MLOps vs DevOps
DevOps adalah pendekatan iteratif untuk mengirimkan aplikasi perangkat lunak ke produksi. MLOps meminjam prinsip yang sama untuk membawa model machine learning ke produksi. Baik DevOps maupun MLOps, tujuan akhirnya adalah kualitas yang lebih tinggi dan kontrol terhadap aplikasi perangkat lunak/model ML.
CI/CD: continuous integration, continuous delivery, dan continuous deployment.
CI/CD adalah praktik yang diturunkan dari DevOps dan merujuk pada proses berkelanjutan untuk mengenali masalah, menilai ulang, dan memperbarui model machine learning secara otomatis. Konsep utama yang terkait dengan CI/CD adalah continuous integration, continuous delivery, dan continuous deployment. Ini mengotomatisasi pipeline machine learning (membangun, menguji, dan mendeploy) serta sangat mengurangi kebutuhan intervensi manual data scientist, sehingga menjadi efisien, cepat, dan lebih sedikit rawan kesalahan manusia.

Pipeline
Pipeline machine learning adalah cara untuk mengendalikan dan mengotomatisasi alur kerja yang diperlukan untuk menghasilkan model machine learning. Pipeline machine learning terdiri dari beberapa langkah berurutan yang melakukan segala hal mulai dari ekstraksi dan pra-pemrosesan data hingga pelatihan dan deployment model.
Pipeline machine learning bersifat iteratif karena setiap langkah diulang untuk terus meningkatkan akurasi model dan mencapai tujuan akhir.

Istilah Pipeline digunakan secara umum untuk menggambarkan rangkaian langkah mandiri yang disusun bersama untuk mencapai suatu tugas. Tugas ini bisa berupa machine learning atau bukan. Machine Learning Pipeline sangat umum, tetapi bukan satu-satunya jenis pipeline yang ada. Data Orchestration Pipeline adalah contoh lainnya. Menurut dokumen Microsoft, ada tiga skenario:

Deployment
Deployment model machine learning (atau pipeline) adalah proses membuat model tersedia di produksi sehingga aplikasi web, perangkat lunak perusahaan (ERP), dan API dapat menggunakan model terlatih dengan memberikan titik data baru dan mendapatkan prediksi.
Singkatnya, Deployment dalam Machine Learning adalah metode mengintegrasikan model machine learning ke dalam lingkungan produksi yang ada untuk membuat keputusan bisnis praktis berbasis data. Ini adalah tahap terakhir dalam siklus hidup machine learning.
Biasanya istilah Deployment Model Machine Learning digunakan untuk menggambarkan deployment seluruh Pipeline Machine Learning, di mana model itu sendiri hanyalah salah satu komponen dari Pipeline.

Seperti yang terlihat pada contoh di atas, pipeline ini terdiri dari model Regresi Logistik. Ada beberapa langkah dalam pipeline yang harus dijalankan terlebih dahulu sebelum pelatihan dapat dimulai, seperti imputasi nilai hilang, One-Hot encoding, penskalaan, dan Principal Component Analysis (PCA).
Application Programming Interface (API)
Application Programming Interface (API) adalah perantara perangkat lunak yang memungkinkan dua aplikasi saling berkomunikasi. Secara sederhana, API adalah kontrak antara dua aplikasi yang menyatakan bahwa jika perangkat lunak pengguna memberikan input dalam format yang telah ditentukan, API akan memberikan keluaran kepada pengguna. Dengan kata lain, API adalah end-point tempat Anda meng-host model machine learning/pipeline terlatih untuk digunakan. Dalam praktiknya, bentuknya seperti ini:

Container
Pernahkah Anda mengalami masalah ketika kode Python Anda (atau kode lain) berjalan baik di komputer Anda tetapi saat teman Anda mencoba menjalankan kode yang persis sama, tidak berhasil? Jika teman Anda mengulangi langkah yang sama persis, seharusnya mereka mendapatkan hasil yang sama, bukan? Jawaban sederhananya adalah lingkungan Python teman Anda berbeda dengan milik Anda.
Apa saja yang termasuk dalam sebuah lingkungan?
Python (atau bahasa lain yang Anda gunakan) serta semua pustaka dan dependensi yang digunakan untuk membangun aplikasi tersebut.
Jika kita bisa membuat suatu lingkungan yang dapat kita pindahkan ke mesin lain (misalnya komputer teman Anda atau penyedia layanan cloud seperti Microsoft Azure, AWS, atau GCP), kita dapat mereproduksi hasil di mana saja. Container adalah jenis perangkat lunak yang mengemas suatu aplikasi dan semua dependensinya sehingga aplikasi dapat berjalan andal dari satu lingkungan komputasi ke lingkungan lainnya.
Cara paling intuitif untuk memahami container dalam data science adalah membayangkan kontainer di kapal. Tujuannya adalah mengisolasi isi satu kontainer dari kontainer lain agar tidak tercampur. Inilah tepatnya fungsi container dalam data science.
Sekarang setelah kita memahami metafora di balik container, mari lihat opsi alternatif untuk membuat lingkungan terisolasi bagi aplikasi kita. Salah satu alternatif sederhana adalah memiliki mesin terpisah untuk setiap aplikasi Anda.
Menggunakan mesin terpisah memang lugas, tetapi tidak mengungguli manfaat penggunaan container, karena memelihara banyak mesin untuk setiap aplikasi itu mahal, sulit dipelihara, dan sukar diskalakan. Singkatnya, tidak praktis di banyak skenario nyata.
Alternatif lain untuk membuat lingkungan terisolasi adalah menggunakan mesin virtual. Container kembali lebih disukai karena membutuhkan lebih sedikit sumber daya, sangat portabel, dan lebih cepat dijalankan.

Dapatkah Anda mengidentifikasi perbedaan antara Virtual Machine dan Container? Saat menggunakan container, Anda tidak memerlukan sistem operasi tamu. Bayangkan 10 aplikasi berjalan pada mesin virtual. Ini akan memerlukan 10 sistem operasi tamu dibandingkan tidak ada yang diperlukan saat Anda menggunakan container.
Docker
Docker adalah perusahaan yang menyediakan perangkat lunak (juga disebut Docker) yang memungkinkan pengguna membangun, menjalankan, dan mengelola container. Meskipun container Docker paling umum, alternatif lain yang kurang terkenal seperti LXD dan LXC juga menyediakan solusi container.
Docker adalah alat yang dirancang untuk memudahkan pembuatan, deployment, dan menjalankan aplikasi dengan menggunakan container. Container digunakan untuk mengemas aplikasi beserta semua komponen yang diperlukan, seperti pustaka dan dependensi lain, dan mengirimkannya sebagai satu paket.

Mengurai hype
Pada akhirnya, Docker hanyalah sebuah file dengan beberapa baris instruksi yang disimpan di bawah folder proyek Anda dengan nama "Dockerfile".
Cara lain untuk memikirkan Dockerfile adalah mengibaratkannya seperti resep yang Anda ciptakan di dapur Anda sendiri. Ketika Anda membagikan resep tersebut kepada orang lain dan mereka mengikuti instruksi yang sama persis, mereka dapat menghasilkan hidangan yang sama. Demikian pula, Anda dapat membagikan Dockerfile kepada orang lain, yang kemudian dapat membuat image dan menjalankan container berdasarkan Dockerfile tersebut.
Kubernetes
Dikembangkan oleh Google pada tahun 2014, Kubernetes adalah sistem open-source yang andal untuk mengelola aplikasi berbasis container. Sederhananya, Kubernetes adalah sistem untuk menjalankan dan mengoordinasikan aplikasi berbasis container di seluruh kluster mesin. Ini adalah platform yang dirancang untuk sepenuhnya mengelola siklus hidup aplikasi yang dikontainerisasi.
Fitur
- Load Balancing: Secara otomatis mendistribusikan beban di antara container.
- Skalabilitas: Secara otomatis menambah atau mengurangi skala dengan menambah atau menghapus container saat permintaan berubah, misalnya pada jam sibuk, serta akhir pekan dan hari libur.
- Penyimpanan: Menjaga konsistensi penyimpanan dengan banyak instance aplikasi.
Mengapa Anda memerlukan Kubernetes jika sudah memiliki Docker?
Bayangkan skenario di mana Anda harus menjalankan banyak container Docker, pada banyak mesin, untuk mendukung aplikasi ML tingkat perusahaan dengan beban kerja yang bervariasi siang dan malam. Sesederhana kedengarannya, ini adalah banyak pekerjaan jika dilakukan secara manual.
Anda perlu memulai container yang tepat pada waktu yang tepat, mencari cara agar mereka dapat saling berkomunikasi, menangani pertimbangan penyimpanan, serta menangani container atau perangkat keras yang gagal. Inilah masalah yang diselesaikan Kubernetes, dengan memungkinkan sejumlah besar container bekerja bersama secara harmonis dan mengurangi beban operasional.
Google Kubernetes Engine adalah implementasi Kubernetes open-source dari Google di Google Cloud Platform. Alternatif populer lainnya untuk GKE adalah Amazon ECS dan Microsoft Azure Kubernetes Service.
Rekap singkat istilah:
- Container adalah jenis perangkat lunak yang mengemas aplikasi dan semua dependensinya sehingga aplikasi berjalan andal dari satu lingkungan komputasi ke lingkungan lainnya.
- Docker adalah perangkat lunak yang digunakan untuk membangun dan mengelola container.
- Kubernetes adalah sistem open-source untuk mengelola aplikasi yang dikontainerisasi dalam lingkungan kluster.

Kerangka Kerja dan Pustaka MLOps di Python
MLflow
MLflow adalah platform open-source untuk mengelola siklus hidup ML, termasuk eksperimen, kemampuan reproduksi, deployment, dan model registry terpusat. MLflow saat ini menawarkan MLflow Tracking, MLflow Projects, MLflow Models, dan Model Registry.
Metaflow
Metaflow adalah pustaka Python yang ramah pengguna yang membantu ilmuwan dan engineer membangun serta mengelola proyek data science nyata. Metaflow awalnya dikembangkan di Netflix untuk meningkatkan produktivitas data scientist yang mengerjakan berbagai proyek, dari statistik klasik hingga deep learning mutakhir. Metaflow menyediakan API terpadu ke tumpukan infrastruktur yang diperlukan untuk menjalankan proyek data science, dari prototipe hingga produksi.
Kubeflow
Kubeflow adalah platform machine learning open-source yang dirancang agar pipeline machine learning dapat mengorkestrasi alur kerja kompleks yang berjalan di Kubernetes. Kubeflow didasarkan pada metode internal Google untuk mendeploy model TensorFlow yang disebut TensorFlow Extended.
Kedro
Kedro adalah kerangka kerja Python open-source untuk membuat kode data science yang dapat direproduksi, mudah dipelihara, dan modular. Kedro meminjam konsep dari praktik terbaik rekayasa perangkat lunak dan menerapkannya pada kode machine learning; konsep yang diterapkan termasuk modularitas, pemisahan kepentingan, dan versioning.
FastAPI
FastAPI adalah kerangka kerja Web untuk mengembangkan RESTful API di Python. FastAPI berbasis Pydantic dan type hints untuk memvalidasi, menserialisasi, dan mendeserialisasi data, serta secara otomatis menghasilkan dokumen OpenAPI.
ZenML
ZenML adalah kerangka kerja MLOps open-source yang dapat diperluas untuk membuat pipeline machine learning siap produksi. Dibuat untuk data scientist, sintaksnya sederhana dan fleksibel, tidak bergantung pada cloud atau alat tertentu, serta memiliki antarmuka/abstraksi yang disesuaikan untuk alur kerja ML.
Contoh: Pengembangan Pipeline, Deployment, dan MLOps Ujung-ke-Ujung
Penyiapan Masalah
Sebuah perusahaan asuransi ingin meningkatkan peramalan arus kas dengan memprediksi biaya pasien secara lebih akurat, menggunakan metrik demografis dan risiko kesehatan dasar pasien pada saat rawat inap.

Tujuan kami adalah membangun dan mendeploy aplikasi web di mana informasi demografis dan kesehatan pasien dimasukkan ke dalam formulir berbasis web, yang kemudian menghasilkan prediksi besaran biaya. Untuk mencapainya, kita akan melakukan hal berikut:
- Melatih dan mengembangkan pipeline machine learning untuk deployment (model regresi linier sederhana).
- Membangun aplikasi web menggunakan kerangka kerja Flask. Aplikasi ini akan menggunakan pipeline ML terlatih untuk menghasilkan prediksi pada titik data baru secara real-time (kode front-end bukan fokus tutorial ini).
- Membuat image dan container Docker.
- Menerbitkan container ke Azure Container Registry (ACR).
- Mendeploy aplikasi web dalam container dengan mempublikasikannya ke ACR. Setelah dideploy, aplikasi akan tersedia untuk publik dan dapat diakses melalui URL Web.
Pipeline Machine Learning
Saya akan menggunakan PyCaret di Python untuk melatih dan mengembangkan pipeline machine learning yang akan digunakan sebagai bagian dari aplikasi web kita. Anda dapat menggunakan kerangka kerja apa pun yang Anda suka karena langkah-langkah selanjutnya tidak bergantung pada hal ini.
# load dataset
from pycaret.datasets import get_data
insurance = get_data('insurance')
# init environment
from pycaret.regression import *
r1 = setup(insurance, target = 'charges', session_id = 123,
normalize = True,
polynomial_features = True, trigonometry_features = True,
feature_interaction=True,
bin_numeric_features= ['age', 'bmi'])
# train a model
lr = create_model('lr')
# save pipeline/model
save_model(lr, model_name = 'c:/username/pycaret-deployment-azure/deployment_28042020')
Saat Anda menyimpan model di PyCaret, seluruh pipeline transformasi dibuat berdasarkan konfigurasi yang didefinisikan dalam fungsi setup. Semua ketergantungan antar-komponen diorkestrasi secara otomatis. Lihat pipeline dan model yang disimpan dalam variabel 'deployment_28042020':

Aplikasi Web Front-end
Tutorial ini tidak berfokus pada pembuatan aplikasi Flask. Hal ini hanya dibahas untuk kelengkapan. Kini setelah pipeline machine learning siap, kita memerlukan aplikasi web yang dapat membaca pipeline terlatih kita untuk memprediksi titik data baru. Ada dua bagian dari aplikasi ini:
- Front-end (dirancang menggunakan HTML)
- Back-end (dikembangkan menggunakan Flask)
Seperti inilah tampilan front-end:

Front-end aplikasi ini adalah HTML yang sangat sederhana dengan sedikit gaya CSS. Jika Anda ingin melihat kodenya, silakan lihat repo ini. Kini setelah kita memiliki aplikasi web yang berfungsi penuh, kita dapat memulai proses membuat container aplikasi menggunakan Docker.
Back-end aplikasi
Back-end aplikasi adalah file Python bernama app.py. File ini dibangun menggunakan kerangka kerja Flask.
from flask import Flask,request, url_for, redirect, render_template, jsonify
from pycaret.regression import *
import pandas as pd
import pickle
import numpy as np
app = Flask(__name__)
model = load_model('deployment_28042020')
cols = ['age', 'sex', 'bmi', 'children', 'smoker', 'region']
@app.route('/')
def home():
return render_template("home.html")
@app.route('/predict',methods=['POST'])
def predict():
int_features = [x for x in request.form.values()]
final = np.array(int_features)
data_unseen = pd.DataFrame([final], columns = cols)
prediction = predict_model(model, data=data_unseen, round = 0)
prediction = int(prediction.Label[0])
return render_template('home.html',pred='Expected Bill will be {}'.format(prediction))
@app.route('/predict_api',methods=['POST'])
def predict_api():
data = request.get_json(force=True)
data_unseen = pd.DataFrame([data])
prediction = predict_model(model, data=data_unseen)
output = prediction.Label[0]
return jsonify(output)
if __name__ == '__main__':
app.run(debug=True)
Container Docker
Jika Anda menggunakan Windows, Anda harus menginstal Docker untuk Windows. Jika Anda menggunakan Ubuntu, Docker sudah tersedia secara bawaan dan tidak perlu instalasi.
Langkah pertama untuk membuat container aplikasi Anda adalah menulis Dockerfile di folder/direktori yang sama tempat aplikasi Anda berada. Dockerfile hanyalah file dengan serangkaian instruksi. Dockerfile untuk proyek ini terlihat seperti ini:
FROM python:3.7
RUN pip install virtualenv
ENV VIRTUAL_ENV=/venv
RUN virtualenv venv -p python3
ENV PATH="VIRTUAL_ENV/bin:$PATH"
WORKDIR /app
ADD . /app
# install dependencies
RUN pip install -r requirements.txt
# expose port
EXPOSE 5000
# run application
CMD ["python", "app.py"]
Dockerfile bersifat case-sensitive dan harus berada di folder proyek bersama file proyek lainnya. Dockerfile tidak memiliki ekstensi dan dapat dibuat menggunakan editor apa pun. Kami menggunakan Visual Studio Code untuk membuatnya.
Deployment di Cloud
Setelah menyiapkan Dockerfile dengan benar, kita akan menulis beberapa perintah untuk membuat image Docker dari file ini, tetapi pertama-tama, kita memerlukan layanan untuk meng-host image tersebut. Dalam contoh ini, kita akan menggunakan Microsoft Azure untuk meng-host aplikasi kita.
Azure Container Registry
Jika Anda tidak memiliki akun Microsoft Azure atau belum pernah menggunakannya, Anda dapat mendaftar gratis. Saat Anda mendaftar pertama kali, Anda mendapatkan kredit gratis untuk 30 hari pertama. Anda dapat memanfaatkan kredit tersebut untuk membangun dan mendeploy aplikasi web di Azure. Setelah mendaftar, ikuti langkah-langkah berikut:
- Masuk ke https://portal.azure.com
- Klik Create a Resource
- Cari Container Registry dan klik Create
- Pilih Subscription, Resource group, dan Registry name (dalam kasus kami: pycaret.azurecr.io adalah nama registry kami)

Setelah registry dibuat, langkah pertama adalah membangun image Docker menggunakan command line. Arahkan ke folder proyek dan jalankan kode berikut:
docker build -t pycaret.azurecr.io/pycaret-insurance:latest .

- pycaret.azurecr.io adalah nama registry yang Anda dapatkan saat membuat resource di portal Azure
- pycaret-insurance adalah nama image dan latest adalah tag; ini bisa apa saja sesuai keinginan Anda
Menjalankan container dari image Docker
Sekarang setelah image dibuat, kita akan menjalankan container secara lokal dan menguji aplikasi sebelum mendorongnya ke Azure Container Registry. Untuk menjalankan container secara lokal, jalankan kode berikut:
docker run -d -p 5000:5000 pycaret.azurecr.io/pycaret-insurance
Anda dapat melihat aplikasi berjalan dengan membuka localhost:5000 di peramban internet Anda. Seharusnya terbuka aplikasi web.

Jika Anda dapat melihat ini, berarti aplikasi kini aktif dan berjalan di mesin lokal Anda dan sekarang tinggal mendorongnya ke cloud. Untuk deployment di Azure, lanjutkan membaca:
Autentikasi Kredensial Azure
Satu langkah terakhir sebelum Anda dapat mengunggah container ke ACR adalah mengautentikasi kredensial Azure di mesin lokal Anda. Jalankan kode berikut di command line untuk melakukannya:
docker login pycaret.azurecr.io
Anda akan diminta memasukkan nama pengguna dan kata sandi. Nama pengguna adalah nama registry Anda (dalam contoh ini nama pengguna adalah "pycaret"). Anda dapat menemukan kata sandi di bawah access keys dari resource Azure Container Registry yang Anda buat.

Mendorong Container ke Azure Container Registry
Sekarang setelah Anda diautentikasi ke ACR, Anda dapat mendorong container yang telah Anda buat ke ACR dengan menjalankan kode berikut:
docker push pycaret.azurecr.io/pycaret-insurance:latest
Tergantung ukuran container, perintah push mungkin memerlukan waktu untuk mentransfer container ke cloud.
Aplikasi Web
Untuk membuat aplikasi web di Azure, ikuti langkah-langkah berikut:
- Masuk ke portal Azure
- Klik create a resource
- Cari web app dan klik create
- Tautkan image ACR Anda ke aplikasi


Aplikasi sekarang aktif dan berjalan di Azure Web Services.

Kesimpulan
MLOps membantu memastikan bahwa model yang dideploy terpelihara dengan baik, berkinerja sesuai harapan, dan tidak berdampak buruk pada bisnis. Peran ini krusial dalam melindungi bisnis dari risiko akibat model yang mengalami drift seiring waktu, atau yang dideploy tetapi tidak dipelihara atau tidak dipantau.
MLOps menempati posisi teratas dalam peringkat Pekerjaan yang Berkembang di LinkedIn, dengan pertumbuhan 9,8 kali lipat dalam lima tahun.
Anda dapat melihat MLOps Fundamentals Skill Track yang baru di DataCamp, yang mencakup siklus hidup lengkap aplikasi machine learning, mulai dari pengumpulan kebutuhan bisnis hingga tahap perancangan, pengembangan, deployment, operasi, dan pemeliharaan. Datacamp juga memiliki kursus Understanding Data Engineering yang luar biasa. Daftar hari ini untuk mengetahui bagaimana data engineer menyiapkan fondasi yang memungkinkan data science terlaksana, tanpa perlu coding.
