Richtlijnen voor het implementeren van MLflow-modellen

VAN TOEPASSING OP:Azure CLI ml-extensie v2 (huidige)

In dit artikel vindt u meer informatie over de implementatie van MLflow-modellen in Azure Machine Learning voor zowel realtime als batchdeductie. Meer informatie over de verschillende hulpprogramma's die u kunt gebruiken om de implementatie te beheren.

Implementatie van MLflow-modellen versus aangepaste modellen

In tegenstelling tot aangepaste modelimplementatie in Azure Machine Learning hoeft u bij het implementeren van MLflow-modellen in Azure Machine Learning geen scorescript of een omgeving voor implementatie op te geven. In plaats daarvan genereert Azure Machine Learning automatisch het scorescript en de omgeving voor u. Deze functionaliteit wordt implementatie zonder code genoemd.

Voor implementatie zonder code, Azure Machine Learning:

  • Zorgt ervoor dat aan alle pakketafhankelijkheden in het MLflow-model wordt voldaan.
  • Biedt een MLflow-basisinstallatiekopieën of een gecureerde omgeving die de volgende items bevat:
    • Pakketten die vereist zijn voor Azure Machine Learning om deductie uit te voeren, waaronder mlflow-skinny.
    • Een scorescript om deductie uit te voeren.

Tip

Werkruimten zonder openbare netwerktoegang: Voordat u MLflow-modellen kunt implementeren naar online-eindpunten zonder uitgaande connectiviteit, moet u de modellen verpakken (preview).< Door modelverpakkingen te gebruiken, kunt u voorkomen dat er een internetverbinding nodig is, waarvoor azure Machine Learning anders de benodigde Python-pakketten voor de MLflow-modellen dynamisch moet installeren.

Python-pakketten en -afhankelijkheden

Azure Machine Learning genereert automatisch omgevingen om deductie uit te voeren op MLflow-modellen. Voor het bouwen van de omgevingen leest Azure Machine Learning de conda-afhankelijkheden die zijn opgegeven in het MLflow-model en voegt alle pakketten toe die nodig zijn om de deductieserver uit te voeren. Deze extra pakketten variëren, afhankelijk van uw implementatietype.

In het volgende conda.yaml-bestand ziet u een voorbeeld van conda-afhankelijkheden die zijn opgegeven in een MLflow-model.

conda.yaml

channels:
- conda-forge
dependencies:
- python=3.10.11
- pip<=23.1.2
- pip:
  - mlflow==2.7.1
  - cloudpickle==1.6.0
  - dataclasses==0.6
  - lz4==4.0.0
  - numpy==1.23.5
  - packaging==23.0
  - psutil==5.9.0
  - pyyaml==6.0
  - scikit-learn==1.1.2
  - scipy==1.10.1
  - uuid==1.30
name: mlflow-env

Waarschuwing

MLflow detecteert automatisch pakketten bij het vastleggen van een model en maakt de pakketversies vast in de conda-afhankelijkheden van het model. Deze automatische pakketdetectie weerspiegelt echter mogelijk niet altijd uw intenties of vereisten. In dergelijke gevallen kunt u overwegen om modellen te registreren met een aangepaste definitie van conda-afhankelijkheden.

Gevolgen van het gebruik van modellen met handtekeningen

MLflow-modellen kunnen een handtekening bevatten die de verwachte invoer en hun typen aangeeft. Wanneer dergelijke modellen worden geïmplementeerd op online- of batcheindpunten, dwingt Azure Machine Learning af dat het aantal en de typen gegevensinvoer voldoen aan de handtekening. Als de invoergegevens niet kunnen worden geparseerd zoals verwacht, mislukt het aanroepen van het model.

U kunt de handtekening van een MLflow-model inspecteren door het MLmodel-bestand te openen dat aan het model is gekoppeld. Zie Handtekeningen in MLflow voor meer informatie over hoe handtekeningen werken in MLflow.

In het volgende bestand ziet u het MLmodel-bestand dat is gekoppeld aan een MLflow-model.

MLmodel

artifact_path: model
flavors:
  python_function:
    env:
      conda: conda.yaml
      virtualenv: python_env.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    predict_fn: predict
    python_version: 3.10.11
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.1.2
mlflow_version: 2.7.1
model_uuid: 3f725f3264314c02808dd99d5e5b2781
run_id: 70f15bab-cf98-48f1-a2ea-9ad2108c28cd
signature:
  inputs: '[{"name": "age", "type": "double"}, {"name": "sex", "type": "double"},
    {"name": "bmi", "type": "double"}, {"name": "bp", "type": "double"}, {"name":
    "s1", "type": "double"}, {"name": "s2", "type": "double"}, {"name": "s3", "type":
    "double"}, {"name": "s4", "type": "double"}, {"name": "s5", "type": "double"},
    {"name": "s6", "type": "double"}]'
  outputs: '[{"type": "double"}]'

Tip

Handtekeningen in MLflow-modellen zijn optioneel, maar sterk aanbevolen, omdat ze een handige manier bieden om problemen met gegevenscompatibiliteit vroeg te detecteren. Zie Modellen vastleggen met een aangepaste handtekening, omgeving of voorbeelden voor meer informatie over het vastleggen van modellen met handtekeningen.

Modellen die zijn geïmplementeerd in Azure Machine Learning versus modellen die zijn geïmplementeerd op de ingebouwde MLflow-server

MLflow bevat ingebouwde implementatiehulpprogramma's die modelontwikkelaars kunnen gebruiken om modellen lokaal te testen. U kunt bijvoorbeeld een lokaal exemplaar uitvoeren van een model dat is geregistreerd in het register van de MLflow-server, met behulp mlflow models serve -m my_model van of met behulp van de MLflow CLI mlflow models predict.

Deductie met batch- versus online-eindpunten

Azure Machine Learning biedt ondersteuning voor het implementeren van modellen voor zowel online- als batcheindpunten. Deze eindpunten voeren verschillende deductietechnologieën uit die verschillende functies kunnen hebben.

Online-eindpunten zijn vergelijkbaar met de ingebouwde MLflow-server , omdat ze een schaalbare, synchrone en lichtgewicht manier bieden om modellen voor deductie uit te voeren.

Aan de andere kant kunnen batcheindpunten asynchrone deductie uitvoeren via langlopende deductieprocessen die kunnen worden geschaald naar grote hoeveelheden gegevens. De MLflow-server ontbreekt momenteel aan deze mogelijkheid, hoewel een vergelijkbare mogelijkheid kan worden bereikt met behulp van Spark-taken. Zie MLflow-modellen gebruiken in batchimplementaties voor meer informatie over batcheindpunten en MLflow-modellen.

De secties die volgen, richten zich meer op MLflow-modellen die zijn geïmplementeerd op online-eindpunten van Azure Machine Learning.

Invoerindelingen

Input type Ingebouwde MLflow-server Azure Machine Learning Online-eindpunten
Met JSON geserialiseerde Pandas DataFrames in de splitsstand
Met JSON geserialiseerde Pandas DataFrames in de afdrukstand records Afgeschaft
Csv-geserialiseerde pandas DataFrames Batch1 gebruiken
Tensor-invoerindeling als JSON-geserialiseerde lijsten (tensors) en woordenlijst van lijsten (benoemde tensors)
Tensor-invoer die is opgemaakt als in de API van TF Serving

1 Overweeg batchdeductie te gebruiken om bestanden te verwerken. Zie MLflow-modellen implementeren voor batch-eindpunten voor meer informatie.

Invoerstructuur

Ongeacht het invoertype dat wordt gebruikt, moet u in Azure Machine Learning invoer opgeven in een JSON-nettolading, binnen de woordenlijstsleutel input_data. Omdat deze sleutel niet vereist is wanneer u de opdracht mlflow models serve gebruikt om modellen te bedienen, kunnen nettoladingen niet door elkaar worden gebruikt voor online-eindpunten van Azure Machine Learning en de ingebouwde MLflow-server.

Belangrijk

MLflow 2.0 advies: U ziet dat de structuur van de nettolading is gewijzigd in MLflow 2.0.

In deze sectie ziet u verschillende voorbeelden van nettoladingen en de verschillen voor een model dat is geïmplementeerd in de ingebouwde MLflow-server en de Azure Machine Learning-deductieserver.

Voorbeeld van nettolading voor een met JSON geserialiseerd Pandas DataFrame in de splitsstand

