Cara menyiapkan dan mencatat eksperimen pembelajaran mesin di server pelacakan MLFlow jarak jauh dengan Azure Machine Learning

1. Perkenalan

Alur kerja pembelajaran mesin pada umumnya melibatkan langkah-langkah seperti pra-pemrosesan data, penyesuaian hyperparameter, dan evaluasi model. Seorang ilmuwan data mungkin diharuskan bereksperimen dengan kombinasi hyperparameter, algoritma model, dan langkah-langkah pra-pemrosesan untuk mencapai hasil yang diinginkan. Pencatatan log hyperparameter, algoritme model, hasil, dan artefak model sangat penting untuk memastikan reproduktifitas eksperimen pembelajaran mesin. Tugas berat ini dapat disederhanakan dengan alat MLOps seperti MLFlow.

MLFlow[1] adalah platform sumber terbuka untuk mengelola siklus hidup ML, termasuk eksperimen, reproduktifitas, penerapan, dan registri model terpusat. MLFlow menawarkan 4 komponen berbeda:

  1. Pelacakan MLFlow: Rekam dan kueri eksperimen: kode, data, konfigurasi, dan hasil
  2. Proyek MLFlow: Kemas kode ilmu data dalam format untuk mereproduksi proses di platform apa pun
  3. Model MLFlow: Terapkan model pembelajaran mesin di beragam lingkungan penyajian
  4. Model Registry: Menyimpan, memberi anotasi, menemukan, dan mengelola model di repositori pusat

Seseorang dapat menghosting server pelacakan MLFlow di mesin virtual cloud seperti AWS EC2 atau Azure VM, namun proses pengaturan server dan penyimpanan artefak bisa jadi membosankan. Alternatifnya adalah menggunakan solusi MLFlow terkelola seperti Azure Machine Learning.

Azure Machine Learning adalah bagian dari platform komputasi awan Azure milik Microsoft yang membantu ilmuwan dan insinyur data mengelola alur kerja pembelajaran mesin mereka[2]. Setiap ruang kerja Azure Machine Learning dilengkapi dengan server MLFlow yang telah dikonfigurasi sebelumnya. Kami akan menggunakan fitur pelacakan MLFlow untuk mencatat parameter, hasil, dan artefak dari eksperimen pembelajaran mesin kami ke server MLFow yang dihosting oleh layanan Azure Machine Learning.

Pada artikel ini, kami akan menunjukkan caranya

  1. Siapkan server pelacakan MLFlow jarak jauh di Azure Machine Learning
  2. Latih model secara lokal menggunakan scikit-learn
  3. Catat parameter model lokal, hasil, dan artefak ke server pelacakan MLFlow jarak jauh
  4. Ambil model terlatih dari server pelacakan MLFlow untuk penilaian batch offline

2. Pengaturan

Di bagian ini, kita melihat cara menyiapkan layanan Azure dan lingkungan pelatihan model.

2.1. Buat Akun Azure

Server pelacakan akan dihosting di Azure Machine Learning dan oleh karena itu, kita perlu memiliki akun Azure. Akun baru mendapatkan kredit Azure senilai $200 untuk 30 hari dan 12 bulan pertama gratis untuk layanan tertentu.

2.2. Siapkan Ruang Kerja Azure ML

1. Buat grup sumber daya

Grup sumber daya adalah wadah yang menyimpan sumber daya terkait untuk solusi Azure[3].

  • Buat grup sumber daya baru

  • Isi detail seperti langganan, nama grup sumber daya, dan wilayah

2. Buat Ruang Kerja Azure ML

Ruang kerja adalah sumber daya tingkat atas untuk Azure Machine Learning, menyediakan tempat terpusat untuk bekerja dengan semua artefak yang Anda buat saat Anda menggunakan Azure Machine Learning. Ruang kerja menyimpan riwayat semua pelatihan yang dijalankan, termasuk log, metrik, output, dan cuplikan skrip Anda. Anda menggunakan informasi ini untuk menentukan proses pelatihan mana yang menghasilkan model terbaik[4].

  • Temukan “Pembelajaran Mesin” di bawah Layanan Azure atau melalui bilah pencarian.

  • Klik buat

  • Isi bagian yang kosong. Grup sumber daya adalah grup yang kita buat pada langkah sebelumnya

  • Server pelacakan MLFlow secara otomatis dibuat sebagai bagian dari ruang kerja Azure ML

2.3. Pengaturan Lingkungan Pelatihan

Kami akan menggunakan lingkungan pelatihan lokal (yaitu di PC atau laptop Anda).

IDE

