Uw machine learning implementeren in Azure
Meer informatie over het implementeren machine learning of deep learning-model als een webservice in de Azure-cloud.
Notitie
Azure Machine Learning Eindpunten (preview) bieden een verbeterde, eenvoudigere implementatie-ervaring. Eindpunten ondersteunen zowel realtime- als batchdeferentiescenario's. Eindpunten bieden een geïntegreerde interface voor het aanroepen en beheren van modelimplementaties voor verschillende rekentypen. Zie Wat zijn Azure Machine Learning eindpunten (preview)?.
Werkstroom voor het implementeren van een model
De werkstroom is vrijwel altijd hetzelfde, ongeacht waar u het model implementeert:
- Registreer het model.
- Een invoerscript voorbereiden.
- Bereid een deferentieconfiguratie voor.
- Implementeer het model lokaal om ervoor te zorgen dat alles werkt.
- Kies een rekendoel.
- Implementeer het model in de cloud.
- Test de resulterende webservice.
Zie Manage, deploy, and monitor models withAzure Machine Learning (Modellen beheren, implementeren en bewaken met Azure Machine Learning) voor meer informatie over de concepten machine learning implementatiewerkstroom.
Vereisten
Belangrijk
Voor de Azure CLI-opdrachten in dit artikel is de extensie , of azure-cli-ml v1, vereist voor Azure Machine Learning. De verbeterde v2 CLI (preview) met behulp van ml de extensie is nu beschikbaar en aanbevolen. De extensies zijn niet compatibel, dus v2 CLI-opdrachten werken niet voor de stappen in dit artikel. Met machine learning werkruimten en alle onderliggende resources kan echter vanuit beide worden geinteractiviteit, wat betekent dat de ene gebruiker een werkruimte kan maken met de v1 CLI en een andere gebruiker taken naar dezelfde werkruimte kan verzenden met de v2 CLI.
Als u wilt weten welke extensies u hebt geïnstalleerd, gebruikt az extension list u . Als de lijst met extensies azure-cli-ml bevat, hebt u de juiste extensie voor de stappen in dit artikel.
Zie de volgende artikelen voor meer informatie over het installeren en gebruiken van de verschillende extensies:
azure-cli-ml- De CLI (v1) installeren, instellen en gebruikenml- De CLI (v2) installeren en instellen
- Een Azure Machine Learning-werkruimte. Zie Create an Azure Machine Learning workspace (Een werkruimte Azure Machine Learning maken) voor meer informatie.
- Een model. In de voorbeelden in dit artikel wordt een vooraf getraind model gebruikt.
- Een machine die Docker kan uitvoeren, zoals een rekenin exemplaar.
Verbinding maken met uw werkruimte
Gebruik de volgende opdrachten om te zien tot welke werkruimten u toegang hebt:
az login
az account set -s <subscription>
az ml workspace list --resource-group=<resource-group>
Het model registreren
Een typische situatie voor een geïmplementeerde machine learning-service is dat u de volgende onderdelen nodig hebt:
- Resources die het specifieke model vertegenwoordigen dat u wilt geïmplementeerd (bijvoorbeeld een pytorch-modelbestand).
- Code die u gaat uitvoeren in de service, die het model uitvoert op een bepaalde invoer.
Met Azure Machine Learnings kunt u de implementatie scheiden in twee afzonderlijke onderdelen, zodat u dezelfde code kunt behouden, maar alleen het model kunt bijwerken. We definiëren het mechanisme waarmee u een model afzonderlijk van uw code uploadt als 'het model registreren'.
Wanneer u een model registreert, uploaden we het model naar de cloud (in het standaardopslagaccount van uw werkruimte) en vervolgens wordt het model aan dezelfde rekenkracht bevestigd als waar uw webservice wordt uitgevoerd.
In de volgende voorbeelden wordt gedemonstreerd hoe u een model registreert.
Belangrijk
Gebruik alleen modellen die u zelf maakt of van een vertrouwde bron verkrijgt. Behandel geserialiseerde modellen als code. Er zijn namelijk beveiligingslekken ontdekt in een aantal populaire indelingen. Het kan ook voorkomen dat modellen opzettelijk worden getraind met kwaadaardige bedoelingen om een vertekende of een onnauwkeurige uitvoer te genereren.
Met de volgende opdrachten wordt een model gedownload en vervolgens geregistreerd bij Azure Machine Learning werkruimte:
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>
Stel -p in op het pad van een map of een bestand dat u wilt registreren.
Zie de referentiedocumentatie az ml model register voor meer informatie over.
Een model registreren vanuit een Azure ML trainingsrun
Als u een model moet registreren dat eerder is gemaakt via een Azure Machine Learning-trainings job, kunt u het experiment, de uitvoering en het pad naar het model opgeven:
az ml model register -n bidaf_onnx --asset-path outputs/model.onnx --experiment-name myexperiment --run-id myrunid --tag area=qna
De --asset-path parameter verwijst naar de cloudlocatie van het model. In dit voorbeeld wordt het pad van één bestand gebruikt. Als u meerdere bestanden wilt opnemen in de modelregistratie, stelt u in op het pad van --asset-path een map die de bestanden bevat.
Zie de referentiedocumentatie az ml model register voor meer informatie over.
Een dummy-invoerscript definiëren
Het invoerscript ontvangt de gegevens die bij een geïmplementeerde webservice zijn ingediend en stuurt ze door naar het model. Vervolgens wordt het antwoord van het model naar de client terug gegeven. Het script is specifiek voor uw model. Het invoerscript moet de gegevens begrijpen die het model verwacht en retourneert.
De twee dingen die u moet doen in uw invoerscript zijn:
- Uw model laden (met behulp van een functie met de naam
init()) - Uw model uitvoeren op invoergegevens (met behulp van een functie met de naam
run())
Gebruik voor de eerste implementatie een dummy-invoerscript om de ontvangen gegevens weer te geven.
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}"
Sla dit bestand op als echo_score.py in een map met de naam source_dir . Dit dummyscript retourneert de gegevens die u naar het script verzendt, zodat het model niet wordt gebruikt. Maar het is handig om te testen of het scorescript wordt uitgevoerd.
Een deferentieconfiguratie definiëren
In een deferentieconfiguratie worden de Docker-container en -bestanden beschreven die moeten worden gebruikt bij het initialiseren van uw webservice. Alle bestanden in uw bronmap, inclusief subdirectory's, worden ingepakt en geüpload naar de cloud wanneer u uw webservice implementeert.
De onderstaande deferentieconfiguratie geeft aan dat de machine learning-implementatie het bestand in de map gebruikt voor het verwerken van binnenkomende aanvragen en dat deze de Docker-installatiemap gebruikt met de Python-pakketten die zijn opgegeven in de echo_score.py ./source_dir project_environment omgeving.
U kunt elke door Azure Machine Learning gecureerde omgevingen gebruiken als basis-Docker-afbeelding bij het maken van uw projectomgeving. We installeren de vereiste afhankelijkheden bovenaan en slaan de resulterende Docker-installatie afbeelding op in de opslagplaats die is gekoppeld aan uw werkruimte.
Notitie
Uploaden machine learning bronmap van Azure machine learning respecteert niet .gitignore of .amlignore
Een minimale deferentieconfiguratie kan worden geschreven als:
{
"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"
}
}
Sla dit bestand op met de naam dummyinferenceconfig.json .
Zie dit artikel voor een uitgebreidere bespreking van de deferentieconfiguraties.
Een implementatieconfiguratie definiëren
Een implementatieconfiguratie bepaalt de hoeveelheid geheugen en kernen die uw webservice nodig heeft om te kunnen worden uitgevoerd. Het bevat ook configuratiedetails van de onderliggende webservice. Met een implementatieconfiguratie kunt u bijvoorbeeld opgeven dat uw service 2 gigabyte aan geheugen, 2 CPU-kernen, 1 GPU-kern nodig heeft en dat u automatisch schalen wilt inschakelen.
De beschikbare opties voor een implementatieconfiguratie verschillen, afhankelijk van het rekendoel dat u kiest. In een lokale implementatie kunt u alleen opgeven op welke poort uw webservice wordt bediend.
De vermeldingen in de documenttoewijzing deploymentconfig.json voor de parameters voor LocalWebservice.deploy_configuration. In de volgende tabel wordt de toewijzing tussen de entiteiten in het JSON-document en de parameters beschreven voor de methode:
| JSON-entiteit | Methodeparameter | Beschrijving |
|---|---|---|
computeType |
NA | Het rekendoel. Voor lokale doelen moet de waarde local zijn. |
port |
port |
De lokale poort waarop het HTTP-eindpunt van de service beschikbaar wordt gemaakt. |
De volgende JSON is een voorbeeld van een implementatieconfiguratie die gebruikt kan worden met de CLI:
{
"computeType": "local",
"port": 32267
}
Sla deze JSON op als een bestand met de naam deploymentconfig.json .
Zie het implementatieschema voor meer informatie.
Uw machine learning implementeren
U bent nu klaar om uw model te implementeren.
Vervang bidaf_onnx:1 door de naam van uw model en het versienummer.
az ml model deploy -n myservice \
-m bidaf_onnx:1 \
--overwrite \
--ic dummyinferenceconfig.json \
--dc deploymentconfig.json \
-g <resource-group> \
-w <workspace-name>
Aanroepen in uw model
Laten we controleren of uw echomodel is geïmplementeerd. U moet een eenvoudige aanvraag voor de liveheid kunnen doen, evenals een scoring-aanvraag:
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
Een invoerscript definiëren
Nu is het tijd om uw model daadwerkelijk te laden. Wijzig eerst uw invoerscript:
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
Sla dit bestand op score.py als in source_dir .
Let op het gebruik van de AZUREML_MODEL_DIR omgevingsvariabele om uw geregistreerde model te vinden. Nu u een aantal PIP-pakketten hebt toegevoegd.
{
"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"
}
}
Sla dit bestand op als inferenceconfig.json
Opnieuw implementeren en uw service aanroepen
Implementeer uw service opnieuw:
Vervang bidaf_onnx:1 door de naam van uw model en het versienummer.
az ml model deploy -n myservice \
-m bidaf_onnx:1 \
--overwrite \
--ic inferenceconfig.json \
--dc deploymentconfig.json \
-g <resource-group> \
-w <workspace-name>
Zorg er vervolgens voor dat u een postaanvraag naar de service kunt verzenden:
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
Een rekendoel kiezen
Het rekendoel dat u gebruikt als host voor uw model, is van invloed op de kosten en beschikbaarheid van het geïmplementeerde eindpunt. Gebruik deze tabel om een geschikt rekendoel te kiezen.
| Rekendoel | Gebruikt voor | GPU-ondersteuning | FPGA-ondersteuning | Beschrijving |
|---|---|---|---|---|
| Lokale web service | Testen/fouten opsporen | Gebruiken voor testen en problemen oplossen. Hardwareversnelling is afhankelijk van het gebruik van bibliotheken in het lokale systeem. | ||
| Azure Kubernetes Service (AKS) | Realtime deductie Aanbevolen voor productieworkloads. |
Ja (webservice-implementatie) | Ja | Gebruiken voor grootschalige productie-implementaties. Biedt een snelle reactietijd en automatische schaalaanpassing van de geïmplementeerde service. Automatische schaalaanpassing van clusters wordt niet ondersteund via de Azure Machine Learning SDK. Als u de knooppunten in het AKS-cluster wilt wijzigen, gebruikt u de gebruikersinterface voor uw AKS-cluster in de Azure-portal. Ondersteund in de ontwerpfunctie. |
| Azure Container Instances | Realtime deductie Alleen aanbevolen voor dev/test-doeleinden. |
Gebruiken voor lage CPU-werkbelastingen waarvoor minder dan 48 GB RAM-geheugen nodig is. U hoeft geen cluster te beheren. Ondersteund in de ontwerpfunctie. |
||
| Azure Machine Learning-rekenclusters | Batch deductie | Ja (machine learning-pijplijn) | Batchscoreberekening uitvoeren op serverloze berekening. Ondersteunt VM's met normale en lage prioriteit. Er is geen ondersteuning voor realtime de deference. | |
| Kubernetes met Azure Arc | Realtime deductie Batchdeferentie |
Yes | N.v.t. | Deferencing-workloads uitvoeren op on-premises Kubernetes-clusters, cloud- en edge-clusters die worden beheerd in Azure Arc |
Notitie
Hoewel rekendoelen zoals lokale en Azure Machine Learning compute-clusters GPU ondersteunen voor training en experimenten, wordt het gebruik van GPU voor de deferentie bij de geïmplementeerd als een webservice alleen ondersteund in AKS.
Het gebruik van een GPU voor deductie bij scoreberekening met een machine learning-pijplijn wordt alleen ondersteund in Azure Machine Learning Compute.
Bij het kiezen van een cluster-SKU moet u eerst omhoog schalen en vervolgens uitbreiden. Begin met een machine met 150% van het RAM-geheugen dat voor uw model is vereist, profileer het resultaat en zoek een machine met de prestaties die u nodig hebt. Zodra u dat weet, verhoogt u het aantal machines dat u nodig hebt voor gelijktijdige deductie.
Notitie
- Containerinstanties zijn alleen geschikt voor kleine modellen met een grootte van minder dan 1 GB.
- Gebruik AKS clusters met één knooppunt voor het ontwikkelen en testen van grotere modellen.
Implementeren in de cloud
Zodra u hebt bevestigd dat uw service lokaal werkt en een extern rekendoel hebt gekozen, bent u klaar om in de cloud te implementeren.
Wijzig de implementatieconfiguratie in overeenstemming met het rekendoel dat u hebt gekozen, in dit geval Azure Container Instances:
De beschikbare opties voor een implementatieconfiguratie verschillen, afhankelijk van het rekendoel dat u kiest.
{
"computeType": "aci",
"containerResourceRequirements":
{
"cpu": 0.5,
"memoryInGB": 1.0
},
"authEnabled": true,
"sslEnabled": false,
"appInsightsEnabled": false
}
Sla dit bestand op als re-deploymentconfig.json .
Zie deze naslaginformatie voor meer informatie.
Implementeer uw service opnieuw:
Vervang bidaf_onnx:1 door de naam van uw model en het versienummer.
az ml model deploy -n myservice \
-m bidaf_onnx:1 \
--overwrite \
--ic inferenceconfig.json \
--dc re-deploymentconfig.json \
-g <resource-group> \
-w <workspace-name>
Gebruik de volgende opdracht om de servicelogboeken weer te geven:
az ml service get-logs -n myservice \
-g <resource-group> \
-w <workspace-name>
Uw externe webservice aanroepen
Wanneer u op afstand implementeert, hebt u mogelijk sleutelverificatie ingeschakeld. In het onderstaande voorbeeld ziet u hoe u uw servicesleutel op kunt halen met Python om een deferentieaanvraag te maken.
[! 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)]
Zie het artikel over clienttoepassingen om webservices te gebruiken voor meer voorbeeldclients in andere talen.
Servicetoestand begrijpen
Tijdens de modelimplementatie ziet u mogelijk de status van de service veranderen terwijl deze volledig wordt geïmplementeerd.
In de volgende tabel worden de verschillende service-staten beschreven:
| Status van webservice | Beschrijving | Laatste status? |
|---|---|---|
| Overgang | De service is bezig met de implementatie. | Nee |
| Niet in orde | De service is geïmplementeerd, maar is momenteel niet bereikbaar. | Nee |
| Niet-bewerkbaar | De service kan op dit moment niet worden geïmplementeerd vanwege een gebrek aan resources. | Nee |
| Mislukt | De service kan niet worden geïmplementeerd vanwege een fout of crash. | Ja |
| In orde | De service is in orde en het eindpunt is beschikbaar. | Ja |
Tip
Tijdens de implementatie worden Docker-afbeeldingen voor rekendoelen gebouwd en geladen vanuit Azure Container Registry (ACR). Standaard maakt Azure Machine Learning een ACR die gebruikmaakt van de basic-servicelaag. Het wijzigen van de ACR voor uw werkruimte in de Standard- of Premium-laag kan de tijd verminderen die nodig is om afbeeldingen te bouwen en te implementeren op uw rekendoelen. Zie servicelagen Azure Container Registry voor meer informatie.
Notitie
Als u een model implementeert naar Azure Kubernetes Service (AKS), raden we u aan om Azure Monitor voor dat cluster in te stellen. Dit helpt u inzicht te krijgen in de algehele clustertoestand en het resourcegebruik. Mogelijk vindt u de volgende resources ook nuttig:
- Controleren op Resource Health die van invloed zijn op uw AKS-cluster
- Azure Kubernetes Service Diagnostics
Als u een model probeert te implementeren in een cluster dat niet in orde of overbelast is, worden er naar verwachting problemen verwacht. Neem contact op met AKS-ondersteuning als u hulp nodig hebt bij het oplossen van problemen met AKS-clusters.
Resources verwijderen
[! 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>
Gebruik om een geïmplementeerde webservice te az ml service delete <name of webservice> verwijderen.
Als u een geregistreerd model uit uw werkruimte wilt verwijderen, gebruikt u az ml model delete <model id>
Lees meer over het verwijderen van een webservice en het verwijderen van een model.
Volgende stappen
- Problemen met een mislukte implementatie oplossen
- Webservice bijwerken
- Implementatie met één klik voor automatische ML wordt uitgevoerd in Azure Machine Learning Studio
- TLS gebruiken om een webservice te beveiligen via Azure Machine Learning
- Uw Azure Machine Learning bewaken met Application Insights
- Gebeurteniswaarschuwingen en triggers maken voor modelimplementaties