Llevando los modelos de Machine Learning a Producción

Bootcamp AI
8 min readOct 13, 2020

Kubernetes es un sistema de orquestación de contenedores de nivel de producción, que automatiza la implementación, el escalado y la administración de aplicaciones en contenedores. El proyecto es de código abierto y se ha probado en batalla con aplicaciones de misión crítica que ejecuta Google.

Las soluciones de aprendizaje automático a menudo se dividen en muchos pasos que pueden ser independientes del sistema operativo y del marco. Además, es común que los proyectos de ciencia de datos sigan el paradigma de programación de flujo de datos, donde un programa se diseña como un gráfico dirigido con datos que se mueven de una operación a la siguiente. Estas metodologías y abstracciones se implementan fácilmente con Kubernetes, dejando la carga de administración de la infraestructura en el sistema.

En esta historia, implementaremos un servicio web de clasificador de imágenes simple en Kubernetes. Trabajaremos en Google Cloud Platform (GCP) y aprovecharemos su oferta de servicio de Kubernetes segura y administrada: GKE. Primero usaremos Terraform para aprovisionar y administrar la infraestructura necesaria y luego crearemos una implementación simple de un modelo PyTorch previamente entrenado . Dejanos empezar.

Infraestructura como código

Para construir la infraestructura necesaria usaremos Terraform. Terraform trata la infraestructura como un código para aprovisionar y administrar cualquier nube, infraestructura o servicio. Terraform nos facilitará crear los recursos que necesitamos y limpiar después de nosotros mismos cuando hayamos terminado, para evitar la acumulación de costos. Para instalar Terraform, siga las instrucciones para su plataforma .

Preliminares

Para trabajar en GCP, primero necesitamos crear un recurso de proyecto. El recurso del proyecto es una entidad de organización lógica que forma la base para crear, habilitar y usar otros servicios de Google Cloud, entre otros. Es necesario comenzar a trabajar en GCP y es fácil construir uno o usar el proyecto predeterminado inicializado con cualquier nueva cuenta de GCP.

Para crear uno nuevo, desde el panel lateral vaya a IAM & Adminy elija Manage Resourcesen la parte inferior. Presiona el Create Projectbotón, da un nombre y listo.

El siguiente paso es crear una cuenta de servicio que terraform utilizará para crear los recursos que necesitamos. Una cuenta de servicio es un tipo especial de cuenta que utiliza una aplicación, no una persona. Asegúrese de que está utilizando el proyecto que creó, vuelva a la IAM & Adminopción y elija Service Accounts. Cree uno nuevo presionando el botón Create Service Account, asígnele un nombre terraformy presione crear. En el siguiente paso, amplíe la función de la cuenta de servicio Project Editory presione continuar. Finalmente, genere una clave JSON presionando el Create Keybotón. Esta clave será el método de autenticación de Terraform.

Configuración de terraform

Primero, necesitamos configurar Terraform para usar un depósito de Google Storage para almacenar los metadatos que necesita. Esta es una excelente manera de mantener Terraform funcionando en un entorno automatizado. Primero, creemos el cubo; crea un nuevo archivo llamado main.tf:

Luego, necesitamos crear un nuevo archivo para las variables que usa. Cree ese archivo y asígnele un nombre variables.tf:

Este archivo le dice a Terraform qué variables esperar y proporciona algunos valores predeterminados. Por ejemplo, la locationvariable en nuestro primer script ahora tiene un valor predeterminado que es US. Hay otras variables, como el project_id, que necesitamos para aportar el valor nosotros mismos. Para ello, creamos un nuevo terraform.tfvarsarchivo:

Asegúrese de llenar el terraform.tfvarsarchivo con la información necesaria y luego ejecute terraform initseguido de terraform apply. Finalmente, vaya a la consola de GCP para verificar que el depósito esté allí.

Terraforma tu clúster de GKE

Ahora estamos listos para escindir nuestro clúster de Kubernetes. Crearemos tres archivos separados en un nuevo directorio: uno para definir el backend de Terraform, uno para el proveedor de la nube y otro para el clúster real. Por supuesto, necesitaremos dos archivos adicionales para las variables. Configuremos el backend. Cree un terraform.tfarchivo y copie lo siguiente dentro:

Asegúrese de proporcionar el nombre del depósito que creó antes. Luego, cree un provider.tfarchivo para el proveedor de la nube:

Finalmente, crea un main.tfarchivo para configurar el clúster de GKE que queremos. Para este ejemplo, lo mantendremos al mínimo.

Sin embargo, una cosa que cambiaremos es eliminar el grupo de nodos predeterminado y crear uno propio, donde usamos n1-standard-1máquinas interrumpibles. Por último, crear las variables.tfy los terraform.tfvarsarchivos, para proporcionar las variables necesarias.

