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:

  1. Registrera modellen.
  2. Förbered ett startskript.
  3. Förbered en inferenskonfiguration.
  4. Distribuera modellen lokalt för att se till att allt fungerar.
  5. Välj ett beräkningsmål.
  6. Distribuera modellen till molnet.
  7. 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:

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:

  1. Läsa in din modell (med hjälp av en funktion som heter init() )
  2. 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