Artefacten en modellen in MLflow
In dit artikel worden MLflow-artefacten en MLflow-modellen uitgelegd en hoe MLflow-modellen verschillen van andere artefacten. In het artikel wordt ook uitgelegd hoe Azure Machine Learning gebruikmaakt van de kenmerken van een MLflow-model om gestroomlijnde implementatiewerkstromen mogelijk te maken.
Artefacten en modellen
In MLflow zijn er enkele fundamentele verschillen tussen het vastleggen van eenvoudige bestandsartefacten en het vastleggen van MLflow-modellen.
Artefact
Een artefact is een bestand dat wordt gegenereerd en vastgelegd op basis van de uitvoering of taak van een experiment. Een artefact kan een model zijn dat wordt geserialiseerd als een pickle-bestand, de gewichten van een PyTorch- of TensorFlow-model, of een tekstbestand met de coëfficiënten van een lineaire regressie. Sommige artefacten hebben niets te maken met het model zelf, maar bevatten uitvoeringsconfiguraties, voorverwerkingsgegevens of voorbeeldgegevens. Artefacten kunnen verschillende indelingen hebben.
In het volgende voorbeeld wordt een bestandsartefact in een logboek opgeslagen.
filename = 'model.pkl'
with open(filename, 'wb') as f:
pickle.dump(model, f)
mlflow.log_artifact(filename)
Modelleren
Een MLflow-model is een artefact waarvoor u sterkere veronderstellingen maakt die een duidelijk contract bieden tussen de opgeslagen bestanden en wat ze betekenen. Als u echter de bestanden van uw model gewoon als artefacten vastlegt, moet u weten wat elk van de bestanden betekent en hoe u deze laadt voor deductie.
U kunt MLflow-modellen registreren met behulp van de MLflow SDK, bijvoorbeeld:
import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")
Het vastleggen van MLflow-modellen in Azure Machine Learning heeft de volgende voordelen:
- U kunt MLflow-modellen implementeren in realtime- of batcheindpunten zonder een scorescript of een omgeving op te geven.
- Wanneer u MLflow-modellen implementeert, genereren de implementaties automatisch een swagger-bestand, zodat u de functie Testen in Azure Machine Learning-studio kunt gebruiken.
- U kunt MLflow-modellen rechtstreeks als pijplijninvoer gebruiken.
- U kunt het verantwoordelijke AI-dashboard gebruiken met MLflow-modellen.
De MLmodel-indeling
Voor modellen die zijn geregistreerd als eenvoudige artefactbestanden, moet u weten wat de opbouwfunctie voor modellen voor elk bestand is bedoeld voordat u het model voor deductie kunt laden. Maar voor MLflow-modellen laadt u het model met behulp van de MLmodel-indeling om het contract op te geven tussen de artefacten en wat ze vertegenwoordigen.
In de MLmodel-indeling worden assets opgeslagen in een map die geen specifieke naamgevingsvereiste heeft. Een van de assets is een bestand met de naam MLmodel dat de enige bron van waarheid is voor het laden en gebruiken van het model.
In de volgende afbeelding ziet u een MLflow-modelmap met de naam credit_defaults_model in Azure Machine Learning-studio. De map bevat het MLmodel-bestand en andere modelartefacten.
In het volgende voorbeeld ziet u een MLmodel-bestand voor een computer vision-model dat is getraind met fastai
:
artifact_path: classifier
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
Modelaroma's
Gezien het grote aantal beschikbare machine learning-frameworks heeft MLflow het concept smaak geïntroduceerd als een manier om een uniek contract te bieden voor alle machine learning-frameworks. Een smaak geeft aan wat u kunt verwachten voor een bepaald model dat is gemaakt met een specifiek framework. TensorFlow heeft bijvoorbeeld een eigen smaak, waarmee wordt aangegeven hoe een TensorFlow-model moet worden bewaard en geladen.
Omdat elke modelsmaak aangeeft hoe het model moet worden behouden en geladen voor een bepaald framework, dwingt de MLmodel-indeling geen enkel serialisatiemechanisme af dat alle modellen moeten ondersteunen. Daarom kan elke smaak de methoden gebruiken die de beste prestaties of beste ondersteuning bieden volgens hun best practices, zonder de compatibiliteit met de MLmodel-standaard in gevaar te brengen.
In het volgende voorbeeld ziet u de flavors
sectie voor een fastai
model.
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
Modelhandtekening
Een handtekening van een MLflow-model is een belangrijk onderdeel van de modelspecificatie, omdat het fungeert als een gegevenscontract tussen het model en de server waarop het model wordt uitgevoerd. Een modelhandtekening is ook belangrijk voor het parseren en afdwingen van de invoertypen van een model tijdens de implementatie. Als er een handtekening beschikbaar is, dwingt MLflow de invoertypen af wanneer gegevens naar uw model worden verzonden. Zie MLflow-handtekening afdwingen voor meer informatie.
Handtekeningen worden aangegeven op het moment dat modellen worden geregistreerd en blijven behouden in de signature
sectie van het MLmodel-bestand . Met de functie Autolog in MLflow kunt u automatisch handtekeningen afleiden. U kunt modellen echter handmatig registreren als de uitgestelde handtekeningen niet de handtekeningen zijn die u nodig hebt. Zie Modellen vastleggen met handtekeningen voor meer informatie.
Er zijn twee typen handtekeningen:
- Handtekeningen op basis van kolommen werken op tabelgegevens. Voor modellen met dit type handtekening levert
pandas.DataFrame
MLflow objecten als invoer. - Handtekeningen op basis van Tensor werken met n-dimensionale matrices of tensors. Voor modellen met deze handtekening levert
numpy.ndarray
MLflow als invoer of een woordenlijst vannumpy.ndarray
benoemde tensors.
In het volgende voorbeeld ziet u de signature
sectie voor een computer vision-model dat is getraind met fastai
. Dit model ontvangt een batch afbeeldingen die worden weergegeven als tensors van vorm (300, 300, 3)
met hun RGB-weergave als niet-ondertekende gehele getallen. Het model voert batches voorspellingen uit als waarschijnlijkheden voor twee klassen.
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
Tip
Azure Machine Learning genereert een swagger-bestand voor een implementatie van een MLflow-model met een beschikbare handtekening. Met dit bestand kunt u eenvoudiger implementaties testen met behulp van Azure Machine Learning-studio.
Modelomgeving
Vereisten voor het model dat moet worden uitgevoerd, worden opgegeven in het conda.yaml-bestand . MLflow kan automatisch afhankelijkheden detecteren of u kunt deze handmatig aangeven door de methode aan te mlflow.<flavor>.log_model()
roepen. Het aanroepen van de methode kan handig zijn als de bibliotheken die MLflow in uw omgeving bevat, niet de bibliotheken zijn die u wilt gebruiken.
In het volgende conda.yaml-voorbeeld ziet u een omgeving voor een model dat is gemaakt met het fastai
framework:
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- astunparse==1.6.3
- cffi==1.15.0
- configparser==3.7.4
- defusedxml==0.7.1
- fastai==2.4.1
- google-api-core==2.7.1
- ipython==8.2.0
- psutil==5.9.0
name: mlflow-env
Notitie
Een MLflow-omgeving werkt op het niveau van het model, maar een Azure Machine Learning-omgeving werkt op werkruimteniveau voor geregistreerde omgevingen of het niveau van taken/implementaties voor anonieme omgevingen. Wanneer u MLflow-modellen implementeert, bouwt Azure Machine Learning de modelomgeving en gebruikt deze voor implementatie. U kunt de Azure Machine Learning CLI gebruiken om dit gedrag te overschrijven en MLflow-modellen te implementeren in een specifieke Azure Machine Learning-omgeving.
Functie voorspellen
Alle MLflow-modellen bevatten een predict
functie, die wordt aangeroepen wanneer het model wordt geïmplementeerd met behulp van een implementatie zonder code. Wat de predict
functie retourneert, bijvoorbeeld klassen, waarschijnlijkheden of een prognose, is afhankelijk van het framework of de smaak die wordt gebruikt voor training. In de documentatie van elke smaak wordt beschreven wat deze retourneert.
U kunt de predict
functie aanpassen om de manier waarop deductie wordt uitgevoerd te wijzigen. U kunt logboekmodellen met een ander gedrag registreren of een aangepaste modelsmaak registreren.
Werkstromen voor het laden van MLflow-modellen
U kunt MLflow-modellen laden vanaf de volgende locaties:
- Rechtstreeks vanaf de uitvoering waar de modellen zijn geregistreerd
- Vanuit het bestandssysteem waarin de modellen worden opgeslagen
- Vanuit het modelregister waarin de modellen zijn geregistreerd
MLflow biedt een consistente manier om deze modellen te laden, ongeacht de locatie.
Er zijn twee werkstromen voor het laden van modellen:
Laad hetzelfde object en de typen die zijn vastgelegd. U kunt modellen laden met behulp van de MLflow SDK en een exemplaar van het model verkrijgen met typen die behoren tot de trainingsbibliotheek. Een ONNX-model (Open Neural Network Exchange) retourneert bijvoorbeeld een
ModelProto
, terwijl een beslissingsstructuurmodel dat is getraind metscikit-learn
eenDecisionTreeClassifier
object retourneert. Gebruikmlflow.<flavor>.load_model()
dit om hetzelfde modelobject en dezelfde typen te laden die zijn vastgelegd.Laad een model terug voor het uitvoeren van deductie. U kunt modellen laden met behulp van de MLflow SDK en een wrapper ophalen die een gegarandeerde
predict
functie heeft. Het maakt niet uit welke smaak u gebruikt, omdat elk MLflow-model eenpredict
functie heeft.MLflow garandeert dat u deze functie kunt aanroepen met behulp van argumenten van het type
pandas.DataFrame
,numpy.ndarray
ofdict[string, numpyndarray]
, afhankelijk van de modelhandtekening. MLflow verwerkt de typeconversie naar het invoertype dat het model verwacht. Gebruikmlflow.pyfunc.load_model()
deze functie om een model weer te laden voor het uitvoeren van deductie.