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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Artifact Registry API APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the AI Platform Training & Prediction and Artifact Registry API APIs.
-
In the Google Cloud console, 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:
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 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 entrenadamnist_cnn.pt
: Contiene unstate_dict
con pesos de atributos y otros resultados del entrenamientomnist_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.
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.En particular, esta instrucción configura TorchServe para esperar un sobre de servicio JSON 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 usuarioroot
para editar el archivo de configuración y, luego, continúa con el usuariomodel-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 archivomnist.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 llamadomnist
. Este modelo carga el archivomnist.mar
creado por la instrucciónRUN
.Esta instrucción anula la instrucción
CMD
de la imagen superior. Es importante anular la instrucciónCMD
y no la instrucciónENTRYPOINT
, porque la secuencia de comandosENTRYPOINT
de la imagen superior ejecuta el comando que se pasa enCMD
y también agrega lógica adicional para evitar que Docker salga.
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:
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 puerto8080
del entorno local. (La imagen superior, de la cual derivaste tu imagen de contenedor, configura TorchServe para usar el puerto8080
).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" }
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]}
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.
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.
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:
--image
: El URI de la imagen de contenedor.--ports
: El puerto en el que el servidor HTTP de tu contenedor escucha las solicitudes. La imagen superior, desde la cual derivaste tu imagen de contenedor, configura TorchServe para usar el puerto8080
.--health-route
: La ruta en la que el servidor HTTP de tu contenedor escucha las verificaciones de estado. TorchServe siempre detecta verificaciones de estado en la ruta/ping
.--predict-route
: La ruta de acceso en la que el servidor HTTP de tu contenedor escucha las solicitudes de predicción. TorchServe siempre escucha las solicitudes de predicción en la ruta de acceso/predictions/MODEL
.MODEL es el nombre del modelo que especificaste cuando iniciaste TorchServe. En este caso, el nombre es
mnist
, que se configuró en esta instrucción de Docker a partir de una sección anterior:CMD ["torchserve", \ "--start", \ "--ts-config=/home/model-server/config.properties", \ "--models", \ "mnist=mnist.mar"]
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:
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.
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.
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.