Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt beschreven hoe u uw getrainde machine learning-modellen of artefacten kunt registreren als MLflow-modellen. MLflow is een opensource-framework voor het beheren van machine learning-werkstromen. In dit artikel worden verschillende opties besproken voor het aanpassen van de manier waarop MLflow-pakketten en modellen worden uitgevoerd.
Vereiste voorwaarden
- Het MLflow SDK-pakket
mlflow
Waarom logboekmodellen in plaats van artefacten?
Een MLflow-model is een type artefact. Een model heeft echter een specifieke structuur die fungeert als een contract tussen de persoon die het model maakt en de persoon die het wil gebruiken. Dit contract helpt bij het bouwen van een brug tussen de artefacten zelf en hun betekenissen.
Zie Artefacten en modellen in MLflow voor het verschil tussen logboekregistratieartefacten of bestanden en het vastleggen van MLflow-modellen.
U kunt de bestanden van uw model registreren als artefacten, maar modellogboekregistratie biedt de volgende voordelen:
- U kunt modellen
mlflow.<flavor>.load_modelrechtstreeks laden voor deductie en u kunt depredictfunctie gebruiken. - Pijplijninvoer kan modellen rechtstreeks gebruiken.
- U kunt modellen implementeren zonder een scorescript of een omgeving op te geven.
- Swagger wordt automatisch ingeschakeld in geïmplementeerde eindpunten. Als gevolg hiervan kunt u de testfunctie in Azure Machine Learning Studio gebruiken om modellen te testen.
- U kunt het verantwoordelijke AI-dashboard gebruiken. Zie Het verantwoordelijke AI-dashboard gebruiken in Azure Machine Learning Studio voor meer informatie.
Automatische logboekregistratie gebruiken om modellen te registreren
U kunt MLflow-functionaliteit autolog gebruiken om automatisch modellen te registreren. Wanneer u automatische logboekregistratie gebruikt, legt MLflow alle relevante metrische gegevens, parameters, artefacten en modellen vast in uw framework. De gegevens die worden geregistreerd, zijn afhankelijk van het framework. Als automatische logboekregistratie is ingeschakeld, worden de meeste modellen standaard geregistreerd. In sommige situaties registreren sommige smaken geen modellen. De PySpark-smaak logeert bijvoorbeeld geen modellen die een bepaalde grootte overschrijden.
Gebruik mlflow.autolog of mlflow.<flavor>.autolog om automatische logboekregistratie te activeren. De volgende code gebruikt autolog om een classificatiemodel te registreren dat is getraind met 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)
Aanbeveling
Als u machine learning-pijplijnen gebruikt, bijvoorbeeld scikit-learn-pijplijnen, gebruikt u de functionaliteit van die pijplijnvariant om modellen te registreren. Modellogboekregistratie wordt automatisch uitgevoerd wanneer de fit methode wordt aangeroepen op het pijplijnobject. Zie voor een notebook waarin een model wordt gelogd, inclusief voorafverwerking en het gebruik van pijplijnen, Training en tracking van een XGBoost-classificatie met MLflow.
Logboekmodellen die gebruikmaken van een aangepaste handtekening, omgeving of voorbeelden
U kunt de MLflow-methode mlflow.<flavor>.log_model gebruiken om handmatig modellen te registreren. Deze werkstroom biedt controle over verschillende aspecten van modellogboekregistratie.
Gebruik deze methode wanneer:
- U wilt een Conda-omgeving of pip-pakketten aangeven die verschillen van de automatisch gedetecteerde pakketten of omgevingen.
- U wilt invoervoorbeelden opnemen.
- U wilt specifieke artefacten opnemen in het pakket dat u nodig hebt.
- Met de
autologmethode wordt uw handtekening niet correct afgeleid. Dit geval treedt op wanneer u met tensor-invoer werkt, waarvoor de handtekening een specifieke vorm moet hebben. - De
autologmethode voldoet niet aan al uw behoeften.
Met de volgende code wordt een XGBoost-classificatiemodel vastgelegd:
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)
# Infer the signature.
signature = infer_signature(X_test, y_test)
# Set up a Conda environment.
custom_env =_mlflow_conda_env(
additional_conda_deps=None,
additional_pip_deps=["xgboost==1.5.2"],
additional_conda_channels=None,
)
# Sample the data.
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)
Notitie
- De aanroep naar
autologmaakt gebruik van een configuratie vanlog_models=False. Met deze instelling wordt automatische logboekregistratie van MLflow-modellen uitgeschakeld. Delog_modelmethode wordt later gebruikt om het model handmatig te registreren. - De
infer_signaturemethode wordt gebruikt om de handtekening rechtstreeks van invoer en uitvoer af te stellen. - De
mlflow.utils.environment._mlflow_conda_envmethode is een privémethode in de MLflow SDK. In dit voorbeeld wordt de code gestroomlijnd. Maar gebruik deze methode met voorzichtigheid, omdat deze in de toekomst kan veranderen. Als alternatief kunt u de YAML-definitie handmatig genereren als een Python-woordenlijst.
Logboekmodellen die gebruikmaken van gewijzigd voorspellingsgedrag
Wanneer u mlflow.autolog of mlflow.<flavor>.log_model gebruikt om een model te registreren, bepaalt de modelsmaak hoe de inferentie wordt uitgevoerd. De smaak bepaalt ook wat het model teruggeeft. MLflow dwingt geen specifiek gedrag af over het genereren van predict resultaten. In sommige scenario's wilt u mogelijk uw gegevens vooraf verwerken of nabewerken.
In deze situatie kunt u machine learning-pijplijnen implementeren die rechtstreeks van invoer naar uitvoer worden verplaatst. Hoewel dit type implementatie soms de prestaties kan verbeteren, kan het lastig zijn om te bereiken. In dergelijke gevallen kan het handig zijn om aan te passen hoe uw model deductie verwerkt. Zie de volgende sectie, Aangepaste modellen vastleggen voor meer informatie.
Aangepaste modellen registreren
MLflow ondersteunt veel machine learning-frameworks, waaronder de volgende smaken:
- CatBoost
- FastAI
- H2O
- Keras
- LightGBM
- MLeap
- ONNX
- Profeet
- PyTorch
- scikit-learn
- spaCy
- Spark MLlib
- statsmodels
- TensorFlow
- XGBoost
Zie Built-In Model flavors voor een volledige lijst.
U moet mogelijk echter de manier veranderen waarop een variant werkt of een model registreren dat MLflow niet natively ondersteunt. Of mogelijk moet u een model vastleggen dat meerdere elementen uit verschillende frameworks gebruikt. In dergelijke gevallen kunt u een aangepaste modelsmaak maken.
Om het probleem op te lossen, biedt MLflow de PyFunc-smaak, een standaardmodelinterface voor Python-modellen. Met deze smaak kan elk object als model worden vastgelegd zolang dat object aan twee voorwaarden voldoet:
- U implementeert ten minste de
predictmethode. - Het Python-object neemt over van de
mlflow.pyfunc.PythonModelklasse.
Aanbeveling
Serialiseerbare modellen die de scikit-learn-API implementeren, kunnen de scikit-learn-smaak gebruiken om het model te registreren, ongeacht of het model is gebouwd met scikit-learn. Als u uw model in Pickle-indeling kunt behouden en het object ten minste de predict en predict_proba methoden heeft, kunt mlflow.sklearn.log_model u het model in een MLflow-uitvoering registreren.
De eenvoudigste manier om een smaak voor uw aangepaste model te maken, is door een wrapper rond uw bestaande modelobject te maken. MLflow serialiseert en verpakt uw model voor u. Python-objecten zijn serialiseerbaar wanneer het object als een bestand in het bestandssysteem kan worden opgeslagen, meestal in Pickle-indeling. Tijdens runtime kan het object vanuit dat bestand worden geladen. Bij het laden worden alle waarden, eigenschappen en methoden hersteld die beschikbaar zijn wanneer deze worden opgeslagen.
Gebruik deze methode wanneer:
- U kunt uw model serialiseren in Pickle-formaat.
- U wilt de toestand van het model net na de training behouden.
- U wilt aanpassen hoe de
predictfunctie werkt.
Met de volgende code wordt een model ingepakt dat is gemaakt met XGBoost, zodat het zich anders gedraagt dan de standaardimplementatie van de XGBoost-versie. Het retourneert waarschijnlijkheden in plaats van klassen.
from mlflow.pyfunc import PythonModel, PythonModelContext
class ModelWrapper(PythonModel):
def __init__(self, model):
self._model = model
def predict(self, context: PythonModelContext, data):
# The next line uses a prediction function. However, you could also use model.recommend(), model.forecast(), or a similar function instead.
return self._model.predict_proba(data)
# You can add extra functions if you need to. Because the model is serialized,
# all of them are available when you load your model.
def predict_batch(self, data):
pass
Gebruik de volgende code om een aangepast model te registreren tijdens een uitvoering:
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)
Aanbeveling
In de voorgaande code gebruikt de infer_signature methode y_probs om de handtekening af te leiden. De doelkolom bevat de doelklasse, maar het model retourneert twee waarschijnlijkheden voor elke klasse.