Come creare un pacchetto per un modello registrato con Docker
Questo articolo illustra come creare un pacchetto per un modello registrato di Azure Machine Learning con Docker.
Questo articolo presuppone che il training e la registrazione di un modello nell'area di lavoro di Machine Learning siano già stati eseguiti. Per informazioni su come eseguire il training e registrare un modello scikit-learn, seguire questa esercitazione.
In alcuni casi è possibile creare un'immagine Docker senza distribuire il modello. In alternativa, è possibile scaricare l'immagine ed eseguirla in un'installazione Docker locale. È anche possibile scaricare i file usati per creare l'immagine, esaminarli, modificarli e generare l'immagine manualmente.
La creazione di pacchetti di modelli consente di eseguire queste operazioni. Contiene tutti gli asset necessari per ospitare un modello come servizio Web e consente di scaricare un'immagine Docker completamente creata o i file necessari per crearne una. Esistono due modi per usare la creazione di pacchetti di modelli:
Scaricare un modello in pacchetto: scaricare un'immagine Docker contenente il modello e altri file necessari per ospitarlo come servizio Web.
Generare un Dockerfile: scaricare il Dockerfile, il modello, lo script di immissione e altri asset necessari per generare un'immagine Docker. È possibile, quindi, esaminare i file o apportare modifiche prima di generare l'immagine in locale.
Entrambi i pacchetti possono essere usati per ottenere un'immagine Docker locale.
Suggerimento
La creazione di un pacchetto è simile alla distribuzione di un modello. È possibile usare un modello registrato e una configurazione di inferenza.
Importante
Per scaricare un'immagine totalmente generata o generare un'immagine in locale, è necessario che Docker sia installato nell'ambiente di sviluppo.
L'esempio seguente genera un'immagine registrata nel registro contenitori di Azure per la propria area di lavoro:
package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)
Dopo aver creato un pacchetto, è possibile usare package.pull()
per eseguire il pull dell'immagine nell'ambiente Docker locale. L'output di questo comando visualizzerà il nome dell'immagine. Ad esempio:
Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338
.
Dopo aver scaricato il modello, usare il comando docker images
per elencare le immagini locali:
REPOSITORY TAG IMAGE ID CREATED SIZE
myworkspacef78fd10.azurecr.io/package 20190822181338 7ff48015d5bd 4 minutes ago 1.43 GB
Per avviare un contenitore locale basato su questa immagine, usare il comando seguente per avviare un contenitore denominato dalla shell o dalla riga di comando. Sostituire il valore <imageid>
con l'ID immagine restituito dal comando docker images
.
docker run -p 6789:5001 --name mycontainer <imageid>
Questo comando avvia la versione più recente dell'immagine denominata myimage
. Esegue il mapping della porta locale 6789 alla porta nel contenitore in cui il servizio Web è in ascolto (5001). Assegna anche il nome mycontainer
al contenitore, che semplifica l'arresto del contenitore. Dopo l'avvio del contenitore, è possibile inviare richieste a http://localhost:6789/score
.
L'esempio seguente illustra come scaricare il Dockerfile, il modello e altri asset necessari per generare un'immagine in locale. Il parametro generate_dockerfile=True
indica che si desiderano i file, non un'immagine totalmente generata.
package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)
Questo codice scarica i file necessari per la generazione dell'immagine nella directory imagefiles
. Il Dockerfile incluso nei file salvati fa riferimento a un'immagine di base archiviata in un registro contenitori di Azure. Quando si genera l'immagine nell'installazione di Docker locale, è necessario usare l'indirizzo, il nome utente e la password per l'autenticazione nel registro. Effettuare la procedura seguente per compilare l'immagine usando un'installazione di Docker locale:
Da una shell o da una sessione della riga di comando usare il comando seguente per l’autenticazione di Docker nel registro contenitori di Azure. Sostituire
<address>
,<username>
e<password>
con i valori recuperati dapackage.get_container_registry()
.docker login <address> -u <username> -p <password>
Per generare l'immagine, usare il comando seguente. Sostituire
<imagefiles>
con il percorso della directory in cuipackage.save()
ha salvato i file.docker build --tag myimage <imagefiles>
Questo comando imposta il nome dell'immagine su
myimage
.
Per verificare che l'immagine sia stata generata, usare il comando docker images
. L'immagine myimage
deve essere visualizzata nell'elenco:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 2d5ee0bf3b3b 49 seconds ago 1.43 GB
myimage latest 739f22498d64 3 minutes ago 1.43 GB
Per avviare un nuovo contenitore basato su questa immagine, usare il comando seguente:
docker run -p 6789:5001 --name mycontainer myimage:latest
Questo comando avvia la versione più recente dell'immagine denominata myimage
. Esegue il mapping della porta locale 6789 alla porta nel contenitore in cui il servizio Web è in ascolto (5001). Assegna anche il nome mycontainer
al contenitore, che semplifica l'arresto del contenitore. Dopo l'avvio del contenitore, è possibile inviare richieste a http://localhost:6789/score
.
Il codice seguente è un esempio di un client Python che può essere usato con il contenitore:
import requests
import json
# URL for the web service.
scoring_uri = 'http://localhost:6789/score'
# Two sets of data to score, so we get two results back.
data = {"data":
[
[ 1,2,3,4,5,6,7,8,9,10 ],
[ 10,9,8,7,6,5,4,3,2,1 ]
]
}
# Convert to JSON string.
input_data = json.dumps(data)
# Set the content type.
headers = {'Content-Type': 'application/json'}
# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)
Per alcuni esempi di client in altri linguaggi di programmazione, vedere Usare modelli distribuiti come servizi Web.
Per arrestare il contenitore, usare il comando seguente da una shell o da una riga di comando diversa:
docker kill mycontainer
- Risolvere una distribuzione non riuscita
- Distribuire nel servizio Azure Kubernetes
- Creare applicazioni client per usare servizi Web
- Aggiornare un servizio Web
- Come distribuire un modello usando un'immagine Docker personalizzata
- Usare TLS per proteggere un servizio Web tramite Azure Machine Learning
- Monitorare i modelli di Azure Machine Learning con Application Insights
- Raccogliere i dati per i modelli nell'ambiente di produzione
- Creare trigger e avvisi di eventi per le distribuzioni dei modelli