MLflow-modellek naplózása
Ez a cikk bemutatja, hogyan naplózhatja a betanított modelleket (vagy összetevőket) MLflow-modellként. Bemutatja, hogyan szabhatja testre az MLflow a modellek csomagjait, és hogyan futtatja ezeket a modelleket.
Miért érdemes modelleket naplózni összetevők helyett?
Az összetevőktől az MLflow-modellekig a naplózási összetevők és a fájlok közötti különbséget írja le az MLflow-modellek naplózásához képest.
Az MLflow-modell szintén összetevő. Ennek a modellnek azonban van egy konkrét struktúrája, amely szerződésként szolgál a modellt létrehozó személy és a használni kívánt személy között. Ez a szerződés segít hidat építeni az összetevők és jelentésük között.
A modellnaplózás az alábbi előnyökkel jár:
- Közvetlenül betöltheti a modelleket a következtetéshez,
mlflow.<flavor>.load_model
és használhatja a függvénytpredict
- A folyamatbemenetek közvetlenül használhatnak modelleket
- A modelleket pontozó szkript vagy környezet megjelölése nélkül is üzembe helyezheti
- A Swagger automatikusan engedélyezve van az üzembe helyezett végpontokon, és az Azure Machine Learning Studio használhatja a Tesztelés funkciót
- Használhatja a Felelős AI-irányítópultot
Ez a szakasz azt ismerteti, hogyan használhatja a modell koncepcióját az Azure Machine Learningben az MLflow használatával:
Modellek naplózása autolog használatával
Az MLflow automatikus naplófunkciói is használhatók. Az autolog lehetővé teszi, hogy az MLflow utasítsa a keretrendszert a keretrendszer által relevánsnak ítélt összes metrikának, paraméternek, összetevőnek és modellnek a naplózására. Alapértelmezés szerint, ha az autolog engedélyezve van, a legtöbb modell naplózása történik. Bizonyos esetekben előfordulhat, hogy egyes ízek nem naplóznak egy modellt. A PySpark-íz például nem naplózza azokat a modelleket, amelyek túllépnek egy bizonyos méretet.
Használja vagy mlflow.autolog()
mlflow.<flavor>.autolog()
aktiválja az automatikus kitöltést. Ez a példa egy XGBoosttal betanított osztályozómodell naplózására használható autolog()
:
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)
Tipp.
Ha Machine Learning-folyamatokat (például Scikit-Learn-folyamatokat) használ, használja a folyamat ízének funkcióit a autolog
modellek naplózásához. A modellnaplózás automatikusan megtörténik, amikor a fit()
metódust meghívják a folyamatobjektumon. Az XGBoost-osztályozó betanítása és nyomon követése az MLflow-jegyzetfüzettel bemutatja, hogyan naplózhat egy modellt előfeldolgozással, folyamatok használatával.
Naplózási modellek egyéni aláírással, környezettel vagy mintákkal
Az MLflow mlflow.<flavor>.log_model
metódus manuálisan naplózhatja a modelleket. Ez a munkafolyamat a modellnaplózás különböző aspektusait szabályozhatja.
Ezt a módszert akkor használja, ha:
- Olyan pipcsomagokat vagy conda környezetet szeretne jelezni, amelyek eltérnek az automatikusan észleltektől
- Bemeneti példákat szeretne felvenni
- Konkrét összetevőket szeretne belefoglalni a szükséges csomagba
autolog
nem megfelelően következtet az aláírásra. Ez akkor számít, ha tenzoros bemenetekkel foglalkozik, ahol az aláírásnak meghatározott alakzatokra van szüksége- Az autolog viselkedés valamilyen okból nem fedi le a célját
Ez a példakód egy XGBoost-osztályozó modelljét naplózza:
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)
Feljegyzés
autolog
konfigurációvallog_models=False
rendelkezik. Ez megakadályozza az MLflow-modell automatikus naplózását. Az MLflow-modell automatikus naplózása később, manuális folyamatként történikinfer_signature
A metódus használatával próbálja meg közvetlenül a bemenetekből és kimenetekből kikövetkezni az aláírást- A
mlflow.utils.environment._mlflow_conda_env
metódus egy privát metódus az MLflow SDK-ban. Ebben a példában egyszerűbbé teszi a kódot, de óvatosan használja. Ez a jövőben változhat. Másik lehetőségként manuálisan is létrehozhatja a YAML-definíciót Python-szótárként.
Más viselkedésű naplózási modellek az előrejelzési módszerben
Ha egy modellt egy vagy mlflow.<flavor>.log_model
több mlflow.autolog
típussal naplóz, a modell íze határozza meg, hogyan hajthatja végre a következtetést, és hogy a modell mit ad vissza. Az MLflow nem kényszerít semmilyen konkrét viselkedést az eredmények generálására predict
vonatkozóan. Bizonyos esetekben érdemes lehet némi előfeldolgozást vagy utófeldolgozást végezni a modell végrehajtása előtt és után.
Ebben a helyzetben olyan gépi tanulási folyamatokat implementálhat, amelyek közvetlenül a bemenetekről a kimenetekre váltanak. Bár ez a megvalósítás lehetséges, és néha a teljesítmény javítására ösztönözhető, nehéz lehet elérni. Ezekben az esetekben segíthet testre szabni , hogyan kezeli a modell a következtetést a következő szakaszban ismertetett módon.
Egyéni modellek naplózása
Az MLflow számos gépi tanulási keretrendszert támogat, többek között
- CatBoost
- FastAI
- h2o
- Keras
- LightGBM
- MLeap
- MXNet Gluon
- ONNX
- Próféta
- PyTorch
- Scikit-Learn
- spaCy
- Spark MLLib
- statsmodels
- TensorFlow
- XGBoost
Előfordulhat azonban, hogy módosítania kell az ízek működését, naplóznia kell egy olyan modellt, amelyet az MLflow nem támogat natív módon, vagy akár naplóznia kell egy olyan modellt, amely különböző keretrendszerek több elemét használja. Ezekben az esetekben előfordulhat, hogy egyéni modellstílust kell létrehoznia.
A probléma megoldásához az MLflow bevezeti az pyfunc
ízt (Egy Python-függvénytől kezdve). Ez az íz bármilyen objektumot képes modellként naplózni, ha az objektum két feltételnek felel meg:
- Implementálja a metódust
predict
, legalább - A Python-objektum a következőtől öröklődik:
mlflow.pyfunc.PythonModel
Tipp.
A Scikit-learn API-t implementáló szerializálható modellek a Scikit-learn-íz használatával naplózhatják a modellt, függetlenül attól, hogy a modell a Scikit-learn használatával készült-e. Ha meg tudja őrizni a modellt Pickle formátumban, és az objektum rendelkezik azokkal predict()
és predict_proba()
metódusokkal (legalább), akkor mlflow.sklearn.log_model()
a modell naplózható egy MLflow-futtatáson belül.
Ha burkolót hoz létre a meglévő modellobjektum köré, az lesz a legegyszerűbb az egyéni modellhez. Az MLflow szerializálja és csomagolja Önnek. A Python-objektumok szerializálhatók, ha az objektum fájlként, általában Pickle formátumban tárolható a fájlrendszerben. Futásidőben az objektum az adott fájlból származhat. Ezzel visszaállítja a mentéskor elérhető összes értéket, tulajdonságot és metódust.
Ezt a módszert akkor használja, ha:
- A modellt pickle formátumban szerializálhatja
- Meg szeretné őrizni a modell állapotát, mivel az éppen a betanítás után történt
- Testre szeretné szabni a
predict
függvény működését.
Ez a kódminta körbefuttat egy XGBoosttal létrehozott modellt, hogy az az alapértelmezett XGBoost-verziótól eltérő módon viselkedjen. Ehelyett a valószínűségeket adja vissza az osztályok helyett:
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
Egyéni modell naplózása a futtatás során:
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)
Tipp.
Ebben a módszerben y_probs
az infer_signature
aláírást kell kikövetkeztetnie. A céloszlop a célosztályt tartalmazza, de a modellünk most az egyes osztályok két valószínűségét adja vissza.