MLflowmenawarkan beberapa keuntungan dalam mengembangkan dan mengelola model klasifikasi teks:

  1. Pelacakan Eksperimen: MLflow memungkinkan Anda mencatat dan melacak proses pelatihan model, hyperparameter, dan metrik kinerja. Ini membantu Anda menyimpan catatan komprehensif eksperimen Anda, sehingga memudahkan untuk mereproduksi dan membandingkan hasil.
  2. Pembuatan Versi Model: Dengan MLflow, Anda dapat mengontrol versi model Anda, memungkinkan Anda mengelola beberapa iterasi model dan memilih salah satu yang berkinerja terbaik untuk diterapkan.
  3. Kolaborasi: MLflow mempromosikan kolaborasi yang lancar di antara anggota tim. Dengan berbagi eksperimen MLflow, semua orang dapat mengakses, menganalisis, dan mengembangkan pekerjaan yang dilakukan oleh orang lain.
  4. Reprodusibilitas: Dengan menyimpan catatan rinci tentang lingkungan, data, dan kode yang digunakan selama pelatihan model, MLflow memfasilitasi reproduksi hasil, bahkan di seluruh sistem yang berbeda.
  5. Fleksibilitas Penerapan: MLflow mendukung beberapa opsi penerapan, membuatnya lebih mudah untuk melayani model terlatih Anda di berbagai platform, baik lokal maupun di cloud.

Menyiapkan MLflow

Sebelum mendalami klasifikasi teks, mari kita siapkan MLflow terlebih dahulu di lingkungan kita. Pastikan Anda telah menginstal Python, lalu gunakan perintah berikut:

pip install mlflow
mlflow ui

Membangun Model Klasifikasi Teks

Untuk tujuan tutorial ini, kita akan membuat model klasifikasi teks menggunakan kumpulan data berita yang dihasilkan oleh ScrapeHero, salah satu perusahaan web-scraping terkemuka di dunia. "ScrapeHero" memiliki kemampuan untuk menskalakan dan meng-crawl internet untuk mendapatkan data yang relevan guna membantu melatih model AI Anda. Kumpulan data berita ini dihasilkan dari API pasar ScrapeHero Cloud. Kumpulan data yang diawasi ini diklasifikasikan menjadi tenis, politik, kejahatan, hiburan, dan bisnis.

Kita akan menggunakan "ktrain"dan scikit-learn untuk tugas klasifikasi ini. Di bawah ini adalah garis besar langkah-langkah yang akan kami ikuti:

  • Muat dan proses awal kumpulan data. (Kami akan memuat kumpulan data yang telah diproses sebelumnya)
import pandas as pd
try:
 df = pd.read_csv("data/sample.csv")
 classes = list(set(df.label.tolist()))
except Exception as e:
 logger.exception(
 "Unable to load training & test CSV, check the file path. Error: %s", e
 )
  • Bagi data menjadi set pelatihan, pengujian, dan validasi.
from sklearn import model_selection

train_x, valid_x, train_y, valid_y = model_selection.train_test_split(df['content'].tolist(), df['label'].tolist())

trn, val, preproc = text.texts_from_array(x_train=train_x, y_train=train_y,
                                                x_test=valid_x, y_test=valid_y,
                                                class_names=classes,
                                                preprocess_mode='distilbert',
                                                maxlen=256, 
                                                max_features=10000)
  • Melatih model klasifikasi teks menggunakan distilbert.
model = text.text_classifier('distilbert', train_data=trn, preproc=preproc)
learner = ktrain.get_learner(model, train_data=trn, val_data=val, batch_size=6, use_multiprocessing=True)
  • Temukan kecepatan pembelajaran optimal untuk kumpulan data kami menggunakan fungsi bawaan ktrain.
learner.lr_find(max_epochs=2) # finding the learning rate

# The optimal learning rate is `2e-5`.

  • Catat model dan parameter yang relevan seperti akurasi, skor f1, kecepatan pembelajaran, dan periode menggunakan MLflow.

Pelacakan dengan MLflow

Setelah model Anda siap, Anda dapat mencatat eksperimen Anda menggunakan MLflow. Ini termasuk mencatat parameter model, metrik, dan artefak (misalnya, model tersimpan, plot). Berikut cuplikan kode untuk mengilustrasikan prosesnya:

import mlflow
import mlflow.sklearn

from sklearn.metrics import accuracy_score, f1_score

