Utföra säker distribution av nya distributioner för slutsatsdragning i realtid

GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)

I den här artikeln får du lära dig hur du distribuerar en ny version av en maskininlärningsmodell i produktion utan att orsaka några störningar. Du använder en blågrön distributionsstrategi (även kallad säker distributionsstrategi) för att introducera en ny version av en webbtjänst i produktion. Med den här strategin kan du distribuera din nya version av webbtjänsten till en liten delmängd av användare eller begäranden innan du distribuerar den helt.

Den här artikeln förutsätter att du använder onlineslutpunkter, det vill säga slutpunkter som används för onlineinferenser (realtid). Det finns två typer av onlineslutpunkter: hanterade onlineslutpunkter och Kubernetes-onlineslutpunkter. Mer information om slutpunkter och skillnaderna mellan hanterade onlineslutpunkter och Kubernetes onlineslutpunkter finns i Vad är Azure Machine Learning-slutpunkter?.

Huvudexemplet i den här artikeln använder hanterade onlineslutpunkter för distribution. Om du vill använda Kubernetes-slutpunkter i stället kan du läsa anteckningarna i det här dokumentet som är infogade i den hanterade onlineslutpunktsdiskussionen.

I den här artikeln lär du dig att:

  • Definiera en onlineslutpunkt med en distribution som kallas "blå" för att hantera version 1 av en modell
  • Skala den blå distributionen så att den kan hantera fler begäranden
  • Distribuera version 2 av modellen (kallas "grön" distribution) till slutpunkten, men skicka ingen livetrafik till distributionen
  • Testa den gröna distributionen isolerat
  • Spegla en procentandel av livetrafik till den gröna distributionen för att verifiera den
  • Skicka en liten procentandel livetrafik till den gröna distributionen
  • Skicka all livetrafik till den gröna distributionen
  • Ta bort den nu oanvända blå v1-distributionen

Förutsättningar

Innan du följer stegen i den här artikeln kontrollerar du att du har följande förutsättningar:

  • Rollbaserade åtkomstkontroller i Azure (Azure RBAC) används för att bevilja åtkomst till åtgärder i Azure Machine Learning. Om du vill utföra stegen i den här artikeln måste ditt användarkonto tilldelas rollen ägare eller deltagare för Azure Machine Learning-arbetsytan eller en anpassad roll som tillåter Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Mer information finns i Hantera åtkomst till en Azure Machine Learning-arbetsyta.

  • (Valfritt) Om du vill distribuera lokalt måste du installera Docker Engine på den lokala datorn. Vi rekommenderar starkt det här alternativet, så det är enklare att felsöka problem.

Förbereda systemet

Ange miljövariabler

Om du inte redan har angett standardinställningarna för Azure CLI sparar du standardinställningarna. Kör den här koden för att undvika att skicka in värdena för din prenumeration, arbetsyta och resursgrupp flera gånger:

az account set --subscription <subscription id>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>

Klona exempellagringsplatsen

Om du vill följa med i den här artikeln klonar du först exempellagringsplatsen (azureml-examples). Gå sedan till lagringsplatsens cli/ katalog:

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
cd cli

Dricks

Använd --depth 1 för att endast klona den senaste incheckningen till lagringsplatsen. Detta minskar tiden för att slutföra åtgärden.

Kommandona i den här självstudien finns i filen deploy-safe-rollout-online-endpoints.sh i cli katalogen och YAML-konfigurationsfilerna finns i underkatalogen endpoints/online/managed/sample/ .

Kommentar

YAML-konfigurationsfilerna för Kubernetes onlineslutpunkter finns i underkatalogen endpoints/online/kubernetes/ .

Definiera slutpunkten och distributionen

Onlineslutpunkter används för slutsatsdragning online (i realtid). Onlineslutpunkter innehåller distributioner som är redo att ta emot data från klienter och skicka svar tillbaka i realtid.

Definiera en slutpunkt

I följande tabell visas nyckelattribut som ska anges när du definierar en slutpunkt.

