Mencatat model MLflow
Artikel ini menjelaskan cara mencatat model terlatih Anda (atau artefak) sebagai model MLflow. Ini mengeksplorasi berbagai cara untuk menyesuaikan bagaimana MLflow mengemas model Anda, dan bagaimana ia menjalankan model tersebut.
Mengapa harus model pengelogan dan bukan artefak?
Dari artefak hingga model di MLflow menjelaskan perbedaan antara artefak atau file pengelogan, dibandingkan dengan pengelogan model MLflow.
Model MLflow juga merupakan artefak. Namun, model tersebut memiliki struktur tertentu yang berfungsi sebagai kontrak antara orang yang membuat model dan orang yang ingin menggunakannya. Kontrak ini membantu membangun jembatan antara artefak itu sendiri dan maknanya.
Pengelogan model memiliki keuntungan berikut:
- Anda dapat langsung memuat model, untuk inferensi, dengan
mlflow.<flavor>.load_model
, dan Anda dapat menggunakanpredict
fungsi - Input alur dapat menggunakan model secara langsung
- Anda dapat menyebarkan model tanpa indikasi skrip penilaian atau lingkungan
- Swagger secara otomatis diaktifkan di titik akhir yang disebarkan, dan studio Azure Pembelajaran Mesin dapat menggunakan fitur Uji
- Anda dapat menggunakan dasbor AI yang bertanggung jawab
Bagian ini menjelaskan cara menggunakan konsep model di Azure Pembelajaran Mesin dengan MLflow:
Model pengelogan menggunakan autolog
Anda dapat menggunakan fungsionalitas autolog MLflow. Autolog memungkinkan MLflow untuk menginstruksikan kerangka kerja yang digunakan untuk mencatat semua metrik, parameter, artefak, dan model yang dianggap relevan oleh kerangka kerja. Secara default, jika autolog diaktifkan, sebagian besar model dicatat. Dalam beberapa situasi, beberapa rasa mungkin tidak mencatat model. Misalnya, rasa PySpark tidak mencatat model yang melebihi ukuran tertentu.
Gunakan salah satu mlflow.autolog()
atau mlflow.<flavor>.autolog()
untuk mengaktifkan pengelogan otomatis. Contoh ini digunakan untuk mencatat model pengklasifikasi autolog()
yang dilatih dengan XGBoost:
import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
mlflow.autolog()
model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
Tip
Jika menggunakan alur Pembelajaran Mesin, misalnya alur Scikit-Learn, gunakan fungsionalitas ragam alur tersebut autolog
untuk mencatat model. Pengelogan model secara otomatis terjadi ketika fit()
metode dipanggil pada objek alur. Melatih dan melacak pengklasifikasi XGBoost dengan notebook MLflow menunjukkan cara mencatat model dengan praproscesing, menggunakan alur.
Model pengelogan dengan tanda tangan, lingkungan, atau sampel khusus
Metode MLflow mlflow.<flavor>.log_model
dapat mencatat model secara manual. Alur kerja ini dapat mengontrol berbagai aspek pengelogan model.
Gunakan metode ini ketika:
- Anda ingin menunjukkan paket pip atau lingkungan conda yang berbeda dari yang terdeteksi secara otomatis
- Anda ingin menyertakan contoh input
- Anda ingin menyertakan artefak tertentu dalam paket yang diperlukan
autolog
tidak menyimpulkan tanda tangan Anda dengan benar. Ini penting ketika Anda berurusan dengan input tensor, di mana tanda tangan membutuhkan bentuk tertentu- Perilaku autolog tidak mencakup tujuan Anda karena alasan tertentu
Contoh kode ini mencatat model untuk pengklasifikasi XGBoost:
import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature
from mlflow.utils.environment import _mlflow_conda_env
mlflow.autolog(log_models=False)
model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
# Signature
signature = infer_signature(X_test, y_test)
# Conda environment
custom_env =_mlflow_conda_env(
additional_conda_deps=None,
additional_pip_deps=["xgboost==1.5.2"],
additional_conda_channels=None,
)
# Sample
input_example = X_train.sample(n=1)
# Log the model manually
mlflow.xgboost.log_model(model,
artifact_path="classifier",
conda_env=custom_env,
signature=signature,
input_example=input_example)
Catatan
autolog
log_models=False
memiliki konfigurasi. Ini mencegah pengelogan model MLflow otomatis. Pengelogan model MLflow otomatis terjadi nanti, sebagai proses manualinfer_signature
Gunakan metode untuk mencoba menyimpulkan tanda tangan langsung dari input dan output- Metode ini
mlflow.utils.environment._mlflow_conda_env
adalah metode privat dalam MLflow SDK. Dalam contoh ini, itu membuat kode lebih sederhana, tetapi menggunakannya dengan hati-hati. Ini dapat berubah di masa depan. Sebagai alternatif, Anda dapat menghasilkan definisi YAML secara manual sebagai kamus Python.
Mencatat model dengan perilaku berbeda dalam metode prediksi
Saat mencatat model dengan mlflow.autolog
atau mlflow.<flavor>.log_model
, ragam model menentukan cara menjalankan inferensi, dan apa yang dikembalikan model. MLflow tidak memberlakukan perilaku spesifik apa pun tentang pembuatan predict
hasil. Dalam beberapa skenario, Anda mungkin ingin melakukan beberapa praproses atau pasca-pemrosesan sebelum dan sesudah model Anda dijalankan.
Dalam situasi ini, terapkan alur pembelajaran mesin yang langsung berpindah dari input ke output. Meskipun implementasi ini dimungkinkan, dan kadang-kadang didorong untuk meningkatkan performa, mungkin menjadi tantangan untuk dicapai. Dalam kasus tersebut, ini dapat membantu menyesuaikan bagaimana model Anda menangani inferensi seperti yang dijelaskan di bagian berikutnya.
Mencatat model kustom
MLflow mendukung banyak kerangka kerja pembelajaran mesin, termasuk
- CatBoost
- FastAI
- h2o
- Keras
- LightGBM
- MLeap
- MXNet Gluon
- ONNX
- Prophet
- PyTorch
- Scikit-Learn
- spaSi
- Spark MLLib
- statsmodels
- TensorFlow
- XGBoost
Namun, Anda mungkin perlu mengubah cara kerja rasa, mencatat model yang tidak didukung secara asli oleh MLflow atau bahkan mencatat model yang menggunakan beberapa elemen dari kerangka kerja yang berbeda. Dalam kasus ini, Anda mungkin perlu membuat rasa model kustom.
Untuk mengatasi masalah tersebut, MLflow memperkenalkan pyfunc
rasa (dimulai dari fungsi Python). Rasa ini dapat mencatat objek apa pun sebagai model, selama objek tersebut memenuhi dua kondisi:
- Anda menerapkan
predict
metode, setidaknya - Objek Python mewarisi dari
mlflow.pyfunc.PythonModel
Tip
Model yang dapat diserialisasikan yang mengimplementasikan API Scikit-learn dapat menggunakan rasa Scikit-learn untuk mencatat model, terlepas dari apakah model dibangun dengan Scikit-learn. Jika Anda dapat mempertahankan model dalam format Pickle, dan objek memiliki predict()
metode dan predict_proba()
(setidaknya), Anda dapat menggunakan mlflow.sklearn.log_model()
untuk mencatat model di dalam eksekusi MLflow.
Jika Anda membuat pembungkus di sekitar objek model yang ada, itu menjadi yang paling sederhana untuk membuat rasa untuk model kustom Anda. MLflow menserialisasikan dan mengemasnya untuk Anda. Objek Python dapat diserialisasikan ketika objek dapat disimpan dalam sistem file sebagai file, umumnya dalam format Pickle. Pada runtime, objek dapat terwujud dari file tersebut. Ini memulihkan semua nilai, properti, dan metode yang tersedia ketika disimpan.
Gunakan metode ini ketika:
- Anda dapat menserialisasikan model Anda dalam format Pickle
- Anda ingin mempertahankan status model, karena hanya setelah pelatihan
- Anda ingin menyesuaikan cara
predict
kerja fungsi.
Sampel kode ini membungkus model yang dibuat dengan XGBoost, untuk membuatnya bertingkah berbeda dari implementasi default rasa XGBoost. Sebaliknya, ia mengembalikan probabilitas alih-alih kelas:
from mlflow.pyfunc import PythonModel, PythonModelContext
class ModelWrapper(PythonModel):
def __init__(self, model):
self._model = model
def predict(self, context: PythonModelContext, data):
# You don't have to keep the semantic meaning of `predict`. You can use here model.recommend(), model.forecast(), etc
return self._model.predict_proba(data)
# You can even add extra functions if you need to. Since the model is serialized,
# all of them will be available when you load your model back.
def predict_batch(self, data):
pass
Catat model kustom dalam proses:
import mlflow
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
from mlflow.models import infer_signature
mlflow.xgboost.autolog(log_models=False)
model = XGBClassifier(use_label_encoder=False, eval_metric="logloss")
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=False)
y_probs = model.predict_proba(X_test)
accuracy = accuracy_score(y_test, y_probs.argmax(axis=1))
mlflow.log_metric("accuracy", accuracy)
signature = infer_signature(X_test, y_probs)
mlflow.pyfunc.log_model("classifier",
python_model=ModelWrapper(model),
signature=signature)
Tip
Di sini, metode ini infer_signature
menggunakan y_probs
untuk menyimpulkan tanda tangan. Kolom target kami memiliki kelas target, tetapi model kami sekarang mengembalikan dua probabilitas untuk setiap kelas.