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:

  1. Registreer het model.
  2. Een invoerscript voorbereiden.
  3. Bereid een deferentieconfiguratie voor.
  4. Implementeer het model lokaal om ervoor te zorgen dat alles werkt.
  5. Kies een rekendoel.
  6. Implementeer het model in de cloud.
  7. 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:

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:

  1. Uw model laden (met behulp van een functie met de naam init() )
  2. 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:

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