Condividi tramite


Usare un contenitore personalizzato per distribuire un modello in un endpoint online

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)

Informazioni su come usare un contenitore personalizzato per distribuire un modello in un endpoint online in Azure Machine Learning.

Le distribuzioni di contenitori personalizzate possono usare server Web diversi dal server Python Flask predefinito utilizzato da Azure Machine Learning. Gli utenti di queste distribuzioni possono comunque sfruttare i vantaggi del monitoraggio, del ridimensionamento, degli avvisi e dell'autenticazione predefiniti di Azure Machine Learning.

Nella tabella seguente sono elencati vari esempi di distribuzione che usano contenitori personalizzati, come TensorFlow Serving, TorchServe, Server inferenza DiCenter, pacchetto Plumber R e immagine minima dell'inferenza di Azure Machine Learning.

Esempio Script (CLI) Descrizione
minimal/multimodel deploy-custom-container-minimal-multimodel Distribuire diversi modelli in una singola distribuzione estendendo l'immagine minima dell'inferenza di Azure Machine Learning.
minimal/single-model deploy-custom-container-minimal-single-model Distribuire un singolo modello estendendo l'immagine minima dell'inferenza di Azure Machine Learning.
mlflow/multideployment-scikit deploy-custom-container-mlflow-multideployment-scikit Distribuire due modelli MLFlow con requisiti Python diversi in due distribuzioni separate dietro un singolo endpoint utilizzando l'immagine minima di inferenza di Azure Machine Learning.
r/multimodel-plumber deploy-custom-container-r-multimodel-plumber Distribuire tre modelli di regressione in un endpoint usando il pacchetto Plumber R
tfserving/half-plus-two deploy-custom-container-tfserving-half-plus-two Distribuire un modello Half Plus Two utilizzando un contenitore personalizzato TensorFlow Serving per mezzo del processo di registrazione del modello standard.
tfserving/half-plus-two-integrated deploy-custom-container-tfserving-half-plus-two-integrated Distribuire un modello Half Plus Two utilizzando un contenitore personalizzato TensorFlow Serving con un modello integrato nell'immagine.
torchserve/densenet deploy-custom-container-torchserve-densenet Distribuire un singolo modello usando un contenitore personalizzato TorchServe.
triton/single-model deploy-custom-container-triton-single-model Distribuire un modello Triton utilizzando un contenitore personalizzato

Questo articolo è incentrato sulla gestione di un modello TensorFlow con TensorFlow (TF) Serving.

Avviso

Microsoft potrebbe non essere in grado di risolvere i problemi causati da un'immagine personalizzata. Se si verificano problemi, potrebbe essere richiesto di usare l'immagine predefinita o una delle immagini fornite da Microsoft per verificare se il problema è specifico dell'immagine.

Prerequisiti

Prima di seguire la procedura descritta in questo articolo, assicurarsi di disporre dei prerequisiti seguenti:

  • L'utente o l'entità servizio usata deve avere l'accesso Contributore al gruppo di risorse di Azure che contiene l'area di lavoro. Se l'area di lavoro è stata configurata usando l'articolo di avvio rapido, si ha un gruppo di risorse di questo tipo.

  • Per eseguire la distribuzione in locale, è necessario che il motore Docker sia in esecuzione in locale. Questo passaggio è altamente consigliato. Consente di eseguire il debug dei problemi.

Scaricare il codice sorgente

Per seguire questa esercitazione, clonare il codice sorgente da GitHub.

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

Inizializzare le variabili di ambiente

Definire le variabili di ambiente:

BASE_PATH=endpoints/online/custom-container/tfserving/half-plus-two
AML_MODEL_NAME=tfserving-mounted
MODEL_NAME=half_plus_two
MODEL_BASE_PATH=/var/azureml-app/azureml-models/$AML_MODEL_NAME/1

Scaricare un modello TensorFlow

Scaricare e decomprimere un modello che divide un input per due e aggiunge 2 al risultato:

wget https://aka.ms/half_plus_two-model -O $BASE_PATH/half_plus_two.tar.gz
tar -xvf $BASE_PATH/half_plus_two.tar.gz -C $BASE_PATH

Eseguire un'immagine TF Serving localmente per verificare che funzioni