Attribut Beskrivning
Name Obligatoriska. Namnet på slutpunkten. Den måste vara unik i Azure-regionen. Mer information om namngivningsreglerna finns i slutpunktsgränser.
Autentiseringsläge Autentiseringsmetoden för slutpunkten. Välj mellan nyckelbaserad autentisering key och tokenbaserad autentisering aml_tokeni Azure Machine Learning . En nyckel upphör inte att gälla, men en token upphör att gälla. Mer information om autentisering finns i Autentisera till en onlineslutpunkt.
beskrivning Beskrivning av slutpunkten.
Taggar Ordlista med taggar för slutpunkten.
Trafik Regler för hur du dirigerar trafik mellan distributioner. Representera trafiken som en ordlista med nyckel/värde-par, där nyckeln representerar distributionsnamnet och värdet representerar procentandelen trafik till den distributionen. Du kan bara ange trafiken när distributionerna under en slutpunkt har skapats. Du kan också uppdatera trafiken för en onlineslutpunkt när distributionerna har skapats. Mer information om hur du använder speglad trafik finns i Allokera en liten procentandel livetrafik till den nya distributionen.
Speglingstrafik Procentandel av livetrafik som ska speglas i en distribution. Mer information om hur du använder speglad trafik finns i Testa distributionen med speglad trafik.

En fullständig lista över attribut som du kan ange när du skapar en slutpunkt finns i CLI (v2) YAML-schema för onlineslutpunkt eller SDK (v2) ManagedOnlineEndpoint Class.

Definiera en distribution

En distribution är en uppsättning resurser som krävs för att vara värd för den modell som utför den faktiska inferensen. I följande tabell beskrivs nyckelattribut som ska anges när du definierar en distribution.

Attribut Beskrivning
Name Obligatoriska. Namn på distributionen.
Slutpunktnamn Obligatoriska. Namnet på slutpunkten som distributionen ska skapas under.
Modell Den modell som ska användas för distributionen. Det här värdet kan antingen vara en referens till en befintlig version av modellen på arbetsytan eller en infogad modellspecifikation. I exemplet har vi en scikit-learn-modell som utför regression.
Kodsökväg Sökvägen till katalogen i den lokala utvecklingsmiljön som innehåller all Python-källkod för bedömning av modellen. Du kan använda kapslade kataloger och paket.
Bedömningsskript Python-kod som kör modellen på en angiven indatabegäran. Det här värdet kan vara den relativa sökvägen till bedömningsfilen i källkodskatalogen.
Bedömningsskriptet tar emot data som skickats till en distribuerad webbtjänst och skickar dem till modellen. Skriptet kör sedan modellen och returnerar svaret till klienten. Bedömningsskriptet är specifikt för din modell och måste förstå de data som modellen förväntar sig som indata och returnerar som utdata.
I det här exemplet har vi en score.py fil. Den här Python-koden måste ha en init() funktion och en run() funktion. Funktionen init() anropas när modellen har skapats eller uppdaterats (du kan till exempel använda den för att cachelagra modellen i minnet). Funktionen run() anropas vid varje anrop av slutpunkten för att utföra den faktiska poängsättningen och förutsägelsen.
Environment Obligatoriska. Miljön som ska vara värd för modellen och koden. Det här värdet kan antingen vara en referens till en befintlig version av miljön på arbetsytan eller en infogad miljöspecifikation. Miljön kan vara en Docker-avbildning med Conda-beroenden, en Dockerfile eller en registrerad miljö.
Instanstyp Obligatoriska. Den VM-storlek som ska användas för distributionen. Listan över storlekar som stöds finns i SKU-listan för hanterade onlineslutpunkter.
Antal instanser Obligatoriska. Antalet instanser som ska användas för distributionen. Basera värdet på den arbetsbelastning du förväntar dig. För hög tillgänglighet rekommenderar vi att du anger värdet till minst 3. Vi reserverar ytterligare 20 % för att utföra uppgraderingar. Mer information finns i begränsningar för onlineslutpunkter.

En fullständig lista över attribut som du kan ange när du skapar en distribution finns i CLI (v2) managed online deployment YAML schema or SDK (v2) ManagedOnlineDeployment Class.

Skapa onlineslutpunkt

Ange först slutpunktens namn och konfigurera det sedan. I den här artikeln använder du filen endpoints/online/managed/sample/endpoint.yml för att konfigurera slutpunkten. Följande kodfragment visar innehållet i filen:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

Referensen för YAML-formatet för slutpunkten beskrivs i följande tabell. Information om hur du anger dessa attribut finns i YAML-referensen för onlineslutpunkten. Information om begränsningar relaterade till hanterade onlineslutpunkter finns i begränsningar för onlineslutpunkter.

Nyckel beskrivning
$schema (Valfritt) YAML-schemat. Om du vill se alla tillgängliga alternativ i YAML-filen kan du visa schemat i föregående kodfragment i en webbläsare.
name Namnet på slutpunkten.
auth_mode Används key för nyckelbaserad autentisering. Används aml_token för tokenbaserad autentisering i Azure Machine Learning. Använd kommandot för az ml online-endpoint get-credentials att hämta den senaste token.

