Comenzar: Entrega predicciones de PyTorch con un contenedor personalizado

En este instructivo, se muestra cómo usar un contenedor personalizado para implementar un modelo de aprendizaje automático (AA) de PyTorch que entregue predicciones en línea.

En este instructivo, implementarás un contenedor que ejecuta la herramienta TorchServe de PyTorch para entregar predicciones de un modelo de reconocimiento de dígitos que proporciona TorchServe previamente entrenado en el conjunto de datos MNIST. Luego, puedes usar AI Platform Prediction para clasificar imágenes de dígitos.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Artifact Registry API APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the AI Platform Training & Prediction and Artifact Registry API APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

Durante este instructivo, te recomendamos que uses Cloud Shell para interactuar con Google Cloud. Si quieres usar un shell de Bash diferente en lugar de Cloud Shell, realiza la siguiente configuración adicional:

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. Sigue la documentación de Artifact Registry para instalar Docker.

Compila y envía la imagen de contenedor

Para usar un contenedor personalizado, debes especificar una imagen de contenedor de Docker que cumpla con los requisitos de contenedores personalizados. En esta sección, se describe cómo crear la imagen del contenedor y enviarla a Artifact Registry.

Descarga artefactos de modelo

Los artefactos de modelo son archivos que crea el entrenamiento de AA que puedes usar para entregar predicciones. Contienen, como mínimo, la estructura y los pesos de tu modelo de AA entrenado. El formato de los artefactos del modelo depende del marco de trabajo de AA que uses para el entrenamiento.

Para este instructivo, en lugar de entrenar desde cero, descarga artefactos de modelo de ejemplo que proporciona TorchServe.

Para clonar el repositorio de TorchServe y navegar al directorio con los artefactos del modelo, ejecuta los siguientes comandos en tu shell:

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

cd serve/examples/image_classifier/mnist

Este directorio contiene tres archivos importantes para compilar en tu imagen de contenedor:

  • mnist.py: Define la estructura de la red neuronal entrenada
  • mnist_cnn.pt: Contiene un state_dict con pesos de atributos y otros resultados del entrenamiento
  • mnist_handler.py: extiende la forma en que TorchServe administra las solicitudes de predicción.

Crea un repositorio de Artifact Registry

Crea un repositorio de Artifact Registry para almacenar la imagen de contenedor que crearás en la próxima sección. Ejecute el siguiente comando en su shell:

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

Reemplaza REGION por la región en la que deseas que Artifact Registry almacene tu imagen de contenedor. Más adelante, debes crear un recurso de modelo de AI Platform Prediction en un extremo regional que coincida con esta región, por lo que debes elegir una región en la que AI Platform Prediction tenga un extremo regional, por ejemplo, us-central1.

Después de completar la operación, este comando imprime la siguiente entrada:

Created repository [getting-started-pytorch].

Compila la imagen del contenedor

TorchServe proporciona un Dockerfile para compilar una imagen de contenedor que ejecuta TorchServe. Sin embargo, en lugar de usar este Dockerfile para instalar todas las dependencias de TorchServe, puedes acelerar el proceso de compilación si derivas tu imagen de contenedor desde una de las imágenes de TorchServe que el equipo de TorchServe envió a Docker Hub.

  1. En el directorio con los artefactos del modelo, ejecuta el siguiente comando en tu shell para crear un Dockerfile nuevo:

    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
    

    Estas instrucciones de Docker realizan las siguientes acciones:

    • La instrucción FROM deriva la imagen del contenedor actual a partir de una imagen de TorchServe existente.

    • La instrucción COPY copia los artefactos del modelo y el controlador de predicciones de tu directorio local en el directorio /home/model-server/ de la imagen de contenedor.

    • La primera instrucción RUN edita el archivo de configuración de la imagen superior para admitir el formato de entrada preferido de AI Platform Prediction para las predicciones.

      Específicamente, esta instrucción configura TorchServe para que espere un archivo JSON servicio sobre para las solicitudes de predicción.

      Para editar este archivo de configuración, se requiere un permiso que el usuario model-server (que se creó en la imagen superior) no tiene. Las instrucciones indican a Docker que se ejecute como el usuario root para editar el archivo de configuración y, luego, continúa con el usuario model-server para las siguientes instrucciones.

    • La segunda instrucción RUN usa el archivador de modelos de PyTorch, que ya está instalado en la imagen del contenedor, para crear un archivo de modelo a partir de los archivos que copiaste en la imagen. Guarda este archivo de modelo en el directorio /home/model-server/model-store/ con el nombre de archivo mnist.mar.

      Si deseas modificar la imagen del contenedor, por ejemplo, para realizar un procesamiento previo o un procesamiento posterior personalizado en el controlador de solicitudes, puedes usar instrucciones RUN adicionales a fin de instalar dependencias.

    • La instrucción CMD inicia el servidor HTTP TorchServe. Hace referencia al archivo de configuración de la imagen superior y permite la entrega para un modelo llamado mnist. Este modelo carga el archivo mnist.mar creado por la instrucción RUN.

      Esta instrucción anula la instrucción CMD de la imagen superior. Es importante anular la instrucción CMD y no la instrucción ENTRYPOINT, porque la secuencia de comandos ENTRYPOINT de la imagen superior ejecuta el comando que se pasa en CMD y también agrega lógica adicional para evitar que Docker salga.

  2. Para compilar la imagen del contenedor en función de tu nuevo Dockerfile y etiquetarla con un nombre compatible con tu repositorio de Artifact Registry, ejecuta el siguiente comando en tu shell:

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

    Reemplaza lo siguiente:

    • REGION: la región de tu repositorio de Artifact Registry, como se especifica en una sección anterior
    • PROJECT_ID: el ID del proyecto de Google Cloud

    El comando puede ejecutarse durante varios minutos.

