Eseguire l'implementazione sicura delle nuove distribuzioni per l'inferenza in tempo reale
SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)
Questo articolo spiega come distribuire una nuova versione di un modello di Machine Learning nell'ambiente di produzione senza causare interruzioni. Si userà una strategia di distribuzione blu-verde, nota anche come strategia di implementazione sicura, per introdurre la nuova versione di un servizio Web nell'ambiente di produzione. Questa strategia consentirà di implementare la nuova versione del servizio Web in un piccolo subset di utenti o di richieste prima di implementarla completamente.
In questo articolo si presuppone che vengano usati endpoint online, vale a dire endpoint usati per l'inferenza online (in tempo reale). Esistono due tipi di endpoint online: endpoint online gestiti ed endpoint online Kubernetes. Per altre informazioni sugli endpoint e sulle differenze tra endpoint online gestiti ed endpoint online Kubernetes, vedere Che cosa sono gli endpoint di Azure Machine Learning?.
L'esempio principale in questo articolo usa endpoint online gestiti per la distribuzione. Per usare gli endpoint Kubernetes, invece, vedere le note contenute in questo documento che sono inline con la discussione sugli endpoint online gestiti.
In questo articolo si apprenderà come:
- Definire un endpoint online con una distribuzione denominata "blu" per servire la versione 1 di un modello
- Ridimensionare la distribuzione blue in modo che possa gestire più richieste
- Distribuire la versione 2 del modello (denominata distribuzione "green") nell'endpoint ma inviare la distribuzione senza traffico live
- Testare la distribuzione green in isolamento
- Eseguire il mirroring di una percentuale di traffico live nella distribuzione green per convalidarla
- Inviare una piccola percentuale di traffico live alla distribuzione green
- Inviare tutto il traffico live alla distribuzione green
- Eliminare la distribuzione blue v1 non più usata
Prerequisiti
Prima di seguire la procedura descritta in questo articolo, assicurarsi di disporre dei prerequisiti seguenti:
L'interfaccia della riga di comando di Azure e l'estensione
ml
per l'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Installare, configurare e usare l'interfaccia della riga di comando (v2).Importante
Gli esempi dell'interfaccia della riga di comando in questo articolo presuppongono che si usi la shell Bash (o compatibile). Ad esempio, un sistema Linux o un sottosistema Windows per Linux.
Un'area di lavoro di Azure Machine Learning. Se non è disponibile, usare la procedura descritta in Installare, configurare e usare l'interfaccia della riga di comando (v2) per crearne una.
I controlli degli accessi in base al ruolo di Azure vengono usati per concedere l'accesso alle operazioni in Azure Machine Learning. Per eseguire la procedura descritta in questo articolo, all'account utente deve essere assegnato il ruolo di Proprietario o Collaboratore per l'area di lavoro di Azure Machine Learning o a un ruolo personalizzato che consente
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
. Per altre informazioni, vedere Gestire l'accesso a un'area di lavoro di Azure Machine Learning.(Facoltativo) Per eseguire la distribuzione in locale, è necessario installare Docker Engine nel computer locale. Si consiglia vivamente di usare questa opzione per facilitare il debug dei problemi.
Preparare il sistema
Impostare le variabili di ambiente
Se le impostazioni predefinite per l'interfaccia della riga di comando di Azure non sono già state impostate, salvare le proprie impostazioni predefinite. Per evitare di passare più volte i valori per la sottoscrizione, l'area di lavoro e il gruppo di risorse, eseguire questo codice:
az account set --subscription <subscription id>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>
Clonare il repository di esempi
Per seguire questo articolo, clonare prima il repository degli esempi (azureml-examples). Passare, quindi, alla directory cli/
del repository:
git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
cd cli
Suggerimento
Usare --depth 1
per clonare solo il commit più recente nel repository. In questo modo, si riduce il tempo necessario per completare l'operazione.
I comandi di questa esercitazione si trovano nel file deploy-safe-rollout-online-endpoints.sh
, nella directory cli
, mentre i file di configurazione YAML si trovano nella sottodirectory endpoints/online/managed/sample/
.
Nota
I file di configurazione YAML per gli endpoint online Kubernetes si trovano nella sottodirectory endpoints/online/kubernetes/
.
Definire l'endpoint e la distribuzione
Gli endpoint online sono usati per l'inferenza online (in tempo reale). Gli endpoint online contengono distribuzioni pronte a ricevere dati dai client e in grado di inviare risposte in tempo reale.
Definire un endpoint
Nella tabella seguente sono elencati gli attributi chiave da specificare quando si definisce un endpoint.
Attributo | Descrizione |
---|---|
Name | Obbligatorio. Nome dell'endpoint. Deve essere univoco nell'area di Azure. Per altre informazioni sulle regole di denominazione, vedere Limiti degli endpoint. |
Modalità di autenticazione | Metodo di autenticazione per l'endpoint. Scegliere tra l'autenticazione basata su chiave key e l'autenticazione basata su token aml_token di Azure Machine Learning. Una chiave non scade, a differenza di un token. Per altre informazioni sull'autenticazione, vedere Eseguire l'autenticazione a un endpoint online. |
Descrizione | Descrizione dell'endpoint. |
Tag | Dizionario dei tag per l'endpoint. |
Traffico | Regole su come instradare il traffico tra le distribuzioni. Rappresenta il traffico come un dizionario di coppie chiave-valore, in cui le chiavi rappresentano il nome della distribuzione e i valori rappresentano la percentuale di traffico verso tale distribuzione. È possibile impostare il traffico solo dopo aver creato le distribuzioni in un endpoint. È anche possibile aggiornare il traffico per un endpoint online dopo aver creato le distribuzioni. Per altre informazioni su come usare il traffico con mirroring, vedere Allocare una piccola percentuale di traffico live alla nuova distribuzione. |
Mirroring del traffico | Percentuale di traffico live di cui eseguire il mirroring in una distribuzione. Per altre informazioni su come usare il traffico con mirroring, vedere Testare la distribuzione con il traffico con mirroring. |
Per visualizzare un elenco completo degli attributi che è possibile specificare quando si crea un endpoint, vedere Schema YAML dell'endpoint online dell'interfaccia della riga di comando (v2) o classe ManagedOnlineEndpoint (v2) di SDK.
Definire una distribuzione
Una distribuzione è un set di risorse necessarie per ospitare il modello che esegue l'inferenza. Nella tabella seguente vengono descritti gli attributi chiave da specificare quando si definisce una distribuzione.
Attributo | Descrizione |
---|---|
Name | Obbligatorio. Nome della distribuzione. |
Nome endpoint | Obbligatorio. Nome dell'endpoint in cui creare la distribuzione. |
Modello | Modello da usare per la distribuzione. Questo valore può essere un riferimento a un modello con controllo delle versioni esistente nell'area di lavoro o a una specifica del modello inline. Nell'esempio è disponibile un modello scikit-learn che esegue la regressione. |
Percorso del codice | Percorso della directory nell'ambiente di sviluppo locale che contiene tutto il codice sorgente Python per l'assegnazione del punteggio al modello. È possibile usare directory e pacchetti annidati. |
Scoring script (Script di assegnazione punteggi) | Codice Python che esegue il modello in una determinata richiesta di input. Questo valore può essere il percorso relativo del file di punteggio nella directory del codice sorgente. Lo script di assegnazione dei punteggi riceve i dati inviati a un servizio Web distribuito e lo passa al modello. Quindi, lo script esegue il modello e restituisce la risposta al client. Lo script di assegnazione dei punteggi è specifico del modello e deve comprendere i dati che il modello prevede come input e restituisce come output. In questo esempio, è disponibile un file score.py. Questo codice Python deve avere una funzione init() e una funzione run() . La funzione init() verrà chiamata dopo la creazione o l'aggiornamento del modello (ad esempio, è possibile usarla per memorizzare nella cache il modello in memoria). La funzione run() viene chiamata a ogni chiamata dell'endpoint per eseguire l'assegnazione del punteggio e la stima effettive. |
Ambiente | Obbligatorio. Ambiente in cui ospitare il modello e il codice. Questo valore può essere un riferimento a un ambiente con controllo delle versioni esistente nell'area di lavoro o a una specifica dell'ambiente inline. L'ambiente può essere un'immagine Docker con dipendenze Conda, un Dockerfile o un ambiente registrato. |
Tipo di istanza | Obbligatorio. Dimensioni della macchina virtuale da usare per la distribuzione. Per l'elenco delle dimensioni supportate, vedere Elenco di SKU degli endpoint online gestiti. |
Numero di istanze | Obbligatorio. Numero di istanze da usare per la distribuzione. Basare il valore sul carico di lavoro previsto. Per la disponibilità elevata, è consigliabile impostare il valore almeno su 3 . Si riserva un ulteriore 20% per l'esecuzione degli aggiornamenti. Per altre informazioni, vedere Limiti per gli endpoint online. |
Per visualizzare un elenco completo degli attributi che è possibile specificare quando si crea una distribuzione, vedere Schema YAML della distribuzione online gestita dall'interfaccia della riga di comando (v2) o SDK (v2) ManagedOnlineDeployment Class.
Creare un endpoint online
Impostare prima il nome dell'endpoint, quindi configurarlo. In questo articolo si userà il file endpoints/online/managed/sample/endpoint.yml per configurare l'endpoint. Il frammento di codice seguente mostra il contenuto del file:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key
Il riferimento per il formato YAML dell'endpoint è descritto nella tabella seguente. Per informazioni su come specificare questi attributi, vedere le informazioni di riferimento sull'endpointYAML online. Per informazioni sui limiti correlati agli endpoint online gestiti, vedere Limiti sugli endpoint online.
Chiave | Descrizione |
---|---|
$schema |
(Facoltativo) Schema YAML. Per vedere tutte le opzioni disponibili nel file YAML, è possibile visualizzare in un browser lo schema incluso nel frammento di codice precedente. |
name |
Nome dell'endpoint. |
auth_mode |
Usare key per l'autenticazione basata su chiave. Usare aml_token per l'autenticazione basata su token di Azure Machine Learning. Per ottenere il token più recente, usare il comando az ml online-endpoint get-credentials . |
Per creare un endpoint online:
Definire il nome dell’endpoint:
Per Unix, eseguire questo comando (sostituire
YOUR_ENDPOINT_NAME
con un nome univoco):export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Importante
I nomi degli endpoint devono essere univoci nell’area di Azure. Ad esempio, nell’area di Azure
westus2
può esistere un solo endpoint denominatomy-endpoint
.Creare l'endpoint nel cloud:
Eseguire il codice seguente per usare il file
endpoint.yml
per configurare l'endpoint:az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
Creare la distribuzione "blue"
In questo articolo, si userà il file endpoints/online/managed/sample/blue-deployment.yml per configurare gli aspetti chiave della distribuzione. Il frammento di codice seguente mostra il contenuto del file:
$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
Per creare una distribuzione denominata blue
per l'endpoint, eseguire il comando seguente per usare il file blue-deployment.yml
per la configurazione
az ml online-deployment create --name blue --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic
Importante
Il flag --all-traffic
usato in az ml online-deployment create
alloca il 100% del traffico dell'endpoint alla distribuzione blu appena creata.
Nel file blue-deployment.yaml
, viene specificato path
(da cui caricare i file) inline. L'interfaccia della riga di comando carica automaticamente i file e registra il modello e l'ambiente. Come procedura consigliata per la produzione, è necessario registrare il modello e l'ambiente e specificare il nome e la versione registrati separatamente nel YAML. Usare il modulo model: azureml:my-model:1
o environment: azureml:my-env:1
.
Per la registrazione, è possibile estrarre le definizioni YAML di model
e environment
in file YAML separati e usare i comandi az ml model create
e az ml environment create
. Per altre informazioni su questi comandi, eseguire az ml model create -h
e az ml environment create -h
.
Per altre informazioni sulla registrazione del modello come asset, vedere Registrare il modello come asset in Machine Learning usando l'interfaccia della riga di comando. Per altre informazioni sulla creazione di un ambiente, vedere Gestire gli ambienti di Azure Machine Learning con l'interfaccia della riga di comando e l'SDK (v2).
Confermare la distribuzione esistente
Un modo per confermare la distribuzione esistente consiste nel richiamare l'endpoint in modo che possa assegnare un punteggio al modello per una determinata richiesta di input. Quando si richiama l'endpoint tramite l'interfaccia della riga di comando o Python SDK, è possibile scegliere di specificare il nome della distribuzione che riceverà il traffico in ingresso.
Nota
A differenza dell'interfaccia della riga di comando o di Python SDK, Azure Machine Learning Studio richiede di specificare una distribuzione quando si richiama un endpoint.
Richiamare l'endpoint con il nome della distribuzione
Se si richiama l'endpoint con il nome della distribuzione che riceverà il traffico, Azure Machine Learning instrada il traffico dell'endpoint direttamente alla distribuzione specificata e ne restituisce l'output. È possibile usare l'opzione --deployment-name
per l'interfaccia della riga di comando v2, o l'opzione deployment_name
per SDK v2 per specificare la distribuzione.
Richiamare l'endpoint senza specificare la distribuzione
Se si richiama l'endpoint senza specificare la distribuzione che riceverà il traffico, Azure Machine Learning instrada il traffico in ingresso dell'endpoint alle distribuzioni nell'endpoint in base alle impostazioni di controllo del traffico.
Le impostazioni di controllo del traffico allocano le percentuali di traffico in ingresso a ogni distribuzione nell'endpoint. Ad esempio, se le regole di traffico specificano che una particolare distribuzione nell'endpoint riceverà il traffico in ingresso per il 40% del tempo, Azure Machine Learning instrada il 40% del traffico dell'endpoint a tale distribuzione.
È possibile visualizzare lo stato dell'endpoint e della distribuzione esistenti eseguendo:
az ml online-endpoint show --name $ENDPOINT_NAME
az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME
Verranno visualizzati l'endpoint identificato da $ENDPOINT_NAME
e, una distribuzione denominata blue
.
Testare l'endpoint con dati di esempio
L'endpoint può essere richiamato usando il comando invoke
. Verrà inviata una richiesta di esempio usando un file json.
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
Ridimensionare una distribuzione esistente per gestire più traffico
Nella distribuzione descritta in Distribuire e assegnare un punteggio a un modello di Machine Learning con un endpoint online, impostare instance_count
sul valore 1
nel file yaml della distribuzione. Un aumento è possibile usando il comando update
:
az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2
Nota
Si noti che nel comando precedente viene usato --set
per eseguire l'override della configurazione della distribuzione. In alternativa, è possibile aggiornare il file yaml e passarlo come input al comando update
usando l'input --file
.
Distribuire un nuovo modello, ma non inviare ancora traffico
Creare una nuova distribuzione denominata green
:
az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml
Poiché non è stato allocato in modo esplicito alcun traffico a green
, il traffico allocato è pari a zero. Per una verifica, è possibile usare il comando:
az ml online-endpoint show -n $ENDPOINT_NAME --query traffic
Testare la nuova distribuzione
Anche se a green
è allocato lo 0% del traffico, è possibile richiamarlo direttamente specificando il nome --deployment
:
az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json
Per usare un client REST per richiamare la distribuzione direttamente, senza passare attraverso le regole del traffico, impostare l'intestazione HTTP seguente: azureml-model-deployment: <deployment-name>
. Il frammento di codice seguente usa curl
per richiamare direttamente la distribuzione. Il frammento di codice deve funzionare in ambienti Unix/WSL:
# 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
Testare la distribuzione con il traffico con mirroring
Dopo aver testato la distribuzione green
, è possibile copiare o eseguire il mirroring di una percentuale del traffico live. Il mirroring del traffico (detto anche shadowing) non modifica i risultati restituiti ai client. Le richieste continuano a passare al 100% alla distribuzione blue
. La percentuale del traffico con mirroring viene copiata e inviata alla distribuzione green
in modo da poter raccogliere metriche e registrazioni senza impatto sui client. Il mirroring è utile per convalidare una nuova distribuzione senza impatto sui client. Ad esempio, è possibile usare il mirroring per verificare se la latenza si trova all'interno di limiti accettabili o per verificare che non siano presenti errori HTTP. Il test della nuova distribuzione con mirroring/shadowing del traffico è noto anche come shadow testing. La distribuzione che riceve il traffico con mirroring (in questo caso, la distribuzione green
) può anche essere chiamata distribuzione shadow.
Il mirroring presenta le limitazioni seguenti:
- Il mirroring è supportato per l'interfaccia della riga di comando (v2) (versione 2.4.0 o successiva) e Python SDK (v2) (versione 1.0.0 o successiva). Se si usa una versione precedente dell'interfaccia della riga di comando o dell'SDK per aggiornare un endpoint, si perderà l'impostazione del traffico con mirroring.
- Il mirroring non è attualmente supportato per gli endpoint online kubernetes.
- È possibile eseguire il mirroring del traffico a una sola distribuzione in un endpoint.
- La percentuale massima di traffico per cui è possibile eseguire il mirroring è del 50%. Questo limite serve per ridurre l'effetto sulla quota di larghezza di banda dell'endpoint (predefinita a 5 MBPS): la larghezza di banda dell'endpoint viene limitata se si supera la quota allocata. Per informazioni sul monitoraggio della limitazione della larghezza di banda, vedere Monitorare gli endpoint online gestiti.
Tenere presente, inoltre, i seguenti comportamenti:
- Una distribuzione può essere configurata per ricevere solo il traffico live o il traffico con mirroring, non entrambi.
- Quando si richiama un endpoint, è possibile specificare il nome di una delle relative distribuzioni, anche una distribuzione shadow, per restituire la stima.
- Quando si richiama un endpoint con il nome della distribuzione che riceverà il traffico in ingresso, Azure Machine Learning non eseguirà il mirroring del traffico verso la distribuzione shadow. Azure Machine Learning esegue il mirroring del traffico verso la distribuzione shadow dal traffico inviato all'endpoint quando non si specifica una distribuzione.
Adesso, verrà impostata la distribuzione green in modo che riceva il 10% del traffico con mirroring. I client riceveranno comunque stime solo dalla distribuzione blue.
Il comando seguente esegue il mirroring del 10% del traffico verso la distribuzione green
:
az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"
È possibile testare il traffico con mirroring richiamando l'endpoint più volte senza specificare una distribuzione per ricevere il traffico in ingresso:
for i in {1..20} ; do
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done
È possibile verificare che la percentuale specificata del traffico sia stata inviata alla distribuzione green
visualizzando i log dalla distribuzione:
az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME
Dopo il test, è possibile impostare il traffico con mirroring su zero per disabilitare il mirroring:
az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"
Allocare una piccola percentuale di traffico live alla nuova distribuzione
Dopo aver testato la distribuzione green
, allocare una piccola percentuale di traffico a tale distribuzione:
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"
Suggerimento
La somma dei valori in percentuale totale di traffico deve essere pari a 0% (per disabilitare il traffico) o al 100% (per abilitare il traffico).
A questo punto, la distribuzione green
riceve il 10% di tutto il traffico live. I client riceveranno stime sia dalle distribuzioni blue
che green
.
Inviare tutto il traffico alla nuova distribuzione
Quando la distribuzione green
soddisfa pienamente le esigenze, inviare tutto il traffico a tale distribuzione.
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"
Rimuovere la distribuzione precedente
Seguire questa procedura per eliminare una singola distribuzione da un endpoint online gestito. L'eliminazione di una singola distribuzione influisce sulle altre distribuzioni nell'endpoint online gestito:
az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait
Eliminare l'endpoint e la distribuzione
Se non si intende usare l'endpoint e la distribuzione, è necessario eliminarli. Eliminando l'endpoint, verranno eliminate anche tutte le distribuzioni sottostanti.
az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait
Contenuto correlato
- Esplorare esempi di endpoint online
- Distribuire modelli con REST
- Usare l'isolamento rete con gli endpoint online gestiti
- Accedere alle risorse di Azure con un endpoint online e un'identità gestita
- Monitorare gli endpoint online gestiti
- Gestire e aumentare le quote per le risorse con Azure Machine Learning
- Visualizzare i costi per un endpoint online gestito di Azure Machine Learning
- Elenco degli SKU degli endpoint online gestiti
- Risolvere i problemi di distribuzione e assegnazione dei punteggi degli endpoint online
- Informazioni di riferimento su YAML per gli endpoint online