Saya menggunakan Notebook Jupyter dalam Visual Studio Code. Anda bebas menggunakan IDE apa pun.

Lingkungan Conda

Pastikan miniconda3 diinstal pada mesin Anda. Buat lingkungan conda python 3.7 dari antarmuka baris perintah Anda. Nama lingkungannya sewenang-wenang, saya menamakannya general.

#command line
conda create -n general python=3.7

Aktifkan lingkungan conda. Kami akan melakukan semua pekerjaan pengembangan kami di lingkungan ini.

#command line
conda activate general

Paket Python

Pastikan paket berikut diinstal di lingkungan Conda

azureml-core
azureml-mlflow
pandas
numpy
scikit-learn
mlflow

Konfigurasi Ruang Kerja Azure Machine Learning

Unduh konfigurasi ruang kerja Azure Machine Learning.

File konfigurasi dalam format JSON dan berisi informasi berikut:

# config.json
{
    "subscription_id": "your-subscription-id",
    "resource_group": "your-resource-group-name",
    "workspace_name": "your-workspace-name"
}

Kami memerlukan informasi ini untuk terhubung ke ruang kerja AML untuk eksperimen logging.

Struktur Proyek

Di bawah ini adalah direktori lokal untuk proyek saat ini.

  • train.ipynb: berisi pemrosesan data dan kode pelatihan
  • inference.ipynb: berisi kode penilaian batch offline
  • config.json: Konfigurasi ruang kerja Azure ML

3. train.ipynb

Impor paket

import mlflow
from azureml.core import Workspace
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer
from sklearn.impute import SimpleImputer

Siapkan ruang kerja

ws = Workspace.from_config()

Setelah menjalankan sel ini, Anda mungkin diberikan URL untuk melakukan otentikasi web. Ini diperlukan untuk menyambungkan ke ruang kerja Azure Machine Learning. Setelah selesai, Anda dapat kembali ke IDE dan melanjutkan ke langkah berikutnya.

Setel URI pelacakan

URI pelacakan MLFlow adalah alamat tempat kita dapat menemukan server pelacakan MLFlow. Kami menetapkan URI pelacakan agar MLFlow juga mengetahui di mana harus mencatat eksperimen.

mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())

URI pelacakan memiliki format

azureml://<region>.api.azureml.ms/mlflow/v1.0/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.MachineLearningServices/workspaces/<aml-workspace>?

Anda juga dapat menemukan URI pelacakan yang sama di ruang kerja Azure Machine Learning.

Setel eksperimen MLFlow

Kode di bawah mendefinisikan nama eksperimen MLFlow. Eksperimen MLFlow adalah cara mengatur proses yang berbeda. Eksperimen berisi beberapa proses yang masing-masing proses merupakan eksekusi kode pelatihan Anda. Kita dapat menentukan parameter, hasil, dan artefak yang akan disimpan untuk setiap proses. Jika nama eksperimen tidak ada, eksperimen baru akan dibuat, jika tidak, eksperimen yang dijalankan akan dicatat ke dalam eksperimen yang sudah ada dengan nama yang sama.

experiment_name = 'diabetes'
mlflow.set_experiment(experiment_name)

Pra-Pemrosesan Data

Mari muat data dan lakukan pemisahan uji kereta.

input_path = 'path/to/data.csv'
df = pd.read_csv(input_path, sep = ',')
y = df.pop('Outcome')
X = df
X_train, X_test, y_train, y_test = train_test_split(X, y)

Kami membuat scikit-learn FunctionTransformer untuk menemukan nilai “0” di kolom yang dipilih dan menggantinya dengan “NaN”.

def replace_zeros(x):
		
		x = x.copy()
    x[['Glucose','BloodPressure','SkinThickness','Insulin','BMI']] = x[['Glucose','BloodPressure','SkinThickness','Insulin','BMI']].replace(0,np.NaN)
    return x
ft_replace_zeros = FunctionTransformer(replace_zeros)

Buat alur scikit-learn

rf_clf = RandomForestClassifier()
num_imputer = SimpleImputer()
pipe = Pipeline([('replace_zeros', ft_replace_zeros), ('fillna', num_imputer), ('clf', rf_clf)])

Ini adalah langkah-langkah dalam pipeline scikit-learn:

  • replace_zeros: mengganti semua nilai “0” dengan “NaN” menggunakan UDF dan FunctionTransformer scikit-learn
  • fillna: isi nilai yang hilang dengan rata-rata kolom menggunakan SimpleImputer scikit-learn
  • clf: Pengklasifikasi Hutan Acak

Penyetelan Hiperparameter

