Desplegar modelo de Machine Learning con FastAPI y Google Cloud

Sergio Rubiano
7 min readMar 21, 2021

--

Una de las etapas más interesantes después de construir un modelo de Machine Learning o Deep Learning es que los usuarios puedan interactuar con el modelo, ya sea por medio de un aplicativo web o móvil, en esta ocasión vamos a ver un caso en particular de como desplegar un modelo de machine learning (regresión lineal) en FastAPI, como bonus también veremos como desplegarlo en un aplicativo web en Google Cloud Platform.

Estas son las etapas que vamos a seguir durante la construcción del modelo y del despliegue.

Etapas:

  1. Conocimiento del problema.
  2. Crear modelo de Machine Learning (Regresión Lineal)
  3. Crear la API que sirve al modelo
  4. Desplegar API en Google Cloud Platform (Cloud Run)

Podrán encontrar el código y funcionalidades en el siguiente repositorio https://github.com/sergio2526/Deploy-ML-FastAPI

1. Conocimiento del problema.

Un estudiante desea conocer cuánto dinero (COP) estaría ganando como desarrollador, según sus años de experiencia en el campo.

Para ello, le daremos solución a este problema por medio de un modelo de ML de regresión lineal.

2. Crear modelo de Machine Learning (Regresión Lineal).

Por fines prácticos no entraremos en detalle de como construir y entrenar el modelo, puede consultar el repositorio donde encontrara el notebook para que lo pueda descargar o mejorar y seguir con el ejemplo.

Contamos con un dataset realmente pequeño, pero para fines prácticos es perfecto, aconsejaría que aumentaras más los registros del dataset y observara como se comportan los resultados.

Dataset :

La siguiente visualización es opcional. (si lo desea, puede saltar al ítem de visualización de los datos de entrenamiento)

Resumen de la visualización:

  • Si la edad de la persona es mayor o igual a 22 años entonces pintaremos su edad de color rojo
  • Si el salario es mayor tendremos un estilo de color azul que nos indica a simple vista cuáles son los salarios más altos.

Visualización de los datos de entrenamiento.

Visualización de los datos de prueba.

Pero, ¿Qué pasa si cuento con 1.5 años de experiencia? ¿Cuánto dinero podría ganar?

Estaría ganando 3.500.000 COP

Exportamos el modelo en un archivo .pickle

pickle.dump(regressor, open('model.pkl','wb'))

En el notebook está explicado el paso a paso para llegar a estos resultados.

3. Crear La API que sirve al modelo.

A Continuación daremos a conocer los diferentes archivos, puedes utilizar el editor de código de su preferencia.

requirements.txt

Librerías que vamos a utilizar con sus respectivas versiones.

Crear un entorno virtual e instalar las librerías, podría instalarlas una por una o todas mediante pip install -r requirements.txt

main.py

Importamos las librerías con sus respectivos módulos.

En una variable llamada model_predict vamos a pasarle la ruta donde se encuentra nuestro model.pkl que es el que contiene nuestro modelo previamente entrenado.

Vamos a crear un método post donde vamos a enviar la solicitud.

Vista previa del archivo main.py

Ejecutamos nuestra aplicación en la consola

uvicorn app.main:app --reload

Si observamos un estado 200, esto nos indicara que todo está funcionando muy bien, ahora nos dirigimos a un navegador web y colocamos http://127.0.0.1:8000/docs.

En el campo age_experience ingresamos el número 1.5 que es equivalente a un año y medio de experiencia.

Podemos notar que ya tenemos una respuesta de nuestro modelo con la predicción de 3.556.500

Felicidades!!!. Creaste un modelo de machine learning y creaste una API que sirve al modelo.

Pero… ¿Y si quiero que esta API la puedan utilizar más personas?, para ello, ahora la desplegaremos en Google Cloud Platform.

4. Desplegar API en Google cloud (Cloud Run).

Uno de los servicios serverles que nos ofrece Google Cloud para desplegar nuestro aplicativo se denomina Cloud Run, si deseas conocer más sobre este servicio, visitar el siguiente enlace https://cloud.google.com/run?hl=es

Vamos a crear nuestra imagen de docker, para ello vamos a brindar dos opciones:

  1. Crear su propia imagen
  2. Obtener la imagen de mi repositorio de dockerhub https://hub.docker.com/r/sergiorubiano25/image-fastapi

Opción 1:

Para crear la imagen necesitamos un archivo llamado Dockerfile, en el cual vamos a brindarle los requerimientos que necesita nuestro aplicativo.

Dockerfile

Tenga presente que vamos a exponer nuestro servicio en el puerto 8000, podrías exponerlo en otro puerto si así lo desea, es importante tener esto presente porque por defecto Cloud Run expone los servicios en el puerto 8080.

Opcion 2:

Obtener la imagen desde dockerhub, la imagen es pública, así que no tendría ningún inconveniente en hacer pull de la imagen.

docker pull sergiorubiano25/image-fastapi:1.0

Google Cloud.

Abrimos la consola de Gloud Shell y hacemos pull de la imagen que se encuentra en dockerhub.

docker pull sergiorubiano25/image-fastapi:1.0

Si todo sale bien deberíamos ver la siguiente salida.

Verificamos si se obtuvo la imagen

Publique.

Para enviar imágenes a su registro privado alojado en gcr, debe etiquetar las imágenes con el nombre de un registro. El formato es [hostname]/[project-id]/[image]:[tag].

Para gcr:

  • [hostname]= gcr.io
  • [project-id]= el ID de su proyecto
  • [image]= el nombre de su imagen
  • [tag]= cualquier etiqueta en string que elija. Si no se especifica, el valor predeterminado es "latest".

Ejecutamos:

docker tag sergiorubiano25/image-fastapi:1.0 gcr.io/[project-id]/sergiorubiano25/image-fastapi:1.0

Observamos si se hizo tag de la imagen.

Envíe esta imagen a gcr. Recuerde reemplazar [project-id]

docker push gcr.io/[project-id]/sergiorubiano25/image-fastapi:1.0 

Resultado del comando (el suyo puede variar):

Para verificar que la imagen existe en gcr, visite el registro de la imagen en su navegador web. Puede navegar a través de la consola a Herramientas > Container Registry . Debería llegar a una página similar

Cloud Run.

Nos dirigimos al servicio de Cloud Run y creamos un nuevo servicio con el nombre fastapi-ml

Damos clic en siguiente y configuramos dos aspectos importantes

  • Buscamos la URL de la imagen del contenedor
  • Por defecto obtenemos el puerto 8080, lo cambiamos al puerto 8000 que fue el puerto que asignamos en la configuración del Dockerfile.

Por último, configuramos la forma en como se va a activar nuestro servicio, para ello, damos clic en permitir invocaciones sin autenticar.

Clic en crear.

Luego que se crea el servicio, nos entregara una URL, le damos clic a la URL.

A la URL le agregamos /docs

Por ejemplo:

https://fastapi-ml-iqvzz6qhla-uc.a.run.app/docs

En el campo age_experience ingresamos el número 1.5 que es equivalente a un año y medio de experiencia.

Predicción de salario:

Utilizando Postman

Felicitaciones.

  • Creo un modelo de Machine Learning.
  • Creo la API que sirve al modelo.
  • Desplegó la API en Google Cloud Platform.

Muchas gracias por llegar al final de este blog, comenta si te gusto o compártelo con algún colega. 🤗

¿Está listo para ir más lejos? 🚀

--

--