Så här skapar du en onlineslutpunkt:

  1. Ange slutpunktsnamnet:

    För Unix kör du det här kommandot (ersätt YOUR_ENDPOINT_NAME med ett unikt namn):

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Viktigt!

    Slutpunktsnamn måste vara unika i en Azure-region. I Azure-regionen westus2 kan det till exempel bara finnas en slutpunkt med namnet my-endpoint.

  2. Skapa slutpunkten i molnet:

    Kör följande kod för att använda endpoint.yml filen för att konfigurera slutpunkten:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

Skapa den "blå" distributionen

I den här artikeln använder du filen endpoints/online/managed/sample/blue-deployment.yml för att konfigurera de viktigaste aspekterna av distributionen. Följande kodfragment visar innehållet i filen:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

Om du vill skapa en distribution med namnet blue för slutpunkten kör du följande kommando för att använda blue-deployment.yml filen för att konfigurera

az ml online-deployment create --name blue --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic

Viktigt!

Flaggan --all-traffic i az ml online-deployment create allokerar 100 % av slutpunktstrafiken till den nyligen skapade blå distributionen.

blue-deployment.yaml I filen anger path vi (var filer ska laddas upp från) infogade. CLI laddar automatiskt upp filerna och registrerar modellen och miljön. Som bästa praxis för produktion bör du registrera modellen och miljön och ange det registrerade namnet och versionen separat i YAML. Använd formuläret model: azureml:my-model:1 eller environment: azureml:my-env:1.

För registrering kan du extrahera YAML-definitionerna för model och environment till separata YAML-filer och använda kommandona az ml model create och az ml environment create. Om du vill veta mer om dessa kommandon kör az ml model create -h du och az ml environment create -h.

Mer information om hur du registrerar din modell som en tillgång finns i Registrera din modell som en tillgång i Machine Learning med hjälp av CLI. Mer information om hur du skapar en miljö finns i Hantera Azure Machine Learning-miljöer med CLI & SDK (v2).

Bekräfta din befintliga distribution

Ett sätt att bekräfta din befintliga distribution är att anropa slutpunkten så att den kan poängsätta din modell för en viss indatabegäran. När du anropar slutpunkten via CLI eller Python SDK kan du välja att ange namnet på den distribution som ska ta emot den inkommande trafiken.

Kommentar

Till skillnad från CLI eller Python SDK kräver Azure Machine Learning-studio att du anger en distribution när du anropar en slutpunkt.

Anropa slutpunkt med distributionsnamn

Om du anropar slutpunkten med namnet på distributionen som ska ta emot trafik dirigerar Azure Machine Learning slutpunktens trafik direkt till den angivna distributionen och returnerar dess utdata. Du kan använda --deployment-name alternativet för CLI v2 eller deployment_name alternativet för SDK v2 för att ange distributionen.

Anropa slutpunkten utan att ange distribution

Om du anropar slutpunkten utan att ange den distribution som ska ta emot trafik dirigerar Azure Machine Learning slutpunktens inkommande trafik till distributionerna i slutpunkten baserat på inställningarna för trafikkontroll.

Inställningar för trafikkontroll allokerar angivna procentandelar av inkommande trafik till varje distribution i slutpunkten. Om dina trafikregler till exempel anger att en viss distribution i slutpunkten ska ta emot inkommande trafik 40 % av tiden dirigerar Azure Machine Learning 40 % av slutpunktens trafik till distributionen.

Du kan visa status för din befintliga slutpunkt och distribution genom att köra:

az ml online-endpoint show --name $ENDPOINT_NAME 

az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME 

Du bör se slutpunkten som identifieras av $ENDPOINT_NAME och, en distribution med namnet blue.

Testa slutpunkten med exempeldata

Slutpunkten kan anropas med kommandot invoke . Vi skickar en exempelbegäran med hjälp av en json-fil .

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

Skala din befintliga distribution för att hantera mer trafik

I distributionen som beskrivs i Distribuera och poängsätta en maskininlärningsmodell med en onlineslutpunkt anger instance_count du värdet 1 i yaml-filen för distribution. Du kan skala ut med kommandot update :

az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2

Kommentar

Observera att vi i kommandot ovan använder --set för att åsidosätta distributionskonfigurationen. Du kan också uppdatera yaml-filen och skicka den som indata till update kommandot med hjälp av --file indata.

Distribuera en ny modell, men skicka ingen trafik ännu

Skapa en ny distribution med namnet green:

az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml

Eftersom vi inte uttryckligen har allokerat någon trafik till greenhar den ingen allokerad trafik. Du kan kontrollera det med hjälp av kommandot:

az ml online-endpoint show -n $ENDPOINT_NAME --query traffic

