Riktlinjer för att distribuera MLflow-modeller
GÄLLER FÖR:Azure CLI ml extension v2 (aktuell)
I den här artikeln får du lära dig mer om distribution av MLflow-modeller till Azure Machine Learning för både realtids- och batchinferens. Läs även om de olika verktyg som du kan använda för att hantera distributionen.
Distribution av MLflow-modeller jämfört med anpassade modeller
Till skillnad från distribution av anpassade modeller i Azure Machine Learning behöver du inte ange ett bedömningsskript eller en miljö för distribution när du distribuerar MLflow-modeller till Azure Machine Learning. I stället genererar Azure Machine Learning automatiskt bedömningsskriptet och miljön åt dig. Den här funktionen kallas för distribution utan kod.
För distribution utan kod, Azure Machine Learning:
- Säkerställer att alla paketberoenden som anges i MLflow-modellen är uppfyllda.
- Tillhandahåller en MLflow-basavbildning eller en kuraterad miljö som innehåller följande objekt:
- Paket som krävs för att Azure Machine Learning ska kunna utföra slutsatsdragning, inklusive
mlflow-skinny
. - Ett bedömningsskript för att utföra slutsatsdragning.
- Paket som krävs för att Azure Machine Learning ska kunna utföra slutsatsdragning, inklusive
Dricks
Arbetsytor utan åtkomst till offentligt nätverk: Innan du kan distribuera MLflow-modeller till onlineslutpunkter utan utgående anslutning måste du paketera modellerna (förhandsversion). Genom att använda modellpaketering kan du undvika behovet av en internetanslutning, som Azure Machine Learning annars skulle kräva för att dynamiskt installera nödvändiga Python-paket för MLflow-modellerna.
Python-paket och beroenden
Azure Machine Learning genererar automatiskt miljöer för att köra slutsatsdragning på MLflow-modeller. För att skapa miljöerna läser Azure Machine Learning de conda-beroenden som anges i MLflow-modellen och lägger till alla paket som krävs för att köra inferensservern. De här extra paketen varierar beroende på distributionstyp.
Följande conda.yaml-fil visar ett exempel på conda-beroenden som anges i en MLflow-modell.
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
Varning
MLflow identifierar automatiskt paket när du loggar en modell och fäster paketversionerna i modellens conda-beroenden. Den här automatiska paketidentifieringen kanske inte alltid återspeglar dina avsikter eller krav. I sådana fall bör du överväga att logga modeller med en anpassad definition av conda-beroenden.
Konsekvenser av att använda modeller med signaturer
MLflow-modeller kan innehålla en signatur som anger förväntade indata och deras typer. När sådana modeller distribueras till online- eller batchslutpunkter framtvingar Azure Machine Learning att antalet och typerna av dataindata överensstämmer med signaturen. Om indata inte kan parsas som förväntat misslyckas modellanropet.
Du kan inspektera en MLflow-modells signatur genom att öppna MLmodel-filen som är associerad med modellen. Mer information om hur signaturer fungerar i MLflow finns i Signaturer i MLflow.
Följande fil visar MLmodel-filen som är associerad med en MLflow-modell.
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"}]'
Dricks
Signaturer i MLflow-modeller är valfria men rekommenderas starkt eftersom de ger ett bekvämt sätt att upptäcka problem med datakompatibilitet tidigt. Mer information om hur du loggar modeller med signaturer finns i Loggningsmodeller med en anpassad signatur, miljö eller exempel.
Modeller som distribueras i Azure Machine Learning jämfört med modeller som distribuerats på den inbyggda MLflow-servern
MLflow innehåller inbyggda distributionsverktyg som modellutvecklare kan använda för att testa modeller lokalt. Du kan till exempel köra en lokal instans av en modell som är registrerad i MLflow-serverregistret med hjälp av mlflow models serve -m my_model
eller med hjälp av MLflow CLI mlflow models predict
.
Slutsatsdragning med batch- och onlineslutpunkter
Azure Machine Learning stöder distribution av modeller till både online- och batchslutpunkter. Dessa slutpunkter kör olika slutsatsdragningstekniker som kan ha olika funktioner.
Onlineslutpunkter liknar den inbyggda MLflow-servern eftersom de ger ett skalbart, synkront och enkelt sätt att köra modeller för slutsatsdragning.
Å andra sidan kan batchslutpunkter köra asynkron slutsatsdragning över långvariga inferensprocesser som kan skalas till stora mängder data. MLflow-servern saknar för närvarande den här funktionen, även om en liknande funktion kan uppnås med hjälp av Spark-jobb. Mer information om batchslutpunkter och MLflow-modeller finns i Använda MLflow-modeller i batchdistributioner.
Avsnitten som följer fokuserar mer på MLflow-modeller som distribuerats till Azure Machine Learning-slutpunkter online.
Indataformat
Input type | Inbyggd MLflow-server | Azure Machine Learning Online-slutpunkter |
---|---|---|
JSON-serialiserade Pandas DataFrames i delad orientering | ✓ | ✓ |
JSON-serialiserade Pandas DataFrames i postorienteringen | Inaktuell | |
CSV-serialiserade Pandas DataFrames | ✓ | Använda batch1 |
Tensor-indataformat som JSON-serialiserade listor (tensorer) och ordlista med listor (med namnet tensorer) | ✓ | ✓ |
Tensor-indata formaterade som i TF Servings API | ✓ |
1 Överväg att använda batch-slutsatsdragning för att bearbeta filer. Mer information finns i Distribuera MLflow-modeller till batchslutpunkter.
Indatastruktur
Oavsett vilken indatatyp som används kräver Azure Machine Learning att du anger indata i en JSON-nyttolast i ordlistenyckeln input_data
. Eftersom den här nyckeln inte krävs när du använder kommandot mlflow models serve
för att hantera modeller kan nyttolaster inte användas utbytbart för Azure Machine Learning-onlineslutpunkter och den inbyggda MLflow-servern.
Viktigt!
MLflow 2.0-rekommendation: Observera att nyttolastens struktur ändrades i MLflow 2.0.
Det här avsnittet visar olika nyttolastexempel och skillnaderna för en modell som distribueras i den inbyggda MLflow-servern jämfört med Azure Machine Learning-inferensservern.
Nyttolastexempel för en JSON-serialiserad Pandas DataFrame i delad orientering
{
"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]
]
}
}
Nyttolastexempel för en tensor-indata
{
"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]
]
}
Nyttolastexempel för en namngiven tensor-indata
{
"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]
]
}
}
Mer information om inbyggda MLflow-distributionsverktyg finns i Inbyggda distributionsverktyg i MLflow-dokumentationen.
Anpassa slutsatsdragning vid distribution av MLflow-modeller
Du kan vara van vid att redigera bedömningsskript för att anpassa hur inferens körs för dina anpassade modeller. När du distribuerar MLflow-modeller till Azure Machine Learning utförs dock beslutet om hur slutsatsdragning ska utföras av modellverktyget (den person som skapade modellen) i stället för av DevOps-teknikern (den person som försöker distribuera den). Varje modellramverk kan automatiskt tillämpa specifika slutsatsdragningsrutiner.
Om du behöver ändra hur slutsatsdragningen för en MLflow-modell ska köras kan du göra en av två saker:
- Ändra hur din modell loggas i träningsrutinen.
- Anpassa slutsatsdragning med ett bedömningsskript vid distributionstillfället.
Ändra hur din modell loggas under träningen
När du loggar en modell med antingen mlflow.autolog
eller mlflow.<flavor>.log_model
, avgör den smak som används för modellen hur slutsatsdragning ska köras och vilka resultat modellen returnerar. MLflow tillämpar inte något specifikt beteende för hur predict()
funktionen genererar resultat.
I vissa fall kanske du dock vill utföra viss förbearbetning eller efterbearbetning före och efter att din modell har körts. Vid andra tillfällen kanske du vill ändra vad som returneras (till exempel sannolikheter jämfört med klasser). En lösning är att implementera maskininlärningspipelines som flyttas från indata till utdata direkt. Till exempel, sklearn.pipeline.Pipeline
eller pyspark.ml.Pipeline
är populära sätt att implementera pipelines och rekommenderas ibland för prestandaöverväganden. Ett annat alternativ är att anpassa hur din modell gör slutsatsdragning med hjälp av en anpassad modellsmak.
Anpassa slutsatsdragning med ett bedömningsskript
Även om MLflow-modeller inte kräver ett bedömningsskript kan du fortfarande ange ett, om det behövs. Du kan använda bedömningsskriptet för att anpassa hur slutsatsdragning körs för MLflow-modeller. Mer information om hur du anpassar slutsatsdragning finns i Anpassa MLflow-modelldistributioner (onlineslutpunkter) och Anpassa MLflow-modelldistributioner (batchslutpunkter).
Viktigt!
Om du väljer att ange ett bedömningsskript för en MLflow-modelldistribution måste du även ange en miljö för distributionen.
Distributionsverktyg
Azure Machine Learning erbjuder många sätt att distribuera MLflow-modeller till online- och batchslutpunkter. Du kan distribuera modeller med hjälp av följande verktyg:
- MLflow SDK
- Azure Machine Learning CLI
- Azure Machine Learning-SDK för Python
- Azure Machine Learning Studio
Varje arbetsflöde har olika funktioner, särskilt kring vilken typ av beräkning de kan rikta in sig på. I följande tabell visas de olika funktionerna.
Scenario | MLflow SDK | Azure Machine Learning CLI/SDK | Azure Machine Learning Studio |
---|---|---|---|
Distribuera till hanterade onlineslutpunkter | Se exempel1 | Se exempel1 | Se exempel1 |
Distribuera till hanterade onlineslutpunkter (med ett bedömningsskript) | Stödsinte 3 | Se exempel | Se exempel |
Distribuera till batchslutpunkter | Stödsinte 3 | Se exempel | Se exempel |
Distribuera till batchslutpunkter (med ett bedömningsskript) | Stödsinte 3 | Se exempel | Se exempel |
Distribuera till webbtjänster (ACI/AKS) | Äldre stöd2 | Stödsinte 2 | Stödsinte 2 |
Distribuera till webbtjänster (ACI/AKS – med ett bedömningsskript) | Stödsinte 3 | Äldre stöd2 | Äldre stöd2 |
1 Distribution till onlineslutpunkter som finns på arbetsytor med privat länk aktiverad kräver att du paketera modeller före distributionen (förhandsversion).
2 Vi rekommenderar att du växlar till hanterade onlineslutpunkter i stället.
3 MLflow (OSS) har inte begreppet bedömningsskript och stöder för närvarande inte batchkörning.
Vilket distributionsverktyg ska användas?
Använd MLflow SDK om båda dessa villkor gäller:
- Du är bekant med MLflow, eller så använder du en plattform som stöder MLflow internt (till exempel Azure Databricks).
- Du vill fortsätta använda samma uppsättning metoder från MLflow.
Använd Azure Machine Learning CLI v2 om något av dessa villkor gäller:
- Du är mer bekant med Azure Machine Learning CLI v2.
- Du vill automatisera distributioner med hjälp av automatiseringspipelines.
- Du vill behålla distributionskonfigurationen på en git-lagringsplats.
Använd distributionen Azure Machine Learning-studio användargränssnittet om du snabbt vill distribuera och testa modeller som tränats med MLflow.