Ejecuta el contenedor de forma local (opcional)

Antes de enviar tu imagen de contenedor a Artifact Registry para usarla con AI Platform Prediction, puedes ejecutarla como un contenedor en tu entorno local a fin de verificar que el servidor funcione como se esperaba:

  1. Para ejecutar la imagen del contenedor como un contenedor de forma local, ejecuta el siguiente comando en la shell:

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

    Reemplaza lo siguiente, tal como lo hiciste en la sección anterior:

    • REGION: la región de tu repositorio de Artifact Registry, como se especifica en una sección anterior
    • PROJECT_ID: el ID del proyecto de Google Cloud

    Este comando ejecuta un contenedor en modo desconectado, asignando el puerto 8080 del contenedor al puerto 8080 del entorno local. (La imagen superior, de la cual derivaste tu imagen de contenedor, configura TorchServe para usar el puerto 8080).

  2. Para enviar una verificación de estado al servidor del contenedor, ejecuta el siguiente comando en tu shell:

    curl localhost:8080/ping
    

    Si se ejecuta de forma correcta, el servidor mostrará la siguiente respuesta:

    {
      "status": "Healthy"
    }
    
  3. Para enviar una solicitud de predicción al servidor del contenedor, ejecuta los siguientes comandos en la 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
    

    Esta solicitud usa una de las imágenes de prueba incluidas en el ejemplo de TorchServe.

    Si se ejecuta de forma correcta, el servidor mostrará la siguiente predicción:

    {"predictions": [3]}
    
  4. Para detener el contenedor, ejecuta el siguiente comando en la shell:

    docker stop local_mnist
    

Envía la imagen del contenedor a Artifact Registry

Configurar Docker para acceder a Artifact Registry Luego, envía tu imagen de contenedor a tu repositorio de Artifact Registry.

  1. Si deseas permitir que tu instalación local de Docker se envíe a Artifact Registry en la región que seleccionaste, ejecuta el siguiente comando en tu shell:

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

    Reemplaza REGION por la región en la que creaste tu repositorio en una sección anterior.

  2. Para enviar la imagen de contenedor que acabas de compilar a Artifact Registry, ejecuta el siguiente comando en tu shell:

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

    Reemplaza lo siguiente, tal como lo hiciste en la sección anterior:

    • REGION: la región de tu repositorio de Artifact Registry, como se especifica en una sección anterior
    • PROJECT_ID: el ID del proyecto de Google Cloud

Implementa el contenedor

En esta sección, se explica cómo crear un modelo y una versión del modelo en AI Platform Prediction para entregar predicciones. La versión del modelo ejecuta tu imagen de contenedor como un contenedor para entregar predicciones.

En este instructivo, se proporcionan opciones de configuración específicas para usar cuando creas tu modelo y la versión del modelo. Si deseas obtener más información sobre las diferentes opciones de configuración, consulta Implementa modelos.

Crea un modelo

Para crear un recurso del modelo, ejecuta el siguiente comando en la shell:

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

Reemplaza REGION por la misma región en la que creaste tu repositorio de Artifact Registry en una sección anterior.

Cómo crear una versión del modelo

Para crear un recurso de versión del modelo, ejecuta el siguiente comando en la 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

Reemplaza lo siguiente:

  • REGION: la región en la que creaste tu repositorio de Artifact Registry y el modelo de AI Prediction en las secciones anteriores
  • PROJECT_ID: el ID del proyecto de Google Cloud

Las marcas relacionadas con el contenedor en este comando hacen lo siguiente:

Obtén una predicción

Los archivos de ejemplo de TorchServe que descargaste en una sección anterior incluyen imágenes de prueba. La configuración de TorchServe del contenedor espera recibir solicitudes de predicción en formato JSON, con la imagen como una string codificada en base64 en el campo data.b64 de cada instancia.

Por ejemplo, para clasificar test_data/3.png, ejecuta los siguientes comandos en tu 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

Reemplaza lo siguiente:

  • REGION: la región en la que creaste tu modelo de AI Platform Prediction una sección anterior
  • PROJECT_ID: el ID del proyecto de Google Cloud

Si se ejecuta de forma correcta, la versión del modelo mostrará la siguiente predicción:

{"predictions": [3]}

Realice una limpieza

Para evitar incurrir en más cargos de AI Platform Prediction y cargos de Artifact Registry, borra los recursos de Google Cloud que creaste durante este instructivo:

  1. Para borrar la versión de tu modelo, ejecuta el siguiente comando en tu shell:

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

    Reemplaza REGION por la región en la que creaste tu modelo en una sección anterior.

  2. Para borrar tu modelo, ejecuta el siguiente comando en tu shell:

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

    Reemplaza REGION por la región en la que creaste tu modelo en una sección anterior.

  3. Para borrar tu repositorio de Artifact Registry y la imagen del contenedor que contiene, ejecuta el siguiente comando en tu shell:

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

    Reemplaza REGION por la región en la que creaste tu repositorio de Artifact Registry en una sección anterior.

¿Qué sigue?

  • Si quieres diseñar tu propia imagen de contenedor, ya sea desde cero o a partir de una imagen de contenedor de terceros existente, consulta la página Requisitos de contenedores personalizados.

  • Obtén más información sobre cómo usar un contenedor personalizado para la predicción, incluida la compatibilidad con otras funciones de AI Platform Prediction y las opciones de configuración que puedes especificar para tu contenedor durante la implementación.