lrate = float(sys.argv[1]) if len(sys.argv) > 1 else 2e-5
epochs = int(sys.argv[2]) if len(sys.argv) > 2 else 1
print("training ktrain distilbert model (lrate={:f}, epochs={:f}):".format(lrate, epochs))
mlflow.set_experiment("text_classification_ktrain")
experiment = mlflow.get_experiment_by_name("text_classification_ktrain")
with mlflow.start_run(experiment_id=experiment.experiment_id, nested=True):
    learner.fit_onecycle(lrate, epochs)
    predictor = ktrain.get_predictor(learner.model, preproc)
    y_pred = predictor.predict(valid_x)
    accuracy = accuracy_score(valid_y, y_pred)
    f1 = f1_score(valid_y, y_pred, average="weighted")
    # logging the metrics and parameters to the mlflow
    mlflow.log_metric("accuracy", round(accuracy, 4))
    mlflow.log_metric("f1-score", round(f1, 4))
    mlflow.log_param("lrate", lrate)
    mlflow.log_param("epochs", epochs)
    # save the model
    mlflow.sklearn.log_model(learner, "text_classification1")

Anda bisa mendapatkan kode kerja lengkap dari repo github ini.

Jalankan file utama distilbertTraining.py menggunakan perintah:

python distilbertTraining.py 2e-6 1

Setelah kita berhasil menjalankan perintah di atas, folder mlruns, folder Id eksperimen, folder ID proses dengan artefak, metrik, dan parameter akan otomatis dibuat sebagai berikut.

Perbandingan dan Penerapan Eksperimen

Setelah mencatat beberapa proses dengan model atau hyperparameter berbeda, Anda dapat membandingkan performanya menggunakan MLflow UI. Representasi visual ini membantu Anda membuat keputusan yang tepat tentang model mana yang akan dipilih untuk penerapan.

Kami telah melatih dua model dengan kecepatan pembelajaran berbeda 2e-5 dan 2e-6. Learning rate 2e-5 sudah optimal dan menghasilkan tingkat akurasi sebesar 93,5% sedangkan learning rate 2e-6 hanya menghasilkan 63,17%.

Temukan Model Terbaik Menggunakan Pelacakan MLflow melalui Kode

from mlflow.tracking import MlflowClient
import mlflow 
import numpy as np

# If you called your experiment something else, replace here
current_experiment=dict(mlflow.get_experiment_by_name("text_classification_ktrain"))
experiment_id=current_experiment['experiment_id']

# To access MLFlow stuff we need to work with MlflowClient
client = MlflowClient()

# Searches runs for a specific attribute
runs = client.search_runs([experiment_id])
print("total runs", len(runs), "experiment id", experiment_id)

# Select the best run according to test_accuracy metric
best_run = np.argmax([f.data.metrics['accuracy'] for f in runs])
best_auc = np.round(runs[best_run].data.metrics['accuracy'], 4)
best_runname = runs[best_run].info.run_name
best_runid = runs[best_run].info.run_id
print(f"Experiment had {len(runs)} rounds")
print(f"Best run name - {best_runname} with run id - {best_runid} has the accuracy of {best_auc}")

Kita bisa melakukan cross check di sini

Selain menemukan model terbaik, kita dapat mendaftarkan model tersebut dan mempromosikannya ke produksi melalui kode Python.

Dalam hal penerapan, MLflow menawarkan berbagai opsi, termasuk menyajikan model melalui REST API atau mengintegrasikannya ke dalam aplikasi web.

Dokumentasi MLflow memiliki banyak contoh dan dapat dilihat di sini.

Anda bisa mendapatkan kode lengkap untuk menyederhanakan model klasifikasi teks dengan MLflow yang disebutkan di atas dari repo GitHub ini.

Kesimpulan

MLflow menyediakan seperangkat alat canggih untuk membangun dan mengelola model ML. Dengan memanfaatkan fitur pelacakan eksperimen, pembuatan versi model, dan kolaborasi MLflow, ilmuwan data dan praktisi NLP dapat menyederhanakan alur kerja mereka, sehingga menghasilkan model ML yang lebih efisien dan andal.

Ingat, blog ini hanya membahas permukaan dari apa yang bisa dilakukan MLflow. Saat Anda mendalami dunia NLP dan klasifikasi teks, MLflow pasti akan menjadi bagian tak terpisahkan dari perangkat pembelajaran mesin Anda. Selamat menyederhanakan & mengklasifikasikan!