Delen via


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.

Een schermopname van assets van een MLflow-voorbeeldmodel, inclusief het MLmodel-bestand.

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 van numpy.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 met scikit-learn een DecisionTreeClassifier object retourneert. Gebruik mlflow.<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 een predict functie heeft.

    MLflow garandeert dat u deze functie kunt aanroepen met behulp van argumenten van het type pandas.DataFrame, numpy.ndarrayof dict[string, numpyndarray], afhankelijk van de modelhandtekening. MLflow verwerkt de typeconversie naar het invoertype dat het model verwacht. Gebruik mlflow.pyfunc.load_model() deze functie om een model weer te laden voor het uitvoeren van deductie.