Y el terraform.tfvarsarchivo:

Establecer la ubicación en un formato de zona creará un clúster zonal. Google ofrece un clúster zonal gratuito por cuenta de facturación, por lo que aprovecharemos ese descuento. Como antes, ejecute terraform inity terraform applyespere unos minutos y su clúster estará listo para funcionar.

Clasificador de imágenes

Para este ejemplo, usamos un modelo de PyTorch previamente entrenado y un Flask para crear un servicio web de aprendizaje automático simple. A continuación, crearemos una implementación de Kubernetes simple para implementar, administrar y escalar el servicio web.

PyTorch + Matraz

Para diseñar un servicio de clasificador de imágenes simple, usamos una implementación PyTorch de AlexNet , un modelo de CNN para clasificación de imágenes. Lo servimos usando el micro-framework Flask.

Primero, definimos un Predictrecurso Flask que inicializa el modelo y acepta una HTTP POSTsolicitud. Lo servimos con matraz usando el any-hostidentificador ( 0.0.0.0).

El servidor integrado de Flask no es adecuado para producción ya que no escala bien. Para nuestros propósitos está bien, pero si desea ver cómo implementar una aplicación Flask correctamente, consulte aquí .

Contenerización

Para implementarlo en Kubernetes, primero debemos incluir el servicio en contenedores. Para ello definimos lo siguiente Dockerfile:

Para construir una imagen a partir de esto Dockerfile, cree un requirements.txtarchivo, en la misma carpeta, con el siguiente contenido:

Descarga en la misma carpeta el archivo JSON que contenía las etiquetas de Imagenet aquí . Ahora estamos listos para construir nuestra imagen de Docker; ejecuta el siguiente comando:

Finalmente, debe insertar la imagen en un registro de contenedor. Por ejemplo, para insertarlo en Docker Hub, cree una cuenta, configure Docker y ejecute los siguientes comandos:

Por simplicidad, puedes usar la imagen que preparé para ti. Puede extraerlo de Docker Hub .

Despliegue

El último paso es la implementación. Para eso, usamos un YAMLarchivo de configuración simple . Pero primero, necesitamos instalar kubectly obtener las credenciales para conectarnos a nuestro clúster.

Para instalar, kubectlsiga las instrucciones para su plataforma . A continuación, instale gcloud la herramienta CLI para GCP. Para obtener las credenciales de su clúster de GKE, ejecute el siguiente comando:

Por ejemplo:

Este comando creará un archivo de configuración y le kubectlindicará cómo conectarse con su clúster de GKE. Finalmente, defina el YAMLarchivo de implementación del clasificador de imágenes .

Esta configuración se divide en tres partes: primero, definimos un espacio de nombres que proporciona un alcance para nuestros nombres de recursos. Luego, definimos la implementación real, donde usamos solo una réplica de nuestro servicio. Puede escalar ese número a lo que se adapte a sus necesidades. Finalmente, exponemos nuestro servicio web con un LoadBalancer. Esto hará que nuestro servicio sea accesible desde Internet. Cree la implementación ejecutando el siguiente comando:

Ahora está listo para probar su servicio web de clasificador de imágenes. Para este ejemplo, usamos curl.

Este comando consultará su servicio con una imagen de gatito. Lo que obtienes es la predicción asociada con cierta confianza. ¡Ahora ha implementado con éxito un modelo de aprendizaje automático en Kubernetes!

Limpiar

Para limpiar después de nosotros mismos nos moveremos en orden inverso:

  1. Elimina el espacio de nombres, la implementación y el balanceador de carga:

2. Destruye el grupo:

Ejecute este comando desde la carpeta que creó en el paso “Terraform su clúster de GKE”.

3. Elimina el depósito de almacenamiento de Google:

Ejecute este comando desde la carpeta que creó en el paso “Configuración de Terraform”.

Conclusión

En esta historia, vimos cómo crear recursos con Terraform en GKE. Específicamente, creamos un clúster de GKE para aprovechar la solución de Kubernetes alojada proporcionada por Google Cloud Platform. Luego, creamos un servicio web de clasificación de imágenes simple, creamos una imagen de la ventana acoplable y la implementamos en Kubernetes. Finalmente, limpiamos después de nosotros mismos, destruyendo el recurso que ya no necesitamos para evitar costos adicionales.

Kubernetes es una gran plataforma para implementar modelos de aprendizaje automático para producción. En artículos posteriores, exploraremos Kubeflow; un kit de herramientas de aprendizaje automático para Kubernetes.

Conoce más de Bootcamp AI

www.bootcampai.org

--

--