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:
- Pelacakan MLFlow: Rekam dan kueri eksperimen: kode, data, konfigurasi, dan hasil
- Proyek MLFlow: Kemas kode ilmu data dalam format untuk mereproduksi proses di platform apa pun
- Model MLFlow: Terapkan model pembelajaran mesin di beragam lingkungan penyajian
- 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
- Siapkan server pelacakan MLFlow jarak jauh di Azure Machine Learning
- Latih model secara lokal menggunakan scikit-learn
- Catat parameter model lokal, hasil, dan artefak ke server pelacakan MLFlow jarak jauh
- 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
Grup sumber daya adalah wadah yang menyimpan sumber daya terkait untuk solusi Azure[3].
- Buka https://portal.azure.com/
- Temukan “Grup sumber daya” di bawah Layanan Azure atau melalui bilah pencarian
- Buat grup sumber daya baru
- Isi detail seperti langganan, nama grup sumber daya, dan wilayah
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 pelatihaninference.ipynb
: berisi kode penilaian batch offlineconfig.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 danFunctionTransformer
scikit-learnfillna
: isi nilai yang hilang dengan rata-rata kolom menggunakanSimpleImputer
scikit-learnclf
: 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:
- Eksperimen log: Memanggil
mlflow.sklearn.autolog()
sebelum kode pelatihan memungkinkan pencatatan otomatis parameter, metrik, dan model. MLFlow menyediakanautolog
untuk kerangka pembelajaran mesin populer seperti scikit-learn, TensorFlow, XGBoost, dll. - Buat grid parameter
param_grid
dengan parameter yang ingin kita uji - Lakukan
GridSearchCV
untuk mencari parameter optimal. Setiap kombinasi hyperparameter yang ditentukan diparam_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_id
nya 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 formatruns:/<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:
- Siapkan server pelacakan MLFlow jarak jauh di Azure Machine Learning
- Latih model secara lokal menggunakan scikit-learn
- Catat parameter model, hasil, dan artefak ke MLFlow
- Ambil model terlatih dari server pelacakan MLFlow untuk penilaian batch offline
Referensi
[1] MLFlow
[3] Grup Sumber Daya