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 usando un contenitore personalizzato TensorFlow Serving usando il 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 usando un contenitore personalizzato TensorFlow Serving con il modello integrato nell'immagine.
torchserve/densenet deploy-custom-container-torchserve-densenet Distribuire un singolo modello usando un contenitore personalizzato TorchServe.
torchserve/huggingface-textgen deploy-custom-container-torchserve-huggingface-textgen Distribuire i modelli Hugging Face in un endpoint online e seguire l'esempio di Hugging Face Transformers 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 Collaboratore 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 dispone di 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

Ora che è stato testato 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:

Route di idoneità rispetto a route di attività

Un server HTTP definisce i percorsi sia per l'attività che per l'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. Nell'inferenza di Machine Learning un server potrebbe rispondere 200 OK a una richiesta di liveness prima di caricare un modello. Il server potrebbe rispondere 200 OK a una richiesta di idoneità solo dopo il caricamento del modello in memoria.

Per altre informazioni sulle attività e sui probe di idoneità, vedere la documentazione di Kubernetes.

Si noti che questa distribuzione usa lo stesso percorso sia per l'attività che per l'idoneità, poiché TF Serving definisce solo una route di attività.

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 modello 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 nel computer locale è presente una struttura di directory /azureml-examples/cli/endpoints/online/custom-container , in cui 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

Dopo aver compreso 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