Usare Docker per eseguire l'immagine in locale la verifica:

docker run --rm -d -v $PWD/$BASE_PATH:$MODEL_BASE_PATH -p 8501:8501 \
 -e MODEL_BASE_PATH=$MODEL_BASE_PATH -e MODEL_NAME=$MODEL_NAME \
 --name="tfserving-test" docker.io/tensorflow/serving:latest
sleep 10

Verificare che sia possibile inviare richieste di liveness e assegnazione dei punteggi all'immagine

Prima di tutto, verificare che il contenitore sia attivo, ovvero che il processo all'interno del contenitore sia ancora in esecuzione. Dovrebbe essere visualizzata una risposta 200 (OK).

curl -v http://localhost:8501/v1/models/$MODEL_NAME

Verificare quindi di poter ottenere previsioni sui dati senza etichetta:

curl --header "Content-Type: application/json" \
  --request POST \
  --data @$BASE_PATH/sample_request.json \
  http://localhost:8501/v1/models/$MODEL_NAME:predict

Arrestare l'immagine

Una volta eseguita la verifica in locale, arrestare l'immagine:

docker stop tfserving-test

Distribuire l'endpoint online in Azure

A questo punto, distribuire l'endpoint online in Azure.

Creare un file YAML per l'endpoint e la distribuzione

È possibile configurare la distribuzione cloud usando YAML. Dare un'occhiata al campione YAML per questo esempio:

tfserving-endpoint.yml

$schema: https://azuremlsdk2.blob.core.windows.net/latest/managedOnlineEndpoint.schema.json
name: tfserving-endpoint
auth_mode: aml_token

tfserving-deployment.yml

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: {{MODEL_VERSION}}
  path: ./half_plus_two
environment_variables:
  MODEL_BASE_PATH: /var/azureml-app/azureml-models/tfserving-mounted/{{MODEL_VERSION}}
  MODEL_NAME: half_plus_two
environment:
  #name: tfserving
  #version: 1
  image: docker.io/tensorflow/serving:latest
  inference_config:
    liveness_route:
      port: 8501
      path: /v1/models/half_plus_two
    readiness_route:
      port: 8501
      path: /v1/models/half_plus_two
    scoring_route:
      port: 8501
      path: /v1/models/half_plus_two:predict
instance_type: Standard_DS3_v2
instance_count: 1

Esistono alcuni concetti importanti da notare in questo parametro YAML/Python:

Immagine di base

L'immagine di base viene specificata come parametro nell'ambiente e docker.io/tensorflow/serving:latest viene usata in questo esempio. Quando si esamina il contenitore, è possibile notare che questo server usa ENTRYPOINT per avviare uno script del punto di ingresso, che accetta le variabili di ambiente come MODEL_BASE_PATH e MODEL_NAMEe espone porte come 8501. Questi dettagli sono tutte informazioni specifiche per questo server scelto. È possibile usare questa conoscenza del server per determinare come definire la distribuzione. Ad esempio, se si impostano le variabili di ambiente per MODEL_BASE_PATH e MODEL_NAME nella definizione di distribuzione, il server (in questo caso TF Serving) accetta i valori per avviare il server. Analogamente, se si imposta la porta per le route che si trovano 8501 nella definizione di distribuzione, la richiesta dell'utente a tali route verrà indirizzata correttamente al server tf serving.

Si noti che questo esempio specifico si basa sul caso TF Serving, ma è possibile usare tutti i contenitori che rimarranno attivi e risponderanno alle richieste in arrivo a route attive, idoneità e assegnazione dei punteggi. È possibile fare riferimento ad altri esempi e vedere come viene formato il dockerfile (ad esempio, usando CMD invece di ENTRYPOINT) per creare i contenitori.

Configurazione dell'inferenza

La configurazione dell'inferenza è un parametro nell'ambiente e specifica la porta e il percorso per 3 tipi di route: liveness, readiness e scoring route. La configurazione dell'inferenza è necessaria se si vuole eseguire il proprio contenitore con l'endpoint online gestito.

Route di preparazione e route liveness

