Per iniziare: pubblicazione di previsioni PyTorch con un container personalizzato

Questo tutorial mostra come utilizzare un container personalizzato per eseguire il deployment di un modello di machine learning (ML) PyTorch che fornisce previsioni online.

In questo tutorial, eseguirai il deployment di un container che esegue lo strumento TorchServe di PyTorch al fine di fornire previsioni da un modello di riconoscimento delle cifre fornito da TorchServe che è stato preaddestrato sul set di dati MNIST. Puoi quindi utilizzare AI Platform Prediction per classificare le immagini di cifre.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API AI Platform Training & Prediction and Artifact Registry API.

    Abilita le API

  5. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Abilita le API AI Platform Training & Prediction and Artifact Registry API.

    Abilita le API

  8. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

Durante questo tutorial, ti consigliamo di utilizzare Cloud Shell per interagire con Google Cloud. Se vuoi utilizzare una shell Bash diversa anziché Cloud Shell, esegui la seguente configurazione aggiuntiva:

  1. Installa Google Cloud CLI.
  2. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  3. Segui la documentazione di Artifact Registry per installare Docker.

Creazione ed esecuzione del push dell'immagine container

Per utilizzare un container personalizzato, devi specificare un'immagine container Docker che soddisfi i requisiti per i container personalizzati. Questa sezione descrive come creare l'immagine container ed eseguirne il push in Artifact Registry.

Scarica artefatti del modello

Gli artefatti del modello sono file creati dall'addestramento ML che puoi utilizzare per fornire previsioni. Contengono, come minimo, la struttura e le ponderazioni del modello ML addestrato. Il formato degli artefatti del modello dipende dal framework ML utilizzato per l'addestramento .

Per questo tutorial, anziché addestrare da zero, scarica gli artefatti del modello di esempio forniti da TorchServe.

Per clonare il repository TorchServe e passare alla directory con gli artefatti del modello, esegui questi comandi nella shell:

git clone https://github.com/pytorch/serve.git \
  --branch=v0.3.0 \
  --depth=1

cd serve/examples/image_classifier/mnist

Questa directory contiene tre file importanti da creare nell'immagine container:

  • mnist.py: definisce la struttura della rete neurale addestrata
  • mnist_cnn.pt: contiene un state_dict con pesi delle caratteristiche e altri output di addestramento
  • mnist_handler.py: estende il modo in cui TorchServe gestisce le richieste di previsione

Crea un repository Artifact Registry

Crea un repository Artifact Registry per archiviare l'immagine container che creerai nella sezione successiva. Esegui questo comando nella shell:

gcloud beta artifacts repositories create getting-started-pytorch \
 --repository-format=docker \
 --location=REGION

Sostituisci REGION con la regione in cui Artifact Registry deve archiviare l'immagine container. Successivamente, dovrai creare una risorsa del modello di previsione di AI Platform su un endpoint a livello di regione corrispondente a questa regione, quindi scegli una regione in cui AI Platform Prediction ha un endpoint a livello di regione, ad esempio us-central1.

Dopo aver completato l'operazione, questo comando stampa il seguente input:

Created repository [getting-started-pytorch].

Crea l'immagine container