Testa den nya distributionen

Även om green 0 % av trafiken har allokerats kan du anropa den direkt genom att --deployment ange namnet:

az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json

Om du vill använda en REST-klient för att anropa distributionen direkt utan att gå igenom trafikregler anger du följande HTTP-huvud: azureml-model-deployment: <deployment-name>. Kodfragmentet nedan använder curl för att anropa distributionen direkt. Kodfragmentet bör fungera i Unix/WSL-miljöer:

# get the scoring uri
SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
# use curl to invoke the endpoint
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --header "azureml-model-deployment: green" --data @endpoints/online/model-2/sample-request.json

Testa distributionen med speglad trafik

När du har testat distributionen green kan du spegla (eller kopiera) en procentandel av den aktiva trafiken till den. Trafikspegling (kallas även skuggning) ändrar inte resultatet som returneras till klienter – begäranden flödar fortfarande 100 % till distributionen blue . Den speglade procentandelen av trafiken kopieras och skickas till distributionen green så att du kan samla in mått och loggning utan att påverka dina klienter. Spegling är användbart när du vill verifiera en ny distribution utan att påverka klienter. Du kan till exempel använda spegling för att kontrollera om svarstiden ligger inom godkända gränser eller för att kontrollera att det inte finns några HTTP-fel. Testning av den nya distributionen med trafikspegling/skuggning kallas även för skuggtestning. Distributionen som tar emot den speglade trafiken (i det här fallet distributionengreen) kan också kallas för skuggdistribution.

Spegling har följande begränsningar:

  • Spegling stöds för CLI (v2) (version 2.4.0 eller senare) och Python SDK (v2) (version 1.0.0 eller senare). Om du använder en äldre version av CLI/SDK för att uppdatera en slutpunkt förlorar du inställningen för speglingstrafik.
  • Spegling stöds för närvarande inte för Kubernetes onlineslutpunkter.
  • Du kan bara spegla trafik till en distribution i en slutpunkt.
  • Den maximala procentandelen trafik som du kan spegla är 50 %. Den här gränsen är att minska effekten på din slutpunktsbandbreddskvot (standardvärdet 5 MBPS) – slutpunktsbandbredden begränsas om du överskrider den allokerade kvoten. Information om övervakning av bandbreddsbegränsning finns i Övervaka hanterade onlineslutpunkter.

Observera även följande beteenden:

  • En distribution kan konfigureras för att endast ta emot livetrafik eller speglad trafik, inte båda.
  • När du anropar en slutpunkt kan du ange namnet på någon av dess distributioner – även en skuggdistribution – för att returnera förutsägelsen.
  • När du anropar en slutpunkt med namnet på distributionen som ska ta emot inkommande trafik speglar Inte Azure Machine Learning trafiken till skuggdistributionen. Azure Machine Learning speglar trafik till skuggdistributionen från trafik som skickas till slutpunkten när du inte anger någon distribution.

Nu ska vi ange att den gröna distributionen ska ta emot 10 % av den speglade trafiken. Klienterna får fortfarande bara förutsägelser från den blå distributionen.

Diagram showing 10% traffic mirrored to one deployment.

Följande kommando speglar 10 % av trafiken till distributionen green :

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"

Du kan testa speglingstrafiken genom att anropa slutpunkten flera gånger utan att ange någon distribution för att ta emot inkommande trafik:

for i in {1..20} ; do
    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done

Du kan bekräfta att den specifika procentandelen av trafiken skickades till distributionen green genom att se loggarna från distributionen:

az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME

Efter testningen kan du ställa in speglingstrafiken på noll för att inaktivera spegling:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"

Allokera en liten procentandel livetrafik till den nya distributionen

När du har testat distributionen green allokerar du en liten procentandel trafik till den:

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"

Dricks

Den totala trafikprocenten måste summeras till antingen 0 % (för att inaktivera trafik) eller 100 % (för att aktivera trafik).

Nu tar distributionen green emot 10 % av all livetrafik. Klienter får förutsägelser från både distributionerna blue och green .

Diagram showing traffic split between deployments.

Skicka all trafik till din nya distribution

När du är helt nöjd med distributionen green växlar du all trafik till den.

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"

Ta bort den gamla distributionen

Använd följande steg för att ta bort en enskild distribution från en hanterad onlineslutpunkt. Om du tar bort en enskild distribution påverkas de andra distributionerna i den hanterade onlineslutpunkten:

az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait

Ta bort slutpunkten och distributionen

Om du inte ska använda slutpunkten och distributionen bör du ta bort dem. Genom att ta bort slutpunkten tar du också bort alla dess underliggande distributioner.

az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait