Distribuera maskininlärningsmodeller till Azure
Lär dig hur du distribuerar din maskininlärnings- eller djupinlärningsmodell som en webbtjänst i Azure-molnet.
Anteckning
Azure Machine Learning Slutpunkter (förhandsversion) ger en förbättrad och enklare distributionsupplevelse. Slutpunkter stöder både scenarier för realtids- och batchslutsatsledning. Slutpunkter tillhandahåller ett enhetligt gränssnitt för att anropa och hantera modelldistributioner mellan beräkningstyper. Se Vad är Azure Machine Learning slutpunkter (förhandsversion)?.
Arbetsflöde för att distribuera en modell
Arbetsflödet är ungefär likadant var du än distribuerar din modell:
- Registrera modellen.
- Förbered ett startskript.
- Förbered en inferenskonfiguration.
- Distribuera modellen lokalt för att se till att allt fungerar.
- Välj ett beräkningsmål.
- Distribuera modellen till molnet.
- Testa den resulterande webbtjänsten.
Mer information om de begrepp som ingår i arbetsflödet för distribution av maskininlärning finns i Hantera,distribuera och övervaka modeller med Azure Machine Learning .
Förutsättningar
Viktigt
Azure CLI-kommandona i den här artikeln kräver tillägget , azure-cli-ml eller v1, för Azure Machine Learning. Förbättrad v2 CLI (förhandsversion) med tillägget ml är nu tillgänglig och rekommenderas. Tilläggen är inkompatibla, så v2 CLI-kommandon fungerar inte för stegen i den här artikeln. Maskininlärningsarbetsytor och alla underliggande resurser kan dock interageras med från båda, vilket innebär att en användare kan skapa en arbetsyta med v1 CLI och en annan kan skicka jobb till samma arbetsyta med v2 CLI.
Om du vill ta reda på vilka tillägg som du har installerat använder du az extension list . Om listan över tillägg innehåller azure-cli-ml har du rätt tillägg för stegen i den här artikeln.
Mer information om hur du installerar och använder de olika tilläggen finns i följande artiklar:
azure-cli-ml- Installera, konfigurera och använda CLI (v1)ml- Installera och konfigurera CLI (v2)
- En Azure Machine Learning-arbetsyta. Mer information finns i Skapa en Azure Machine Learning arbetsyta.
- En modell. Exemplen i den här artikeln använder en förtränad modell.
- En dator som kan köra Docker, till exempel en beräkningsinstans.
Anslut till arbetsytan
Om du vill se de arbetsytor som du har åtkomst till använder du följande kommandon:
az login
az account set -s <subscription>
az ml workspace list --resource-group=<resource-group>
Registrera modellen
En typisk situation för en distribuerad maskininlärningstjänst är att du behöver följande komponenter:
- Resurser som representerar den specifika modell som du vill distribuera (till exempel en pytorch-modellfil).
- Kod som du kommer att köra i tjänsten, som kör modellen på en viss indata.
Med Azure Machine Learnings kan du dela upp distributionen i två separata komponenter, så att du kan behålla samma kod, men bara uppdatera modellen. Vi definierar den mekanism genom vilken du överför en modell separat från din kod som "registrerar modellen".
När du registrerar en modell laddar vi upp modellen till molnet (i arbetsytans standardlagringskonto) och monterar den sedan på samma beräkning där webbtjänsten körs.
Följande exempel visar hur du registrerar en modell.
Viktigt
Du bör endast använda modeller som du skapar eller hämtar från en betrodd källa. Du bör behandla serialiserade modeller som kod, eftersom säkerhetsproblem har upptäckts i ett antal populära format. Dessutom kan modeller avsiktligt tränas med skadlig avsikt för att tillhandahålla partisk eller felaktig utdata.
Följande kommandon laddar ned en modell och registrerar den sedan med din Azure Machine Learning arbetsyta:
wget https://aka.ms/bidaf-9-model -O model.onnx --show-progress
az ml model register -n bidaf_onnx \
-p ./model.onnx \
-g <resource-group> \
-w <workspace-name>
Ange -p till sökvägen till en mapp eller en fil som du vill registrera.
Mer information om az ml model register finns i referensdokumentationen.
Registrera en modell från en Azure ML-träningskörning
Om du behöver registrera en modell som har skapats tidigare via ett Azure Machine Learning träningsjobb kan du ange experimentet, körningen och sökvägen till modellen:
az ml model register -n bidaf_onnx --asset-path outputs/model.onnx --experiment-name myexperiment --run-id myrunid --tag area=qna
Parametern --asset-path refererar till modellens molnplats. I det här exemplet används sökvägen till en enskild fil. Om du vill inkludera flera filer i modellregistreringen anger --asset-path du sökvägen till en mapp som innehåller filerna.
Mer information om az ml model register finns i referensdokumentationen.
Definiera ett dummyinmatningsskript
Startskriptet tar emot data som skickas till en distribuerad webbtjänst och skickar dem vidare till modellen. Den returnerar sedan modellens svar till klienten. Skriptet är specifikt för din modell. Startskriptet måste förstå de data som modellen förväntar sig och returnerar.
De två saker du behöver göra i startskriptet är:
- Läsa in din modell (med hjälp av en funktion som heter
init()) - Köra din modell på indata (med hjälp av en funktion som heter
run())
Använd ett dummyinmatningsskript för den första distributionen som skriver ut de data som den tar emot.
import json
def init():
print("This is init")
def run(data):
test = json.loads(data)
print(f"received data {test}")
return f"test is {test}"
Spara filen som echo_score.py i en katalog med namnet source_dir . Det här dummyskriptet returnerar de data som du skickar till den, så att den inte använder modellen. Men det är användbart för att testa att bedömningsskriptet körs.
Definiera en inferenskonfiguration
En inferenskonfiguration beskriver dockercontainern och filerna som ska användas vid initiering av webbtjänsten. Alla filer i källkatalogen, inklusive underkataloger, komprimeras och laddas upp till molnet när du distribuerar webbtjänsten.
Inferenskonfigurationen nedan anger att machine learning-distributionen använder filen i katalogen för att bearbeta inkommande begäranden och att den använder Docker-avbildningen med de Python-paket som anges i echo_score.py ./source_dir project_environment miljön.
Du kan använda valfri Azure Machine Learning härledningsmiljöer som grundläggande Docker-avbildning när du skapar projektmiljön. Vi installerar de nödvändiga beroendena ovanpå och lagrar den resulterande Docker-avbildningen på den lagringsplats som är associerad med din arbetsyta.
Anteckning
Uppladdning av källkatalogen för Azure Machine Learning-inferensen respekterar inte .gitignore eller .amlignore
En minimal inferenskonfiguration kan skrivas som:
{
"entryScript": "echo_score.py",
"sourceDirectory": "./source_dir",
"environment": {
"docker": {
"arguments": [],
"baseDockerfile": null,
"baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
"enabled": false,
"sharedVolumes": true,
"shmSize": null
},
"environmentVariables": {
"EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
},
"name": "my-deploy-env",
"python": {
"baseCondaEnvironment": null,
"condaDependencies": {
"channels": [],
"dependencies": [
"python=3.6.2",
{
"pip": [
"azureml-defaults"
]
}
],
"name": "project_environment"
},
"condaDependenciesFile": null,
"interpreterPath": "python",
"userManagedDependencies": false
},
"version": "1"
}
}
Spara den här filen med namnet dummyinferenceconfig.json .
I den här artikeln finns en mer ingående diskussion om inferenskonfigurationer.
Definiera en distributionskonfiguration
En distributionskonfiguration anger mängden minne och kärnor som webbtjänsten behöver för att köras. Den innehåller också konfigurationsinformation för den underliggande webbtjänsten. Med en distributionskonfiguration kan du till exempel ange att tjänsten behöver 2 gigabyte minne, 2 CPU-kärnor, 1 GPU-kärna och att du vill aktivera automatisk skalning.
Vilka alternativ som är tillgängliga för en distributionskonfiguration varierar beroende på vilket beräkningsmål du väljer. I en lokal distribution kan du bara ange vilken port webbtjänsten ska betjänas på.
Posterna i dokumentet deploymentconfig.json mappar till parametrarna för LocalWebservice.deploy_configuration. I följande tabell beskrivs mappningen mellan entiteterna i JSON-dokumentet och parametrarna för metoden :
| JSON-entitet | Metodparameter | Beskrivning |
|---|---|---|
computeType |
NA | Beräkningsmålet. För lokala mål måste värdet vara local . |
port |
port |
Den lokala porten som tjänstens HTTP-slutpunkt ska exponeras på. |
Det här JSON är ett exempel på en distributionskonfiguration som kan användas med CLI:
{
"computeType": "local",
"port": 32267
}
Spara denna JSON som en fil med namnet deploymentconfig.json .
Mer information finns i distributionsschemat.
Distribuera din maskininlärningsmodell
Nu är du redo att distribuera din modell.
Ersätt bidaf_onnx:1 med namnet på din modell och dess versionsnummer.
az ml model deploy -n myservice \
-m bidaf_onnx:1 \
--overwrite \
--ic dummyinferenceconfig.json \
--dc deploymentconfig.json \
-g <resource-group> \
-w <workspace-name>
Anropa din modell
Nu ska vi kontrollera att ekomodellen har distribuerats. Du bör kunna göra en enkel liveness-begäran samt en bedömningsbegäran:
curl -v http://localhost:32267
curl -v -X POST -H "content-type:application/json" \
-d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
http://localhost:32267/score
Definiera ett startskript
Nu är det dags att faktiskt läsa in din modell. Ändra först inmatningsskriptet:
import json
import numpy as np
import os
import onnxruntime
from nltk import word_tokenize
import nltk
def init():
nltk.download("punkt")
global sess
sess = onnxruntime.InferenceSession(
os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model.onnx")
)
def run(request):
print(request)
text = json.loads(request)
qw, qc = preprocess(text["query"])
cw, cc = preprocess(text["context"])
# Run inference
test = sess.run(
None,
{"query_word": qw, "query_char": qc, "context_word": cw, "context_char": cc},
)
start = np.asscalar(test[0])
end = np.asscalar(test[1])
ans = [w for w in cw[start : end + 1].reshape(-1)]
print(ans)
return ans
def preprocess(word):
tokens = word_tokenize(word)
# split into lower-case word tokens, in numpy array with shape of (seq, 1)
words = np.asarray([w.lower() for w in tokens]).reshape(-1, 1)
# split words into chars, in numpy array with shape of (seq, 1, 1, 16)
chars = [[c for c in t][:16] for t in tokens]
chars = [cs + [""] * (16 - len(cs)) for cs in chars]
chars = np.asarray(chars).reshape(-1, 1, 1, 16)
return words, chars
Spara den här filen score.py som inuti source_dir .
Observera användningen av AZUREML_MODEL_DIR miljövariabeln för att hitta din registrerade modell. Nu när du har lagt till några pip-paket.
{
"entryScript": "score.py",
"sourceDirectory": "./source_dir",
"environment": {
"docker": {
"arguments": [],
"baseDockerfile": null,
"baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
"enabled": false,
"sharedVolumes": true,
"shmSize": null
},
"environmentVariables": {
"EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
},
"name": "my-deploy-env",
"python": {
"baseCondaEnvironment": null,
"condaDependencies": {
"channels": [],
"dependencies": [
"python=3.6.2",
{
"pip": [
"azureml-defaults",
"nltk",
"numpy",
"onnxruntime"
]
}
],
"name": "project_environment"
},
"condaDependenciesFile": null,
"interpreterPath": "python",
"userManagedDependencies": false
},
"version": "2"
}
}
Spara filen som inferenceconfig.json
Distribuera igen och anropa din tjänst
Distribuera tjänsten igen:
Ersätt bidaf_onnx:1 med namnet på din modell och dess versionsnummer.
az ml model deploy -n myservice \
-m bidaf_onnx:1 \
--overwrite \
--ic inferenceconfig.json \
--dc deploymentconfig.json \
-g <resource-group> \
-w <workspace-name>
Kontrollera sedan att du kan skicka en postbegäran till tjänsten:
curl -v -X POST -H "content-type:application/json" \
-d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
http://localhost:32267/score
Välj ett beräkningsmål
Beräkningsmålet som du använder som värd för din modell påverkar kostnaden och tillgängligheten för den distribuerade slutpunkten. Använd den här tabellen för att välja ett lämpligt beräkningsmål.
| Beräkningsmål | Används för | GPU-stöd | FPGA-stöd | Description |
|---|---|---|---|---|
| Lokal webbtjänst | Testa/felsöka | Används för begränsad testning och felsökning. Maskinvaruacceleration beror på användningen av bibliotek i det lokala systemet. | ||
| Azure Kubernetes Service (AKS) | Inferens i realtid Rekommenderas för produktionsarbetsbelastningar. |
Ja (webbtjänstdistribution) | Ja | Används för storskaliga produktionsdistributioner. Ger snabb svarstid och automatisk skalning av den distribuerade tjänsten. Automatisk skalning av kluster stöds inte via Azure Machine Learning SDK. Om du vill ändra noderna i AKS-klustret använder du användargränssnittet för ditt AKS-kluster i Azure Portal. Stöds i designern. |
| Azure Container Instances | Inferens i realtid Rekommenderas endast för utveckling/testning. |
Används för lågskaliga CPU-baserade arbetsbelastningar som kräver mindre än 48 GB RAM-minne. Kräver inte att du hanterar ett kluster. Stöds i designern. |
||
| Azure Machine Learning-beräkningskluster | Batch-inferens | Ja (maskininlärningspipeline) | Kör batchbedömning på serverlös beräkning. Stöder normala och lågprioriterade virtuella datorer. Inget stöd för slutsatsledning i realtid. | |
| Azure Arc-aktiverade Kubernetes | Inferens i realtid Batch-inferens |
Yes | Ej tillämpligt | Köra inferensarbetsbelastningar på lokala Kubernetes-, moln- och gränskluster som hanteras i Azure Arc |
Anteckning
Även om beräkningsmål som lokala och Azure Machine Learning-beräkningskluster stöder GPU för träning och experimentering, stöds användning av GPU för slutsatsledning när de distribueras som en webbtjänst endast på AKS.
Användning av en GPU för slutsatsledning vid bedömning med en maskininlärningspipeline stöds endast Azure Machine Learning beräkning.
När du väljer en kluster-SKU skalar du först upp och sedan skalar ut. Börja med en dator som har 150 % av det RAM-minne som din modell kräver, profilera resultatet och hitta en dator som har den prestanda du behöver. När du har lärt dig det kan du öka antalet datorer så att de passar dina behov av samtidig inferens.
Anteckning
- Containerinstanser är bara lämpliga för små modeller som är mindre än 1 GB.
- Använd AKS-kluster med en nod för utveckling/testning av större modeller.
Distribuera till molnet
När du har bekräftat att tjänsten fungerar lokalt och valt ett fjärrbearbetningsmål är du redo att distribuera till molnet.
Ändra din distributionskonfiguration så att den motsvarar det beräkningsmål som du har valt, i det här Azure Container Instances:
Vilka alternativ som är tillgängliga för en distributionskonfiguration varierar beroende på vilket beräkningsmål du väljer.
{
"computeType": "aci",
"containerResourceRequirements":
{
"cpu": 0.5,
"memoryInGB": 1.0
},
"authEnabled": true,
"sslEnabled": false,
"appInsightsEnabled": false
}
Spara filen som re-deploymentconfig.json .
Mer information finns i den här referensen.
Distribuera tjänsten igen:
Ersätt bidaf_onnx:1 med namnet på din modell och dess versionsnummer.
az ml model deploy -n myservice \
-m bidaf_onnx:1 \
--overwrite \
--ic inferenceconfig.json \
--dc re-deploymentconfig.json \
-g <resource-group> \
-w <workspace-name>
Om du vill visa tjänstloggarna använder du följande kommando:
az ml service get-logs -n myservice \
-g <resource-group> \
-w <workspace-name>
Anropa fjärrwebbtjänsten
När du distribuerar via en fjärrserver kan nyckelautentisering vara aktiverat. Exemplet nedan visar hur du hämtar din tjänstnyckel med Python för att göra en slutsatsledningsbegäran.
[! Notebook-python[] (~/azureml-examples-main/python-sdk/tutorials/deploy-local/1.deploy-local.ipynb?name=call-remote-web-service-code)]
[! Notebook-python[] (~/azureml-examples-main/python-sdk/tutorials/deploy-local/1.deploy-local.ipynb?name=call-remote-webservice-print-logs)]
Se artikeln om klientprogram för att använda webbtjänster för fler exempelklienter på andra språk.
Förstå tjänsttillstånd
Under modelldistributionen kan tjänsttillståndet ändras medan den distribueras helt.
I följande tabell beskrivs de olika tjänst tillstånden:
| Webbtjänsttillstånd | Description | Sluttillstånd? |
|---|---|---|
| Övergång | Tjänsten är under distribution. | No |
| Ohälsosamt | Tjänsten har distribuerats men kan för närvarande inte nås. | No |
| Oplanerade | Tjänsten kan inte distribueras just nu på grund av brist på resurser. | No |
| Misslyckad | Det gick inte att distribuera tjänsten på grund av ett fel eller en krasch. | Yes |
| Felfri | Tjänsten är felfri och slutpunkten är tillgänglig. | Yes |
Tips
Vid distributionen byggs Docker-avbildningar för beräkningsmål och läses in från Azure Container Registry (ACR). Som standard Azure Machine Learning en ACR som använder den grundläggande tjänstnivån. Om du ändrar ACR för din arbetsyta till standard- eller premiumnivån kan det minska den tid det tar att skapa och distribuera avbildningar till dina beräkningsmål. Mer information finns i Azure Container Registry tjänstnivåer.
Anteckning
Om du distribuerar en modell till Azure Kubernetes Service (AKS) rekommenderar vi att du aktiverar Azure Monitor för klustret. Detta hjälper dig att förstå övergripande klusterhälsa och resursanvändning. Följande resurser kan också vara användbara:
Om du försöker distribuera en modell till ett felaktigt eller överbelastat kluster förväntas det uppleva problem. Kontakta AKS-supporten om du behöver hjälp med att felsöka AKS-klusterproblem.
Ta bort resurser
[! Notebook-python[] (~/azureml-examples-main/python-sdk/tutorials/deploy-local/2.deploy-local-cli.ipynb?name=delete-resource-code)]
az ml service delete -n myservice
az ml service delete -n myaciservice
az ml model delete --model-id=<MODEL_ID>
Om du vill ta bort en distribuerad webbtjänst använder du az ml service delete <name of webservice> .
Om du vill ta bort en registrerad modell från din arbetsyta använder du az ml model delete <model id>
Läs mer om att ta bort en webbtjänst och ta bort en modell.
Nästa steg
- Felsöka en misslyckad distribution
- Uppdatera webbtjänst
- Distribution med ett klick för automatiserade ML körs i Azure Machine Learning Studio
- Använda TLS för att skydda en webbtjänst via Azure Machine Learning
- Övervaka dina Azure Machine Learning modeller med Application Insights
- Skapa händelseaviseringar och utlösare för modelldistributioner