mlflow.sklearn.autolog(max_tuning_runs=None)
param_grid = {'clf__n_estimators': [1,2,3], 'clf__max_depth':[2,3,4]}
clf = GridSearchCV(pipe, param_grid = param_grid, scoring = ['roc_auc', 'precision', 'recall', 'f1', 'accuracy'], refit = 'roc_auc')
clf.fit(X_train, y_train)

Kode di atas melakukan hal berikut:

  1. Eksperimen log: Memanggil mlflow.sklearn.autolog() sebelum kode pelatihan memungkinkan pencatatan otomatis parameter, metrik, dan model. MLFlow menyediakan autolog untuk kerangka pembelajaran mesin populer seperti scikit-learn, TensorFlow, XGBoost, dll.
  2. Buat grid parameter param_grid dengan parameter yang ingin kita uji
  3. Lakukan GridSearchCV untuk mencari parameter optimal. Setiap kombinasi hyperparameter yang ditentukan di param_grid akan digunakan untuk validasi silang. Hasil, metrik, dan artefak akan dicatat ke MLFlow.

Kita dapat melihat hasil eksekusi di ruang kerja Azure Machine Learning (https://ml.azure.com/) → Eksperimen. Pencatatan log otomatis GridsearchCV membuat proses induk dengan proses anak yang disarangkan. Setiap kumpulan hyperparameter dicatat ke proses anak terpisah.

Detail proses anak dapat ditemukan di proses induk.

Parameter, hasil, dan model eksekusi anak terbaik juga dicatat di bawah eksekusi induk. Gambar di bawah menunjukkan file model dari eksekusi anak terbaik. run_id yang digarisbawahi dengan warna merah adalah pengidentifikasi unik untuk proses yang menghasilkan estimator terbaik.

4. inference.ipynb

Bagian ini memperlihatkan cara memuat model dari Eksperimen MLFlow Azure Machine Learning berdasarkan run_idnya dan menggunakan model untuk penilaian batch offline. Penilaian dilakukan pada komputasi lokal (yaitu PC atau laptop). Bagian ini mengasumsikan lingkungan inferensi memiliki ketergantungan yang sama dengan lingkungan pelatihan.

Impor perpustakaan

import mlflow
from azureml.core import Workspace
import pandas as pd

Konfigurasi Ruang Kerja & MLFlow Azure ML

ws = Workspace.from_config()
mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())

Muat model

Model dapat diambil dari MLFlow menggunakan therun_id.

run_id = '15059f88-d2a8-4c7e-966a-e0a755c97a6e'
model = mlflow.sklearn.load_model(f'runs:/{run_id}/best_estimator', './')

Parameter untuk mlflow.sklearn.load_model() adalah:

  • model_uri: Lokasi, dalam format URI, model MLflow. Jalur ke model mengambil format runs:/<mlflow_run_id>/run-relative/path/to/model
  • dst_path – Jalur sistem file lokal untuk mengunduh artefak model. Direktori ini harus sudah ada. Jika tidak ditentukan, jalur keluaran lokal akan dibuat.

Saat kita menjalankan mlflow.sklearn.load_model(), best_estimator folder yang berisi model.pkl dan file dependensi seperti conda.yaml, requirements.txt dan MLmodel diunduh ke direktori lokal yang ditentukan di dst_path.

Model yang dimuat (model.pkl) adalah objek pipeline scikit-learn yang terpasang. Ini adalah alur yang sama yang kami buat pada fase pelatihan.

Pipeline(steps=[('replace_zeros',
                 FunctionTransformer(func=<function replace_zeros at 0x000001EBEF3F0AF8>)),
                ('fillna', SimpleImputer()),
                ('clf', RandomForestClassifier(max_depth=3, n_estimators=3))])

Memprediksi data baru

new_data = pd.read_csv('/path/to/new_data.csv', sep = ',')
model.predict_proba(new_data) 
#OR
model.predict(new_data)

5. Ringkasan

Dalam artikel ini, kita membahas motivasi pelacakan eksperimen pembelajaran mesin menggunakan MLFlow di Azure Machine Learning dan memeriksa cara:

  1. Siapkan server pelacakan MLFlow jarak jauh di Azure Machine Learning
  2. Latih model secara lokal menggunakan scikit-learn
  3. Catat parameter model, hasil, dan artefak ke MLFlow
  4. Ambil model terlatih dari server pelacakan MLFlow untuk penilaian batch offline

Referensi

[1] MLFlow

[2] Pembelajaran Mesin Azure

[3] Grup Sumber Daya

[4] Ruang Kerja Azure Machine Learning