{
    "input_data": {
        "columns": [
            "age", "sex", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal"
        ],
        "index": [1],
        "data": [
            [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
        ]
    }
}

Voorbeeld van nettolading voor een tensor-invoer

{
    "input_data": [
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
    ]
}

Voorbeeld van nettolading voor een benoemde-tensor-invoer

{
    "input_data": {
        "tokens": [
          [0, 655, 85, 5, 23, 84, 23, 52, 856, 5, 23, 1]
        ],
        "mask": [
          [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
        ]
    }
}

Zie Ingebouwde implementatiehulpprogramma's in de MLflow-documentatie voor meer informatie over ingebouwde MLflow-implementatiehulpprogramma's .

Deductie aanpassen bij het implementeren van MLflow-modellen

U kunt worden gebruikt voor het ontwerpen van scorescripts om aan te passen hoe deductie wordt uitgevoerd voor uw aangepaste modellen. Bij het implementeren van MLflow-modellen in Azure Machine Learning wordt de beslissing over hoe deductie moet worden uitgevoerd echter uitgevoerd door de modelbouwer (de persoon die het model heeft gebouwd), in plaats van door de DevOps-engineer (de persoon die het probeert te implementeren). Elk modelframework kan automatisch specifieke deductieroutines toepassen.

Als u op elk moment wilt wijzigen hoe deductie van een MLflow-model wordt uitgevoerd, kunt u een van de volgende twee dingen doen:

  • Wijzig hoe uw model wordt geregistreerd in de trainingsroutine.
  • Deductie aanpassen met een scorescript tijdens de implementatie.

Wijzigen hoe uw model wordt geregistreerd tijdens de training

Wanneer u een model aanmeldt, met behulp van mlflow.autolog een of mlflow.<flavor>.log_model, bepaalt de smaak die wordt gebruikt voor het model hoe deductie moet worden uitgevoerd en welke resultaten het model retourneert. MLflow dwingt geen specifiek gedrag af voor de manier waarop de predict() functie resultaten genereert.

In sommige gevallen wilt u echter mogelijk een voorverwerking of naverwerking uitvoeren voor en nadat uw model is uitgevoerd. Op andere momenten wilt u mogelijk wijzigen wat er wordt geretourneerd (bijvoorbeeld waarschijnlijkheden versus klassen). Een oplossing is het implementeren van machine learning-pijplijnen die rechtstreeks van invoer naar uitvoer worden verplaatst. sklearn.pipeline.Pipeline Of pyspark.ml.Pipeline zijn populaire manieren om pijplijnen te implementeren en worden soms aanbevolen voor prestatieoverwegingen. Een ander alternatief is om aan te passen hoe uw model deductie doet, met behulp van een aangepaste modelsmaak.

Deductie aanpassen met een scorescript

Hoewel MLflow-modellen geen scorescript vereisen, kunt u er zo nodig nog steeds een opgeven. U kunt het scorescript gebruiken om aan te passen hoe deductie wordt uitgevoerd voor MLflow-modellen. Zie MLflow-modelimplementaties (online-eindpunten) aanpassen en MLflow-modelimplementaties (batcheindpunten) aanpassen voor meer informatie over het aanpassen van deductie.

Belangrijk

Als u ervoor kiest om een scorescript op te geven voor een implementatie van een MLflow-model, moet u ook een omgeving voor de implementatie opgeven.

Implementatiehulpmiddelen

Azure Machine Learning biedt veel manieren om MLflow-modellen te implementeren op online- en batcheindpunten. U kunt modellen implementeren met behulp van de volgende hulpprogramma's:

  • MLflow SDK
  • Azure Machine Learning CLI
  • Azure Machine Learning-SDK voor Python
  • Azure Machine Learning Studio

Elke werkstroom heeft verschillende mogelijkheden, met name om welk type rekenproces ze zich kunnen richten. In de volgende tabel ziet u de verschillende mogelijkheden.

Scenario MLflow SDK Azure Machine Learning CLI/SDK Azure Machine Learning Studio
Implementeren naar beheerde online-eindpunten Zie voorbeeld1 Zie voorbeeld1 Zie voorbeeld1
Implementeren naar beheerde online-eindpunten (met een scorescript) Niet ondersteund3 Zie het voorbeeld Zie het voorbeeld
Implementeren naar batch-eindpunten Niet ondersteund3 Zie het voorbeeld Zie het voorbeeld
Implementeren naar batch-eindpunten (met een scorescript) Niet ondersteund3 Zie het voorbeeld Zie het voorbeeld
Implementeren in webservices (ACI/AKS) Verouderde ondersteuning2 Niet ondersteund2 Niet ondersteund2
Implementeren in webservices (ACI/AKS - met een scorescript) Niet ondersteund3 Verouderde ondersteuning2 Verouderde ondersteuning2

1 Implementatie naar online-eindpunten die zich in werkruimten bevinden waarvoor Private Link is ingeschakeld, vereist dat u modellen vóór implementatie (preview) verpakt.

2 U wordt aangeraden over te schakelen naar beheerde online-eindpunten .

3 MLflow (OSS) heeft niet het concept van een scorescript en biedt momenteel geen ondersteuning voor batchuitvoering.

Welk implementatieprogramma moet worden gebruikt?

  • Gebruik de MLflow SDK als beide voorwaarden van toepassing zijn:

    • U bent bekend met MLflow of u gebruikt een platform dat systeemeigen MLflow ondersteunt (zoals Azure Databricks).
    • U wilt dezelfde set methoden van MLflow blijven gebruiken.
  • Gebruik de Azure Machine Learning CLI v2 als een van deze voorwaarden van toepassing is:

    • U bent vertrouwd met de Azure Machine Learning CLI v2.
    • U wilt implementaties automatiseren met behulp van automatiseringspijplijnen.
    • U wilt de implementatieconfiguratie in een Git-opslagplaats behouden.
  • Gebruik de Azure Machine Learning-studio UI-implementatie als u snel modellen wilt implementeren en testen die zijn getraind met MLflow.