TorchServe fornisce un Dockerfile per la creazione di un'immagine container che esegue TorchServe. Tuttavia, invece di utilizzare questo Dockerfile per installare tutte le dipendenze di TorchServe, puoi accelerare il processo di compilazione ricavando l'immagine container da una delle immagini TorchServe di cui il team TorchServe ha eseguito il push a Docker Hub.

  1. Nella directory con gli artefatti del modello, crea un nuovo Dockerfile eseguendo questo comando nella shell:

    cat > Dockerfile <<END
    FROM pytorch/torchserve:0.3.0-cpu
    
    COPY mnist.py mnist_cnn.pt mnist_handler.py /home/model-server/
    
    USER root
    RUN printf "\nservice_envelope=json" >> /home/model-server/config.properties
    USER model-server
    
    RUN torch-model-archiver \
      --model-name=mnist \
      --version=1.0 \
      --model-file=/home/model-server/mnist.py \
      --serialized-file=/home/model-server/mnist_cnn.pt \
      --handler=/home/model-server/mnist_handler.py \
      --export-path=/home/model-server/model-store
    
    CMD ["torchserve", \
         "--start", \
         "--ts-config=/home/model-server/config.properties", \
         "--models", \
         "mnist=mnist.mar"]
    END
    

    Queste istruzioni Docker svolgono le seguenti azioni:

    • L'istruzione FROM ricava l'immagine container corrente da un'immagine TorchServe esistente.

    • L'istruzione COPY copia gli artefatti del modello e il gestore di previsioni dalla directory locale alla directory /home/model-server/ dell'immagine container.

    • La prima istruzione RUN modifica il file di configurazione dell'immagine padre per supportare il formato di input preferito di AI Platform Prediction per le previsioni.

      Nello specifico, questa istruzione configura TorchServe in modo che si aspetti una inviluppo di servizio JSON per le richieste di previsione.

      La modifica di questo file di configurazione richiede l'autorizzazione di cui non dispone l'utente model-server (creato nell'immagine principale). Le istruzioni indicano a Docker di eseguire l'esecuzione come utente root per modificare il file di configurazione, quindi di continuare a utilizzare l'utente model-server per seguire le istruzioni.

    • La seconda istruzione RUN utilizza l'archivio modelli Torch, già installato sull'immagine container, per creare un archivio modelli a partire dai file copiati nell'immagine. Salva questo archivio di modelli nella directory /home/model-server/model-store/ con il nome file mnist.mar.

      Se vuoi modificare l'immagine container, ad esempio per eseguire la pre-elaborazione o la post-elaborazione personalizzata nel gestore di richieste, puoi utilizzare istruzioni RUN aggiuntive per installare le dipendenze.

    • L'istruzione CMD avvia il server HTTP TorchServe. Fa riferimento al file di configurazione dell'immagine padre e consente la pubblicazione per un modello denominato mnist. Questo modello carica il file mnist.mar creato dall'istruzione RUN.

      Questa istruzione sostituisce l'istruzione CMD dell'immagine principale. È importante eseguire l'override dell'istruzione CMD e non dell'istruzione ENTRYPOINT, poiché lo script ENTRYPOINT dell'immagine padre esegue il comando passato in CMD e aggiunge anche ulteriore logica per impedire l'uscita di Docker.

  2. Per creare l'immagine del container in base al nuovo Dockerfile e taggarlo con un nome compatibile con il tuo repository Artifact Registry, esegui questo comando nella shell:

    docker build \
      --tag=REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist \
      .
    

    Sostituisci quanto segue:

    • REGION: la regione del repository Artifact Registry, come specificato in una sezione precedente
    • PROJECT_ID: l'ID del tuo progetto Google Cloud

    Il comando potrebbe essere eseguito per diversi minuti.

Esegui il container localmente (facoltativo)

Prima di eseguire il push dell'immagine container ad Artifact Registry per utilizzarla con AI Platform Prediction, puoi eseguirla come container nel tuo ambiente locale per verificare che il server funzioni come previsto:

  1. Per eseguire l'immagine container come container localmente, esegui questo comando nella shell:

    docker run -d -p 8080:8080 --name=local_mnist \
      REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist
    

    Sostituisci quanto segue, come hai fatto nella sezione precedente:

    • REGION: la regione del repository Artifact Registry, come specificato in una sezione precedente
    • PROJECT_ID: l'ID del tuo progetto Google Cloud

    Questo comando esegue un container in modalità scollegata, mappando la porta 8080 del container alla porta 8080 dell'ambiente locale. L'immagine principale, da cui hai derivato l'immagine container, configura TorchServe per utilizzare la porta 8080.

  2. Per inviare un controllo di integrità al server del container, esegui questo comando nella shell:

    curl localhost:8080/ping
    

    In caso di esito positivo, il server restituisce la seguente risposta:

    {
      "status": "Healthy"
    }
    
  3. Per inviare una richiesta di previsione al server del container, esegui questi comandi nella shell:

    cat > instances.json <<END
    {
      "instances": [
        {
          "data": {
            "b64": "$(base64 --wrap=0 test_data/3.png)"
          }
        }
      ]
    }
    END
    
    curl -X POST \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @instances.json \
      localhost:8080/predictions/mnist
    

    La richiesta utilizza una delle immagini di test incluse nell'esempio di TorchServe.

    In caso di esito positivo, il server restituisce la seguente previsione:

    {"predictions": [3]}
    
  4. Per arrestare il container, esegui questo comando nella shell:

    docker stop local_mnist
    

Esegui il push dell'immagine container in Artifact Registry

Configura Docker per accedere ad Artifact Registry. Poi esegui il push dell'immagine container nel repository Artifact Registry.

  1. Per concedere all'installazione Docker locale l'autorizzazione per eseguire il push ad Artifact Registry nella regione che hai scelto, esegui questo comando nella shell:

    gcloud auth configure-docker REGION-docker.pkg.dev
    

    Sostituisci REGION con la regione in cui hai creato il repository in una sezione precedente.

  2. Per eseguire il push in Artifact Registry dell'immagine container che hai appena creato, esegui questo comando nella shell:

    docker push REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist
    

    Sostituisci quanto segue, come hai fatto nella sezione precedente:

    • REGION: la regione del repository Artifact Registry, come specificato in una sezione precedente
    • PROJECT_ID: l'ID del tuo progetto Google Cloud

Deployment del container

Questa sezione illustra la creazione di un modello e di una versione su AI Platform Prediction per fornire previsioni. La versione del modello esegue l'immagine container come container per fornire previsioni.

Questo tutorial fornisce opzioni di configurazione specifiche da utilizzare quando crei il modello e la versione del modello. Se vuoi conoscere le diverse opzioni di configurazione, consulta Deployment dei modelli.

Crea un modello

Per creare una risorsa del modello, esegui il comando seguente nella shell:

gcloud beta ai-platform models create getting_started_pytorch \
  --region=REGION \
  --enable-logging \
  --enable-console-logging

Sostituisci REGION con la stessa regione in cui hai creato il repository Artifact Registry in una sezione precedente.

Crea una versione del modello

Per creare una risorsa della versione del modello, esegui questo comando nella shell:

gcloud beta ai-platform versions create v1 \
  --region=REGION \
  --model=getting_started_pytorch \
  --machine-type=n1-standard-4 \
  --image=REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist \
  --ports=8080 \
  --health-route=/ping \
  --predict-route=/predictions/mnist

Sostituisci quanto segue:

  • REGION: la regione in cui hai creato il repository Artifact Registry e il modello di AI Platform Prediction nelle sezioni precedenti
  • PROJECT_ID: l'ID del tuo progetto Google Cloud

I flag relativi ai container in questo comando:

Recupero di una previsione in corso...

I file di esempio TorchServe che hai scaricato in una sezione precedente includono immagini di test. La configurazione TorchServe del container prevede di ricevere richieste di previsione in formato JSON, con l'immagine sotto forma di stringa con codifica Base64 nel campo data.b64 di ogni istanza.

Ad esempio, per classificare test_data/3.png, esegui questi comandi nella shell:

cat > instances.json <<END
{
 "instances": [
   {
     "data": {
       "b64": "$(base64 --wrap=0 test_data/3.png)"
     }
   }
 ]
}
END

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d @instances.json \
  https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/getting_started_pytorch/versions/v1:predict

Sostituisci quanto segue:

  • REGION: la regione in cui hai creato il modello di AI Platform Prediction, una sezione precedente
  • PROJECT_ID: l'ID del tuo progetto Google Cloud

In caso di esito positivo, la versione del modello restituisce la seguente previsione:

{"predictions": [3]}

Eseguire la pulizia

Per evitare ulteriori addebiti di AI Platform Prediction e Artifact Registry, elimina le risorse Google Cloud che hai creato durante questo tutorial:

  1. Per eliminare la versione del modello, esegui questo comando nella shell:

    gcloud ai-platform versions delete v1 \
      --region=REGION \
      --model=getting_started_pytorch \
      --quiet
    

    Sostituisci REGION con la regione in cui hai creato il modello nella sezione precedente.

  2. Per eliminare il modello, esegui questo comando nella shell:

    gcloud ai-platform models delete getting_started_pytorch \
      --region=REGION \
      --quiet
    

    Sostituisci REGION con la regione in cui hai creato il modello nella sezione precedente.

  3. Per eliminare il repository Artifact Registry e l'immagine container al suo interno, esegui questo comando nella shell:

    gcloud beta artifacts repositories delete getting-started-pytorch \
      --location=REGION \
      --quiet
    

    Sostituisci REGION con la regione in cui hai creato il repository Artifact Registry in una sezione precedente.

Passaggi successivi