Leggere in inglese

Condividi tramite


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.

Prerequisiti

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.

Modelli di pacchetto

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.

Scaricare un modello in pacchetto

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.

Generare un Dockerfile e le dipendenze

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:

  1. 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 da package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. Per generare l'immagine, usare il comando seguente. Sostituire <imagefiles> con il percorso della directory in cui package.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.

Client di esempio per testare il contenitore locale

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.

Arrestare il contenitore Docker

Per arrestare il contenitore, usare il comando seguente da una shell o da una riga di comando diversa:

docker kill mycontainer

Passaggi successivi