Il server API scelto può fornire un modo per controllare lo stato del server. Esistono due tipi di route che è possibile specificare: liveness e idoneità. Viene utilizzata una route dell'attività per verificare se il server è in esecuzione. Viene usata una route dell'idoneità per verificare se il server è pronto per eseguire il processo. Nel contesto dell'inferenza di Machine Learning, un server potrebbe rispondere 200 OK a una richiesta di attività prima di caricare un modello e il server potrebbe rispondere 200 OK a una richiesta di idoneità solo dopo il caricamento del modello nella memoria.

Per altre informazioni su liveness and readiness probes in generale, vedere la documentazione di Kubernetes.

Le route di liveness e readiness saranno determinate dal server API preferito, come si sarebbe potuto identificare durante il test del contenitore in locale nel passaggio precedente. Si noti che la distribuzione di esempio in questo articolo usa lo stesso percorso per liveness e idoneità, poiché TF Serving definisce solo una route di attività. Fare riferimento ad altri esempi per modelli diversi per definire le route.

Route di assegnazione dei punteggi

Il server API scelto offre un modo per ricevere il payload su cui lavorare. Nel contesto dell'inferenza di Machine Learning, un server riceverà i dati di input tramite una route specifica. Identificare questa route per il server API durante il test del contenitore in locale nel passaggio precedente e specificarla quando si definisce la distribuzione da creare. Si noti che la creazione corretta della distribuzione aggiornerà anche il parametro scoring_uri dell'endpoint, che è possibile verificare con az ml online-endpoint show -n <name> --query scoring_uri.

Individuazione del modello montato

Quando si distribuisce un modello come endpoint online, Azure Machine Learning monta il modello nell'endpoint. Il montaggio del modello consente di distribuire nuove versioni del suddetto senza dover creare una nuova immagine Docker. Per impostazione predefinita, un modello registrato con il nome foo e la versione 1 si trova nel percorso seguente all'interno del contenitore distribuito: /var/azureml-app/azureml-models/foo/1

Ad esempio, se si dispone di una struttura di directory di /azureml-examples/cli/endpoints/online/custom-container nel computer locale, dove il modello è denominato half_plus_two:

Diagramma che mostra una visualizzazione struttura ad albero della struttura di directory locale.

E tfserving-deployment.yml contiene:

model:
    name: tfserving-mounted
    version: 1
    path: ./half_plus_two

Il modello si troverà quindi in /var/azureml-app/azureml-models/tfserving-deployment/1 nella distribuzione:

Diagramma che mostra una visualizzazione struttura ad albero della struttura della directory di distribuzione.

Facoltativamente, è possibile configurare model_mount_path. Consente di modificare il percorso in cui è montato il modello.

Importante

model_mount_path deve essere un percorso assoluto valido in Linux (sistema operativo dell'immagine del contenitore).

Ad esempio, è possibile avere il parametro model_mount_path in tfserving-deployment.yml:

name: tfserving-deployment
endpoint_name: tfserving-endpoint
model:
  name: tfserving-mounted
  version: 1
  path: ./half_plus_two
model_mount_path: /var/tfserving-model-mount
.....

Il modello si trova quindi in /var/tfserving-model-mount/tfserving-deployment/1 nella distribuzione. Si noti che non è più in azureml-app/azureml-models, ma nel percorso di montaggio specificato:

Diagramma che mostra una visualizzazione struttura ad albero della struttura di directory di distribuzione quando si usa mount_model_path.

Creare l'endpoint e la distribuzione

Ora che si sa come è stato costruito il file YAML, creare l'endpoint.

az ml online-endpoint create --name tfserving-endpoint -f endpoints/online/custom-container/tfserving-endpoint.yml

La creazione di una distribuzione potrebbe richiedere alcuni minuti.

az ml online-deployment create --name tfserving-deployment -f endpoints/online/custom-container/tfserving-deployment.yml --all-traffic

Richiamare l'endpoint

Al termine della distribuzione, verificare se è possibile effettuare una richiesta di assegnazione dei punteggi all'endpoint distribuito.

RESPONSE=$(az ml online-endpoint invoke -n $ENDPOINT_NAME --request-file $BASE_PATH/sample_request.json)

Eliminare l'endpoint

Dopo aver ottenuto un punteggio con l'endpoint, è possibile eliminarlo:

az ml online-endpoint delete --name tfserving-endpoint