Machine Learning Model Serving con FastAPI y Streamlit
El objetivo de este Post es dar a conocer la forma de “prototipar” un servicio de machine learning o deep learning desplegado en un servidor de desarrollo, accesible a los desarrolladores para testear los modelos implementados.
El prototipo consta de:
- Una interfaz de usuario (UI) para que dichos usuarios puedan interactuar con el servicio.
- El servicio backend con documentación API, de modo que pueda procesar múltiples solicitudes y pasarse a producción e integrarse con otras aplicaciones de manera robusta y escalable.
Puede encontrar el repositorio de GitHub del proyecto en el siguiente enlace:
Además se ha preparado un despliegue en DigitalOcean de todos los servicios sin inferencia del modelo:
Con acceso a la documentación de FastAPI:
Referencias obtenidas a partir del artículo Machine learning model serving in Python using FastAPI and streamlit de Davide Fiocco.
FastAPI como Backend
FastAPI es un web framework moderno y rápido (de alto rendimiento) para construir APIs con Python 3.6+ basado en las anotaciones de tipos estándar de Python.
Sus características principales son:
- Rapidez: Alto rendimiento, a la par con NodeJS y Go (gracias a Starlette y Pydantic). Uno de los frameworks de Python más rápidos.
- Rápido de programar: Incrementa la velocidad de desarrollo entre 200% y 300%.
- Menos errores: Reduce los errores humanos (de programador) aproximadamente un 40%.
- Intuitivo: Gran soporte en los editores con auto completado en todas partes. Gasta menos tiempo debugging.
- Fácil: Está diseñado para ser fácil de usar y aprender. Gastando menos tiempo leyendo documentación.
- Corto: Minimiza la duplicación de código. Múltiples funcionalidades con cada declaración de parámetros. Menos errores.
- Robusto: Crea código listo para producción con documentación automática interactiva.
- Basado en estándares: Basado y totalmente compatible con los estándares abiertos para APIs: OpenAPI (conocido previamente como Swagger) y JSON Schema.
FastAPI está ganando popularidad entre los Frameworks de Python. Está completamente documentado, permite codificar API siguiendo las estándares de OpenAPI y se puede usar uvicorn, lo que permite que sea apto para algunos usos de producción. Su sintaxis también es similar a la de Flask, por lo que es fácil cambiar a ella si ha usado Flask antes.
Streamlit como Frontend
Streamlit es una biblioteca de Python de código abierto que facilita la creación y el intercambio de aplicaciones web personalizadas para el aprendizaje automático y la ciencia de datos. A día de hoy Streamlit está ganando terreno, ya que en solo unos minutos puede crear e implementar potentes aplicaciones de datos, pero a día de hoy aún no puede crear REST endpoints en python..
Aplicación Fullstack: BERT — Preguntas y Respuestas
En esta demo se utiliza SQuAD (Stanford Question-Answering Dataset). En SQuAD, una entrada consta de una pregunta y un párrafo para el contexto. El objetivo es encontrar el espacio de texto en el párrafo que responde a la pregunta planteada. Evaluamos nuestro rendimiento en estos datos con la métrica “Exact Match”, que mide el porcentaje de predicciones que coinciden exactamente con cualquiera de las respuestas de verdad.
Para ello utilizamos el Pipeline proporcionado por del modelo [BETO Spanish BERT) + Spanish SQuAD2.0 preentrenado en español.
Implementación del servicio
Como hemos comentado anteriormente, esta aplicación consta de una aplicación con un frontend Streamlit y un backend con FastAPI. Para la implementación de estos servicios se opta por tener dos servicios implementados en dos contenedores Docker, orquestados con docker-compose:
Cada servicio corresponde con una imagen Docker, generada a partir de su fichero Dockerfile.
Servicio Backend FastAPI:
Servicio Frontend `Streamlit`:
El servicio de Streamlit ofrece una interfaz de usuario que llama (request) al punto final expuesto por el servicio de Fastapi, mientras que los elementos de la interfaz de usuario (texto, carga de archivos, botones, visualización de resultados) se declaran con llamadas a Streamlit:
El backend de FastAPI llama a algunos métodos desde un módulo auxiliar model.py (que es responsable de la inferencia del modelo usando el Pipeline de la librería transformers) e implementa un endpoint /qas/ que devuelve la respuesta del modelo:
El modulo model.py quedaria de la siguiente manera:
Despliegue de la Aplicación
La secuencia de comandos start.sh es una secuencia de comandos de shell que nos permitirá ejecutar la construcción del docker-compose.yml, para que los contenedores se ejecuten en modo background.
#!/bin/bash
docker-compose up -d
La primera línea se denomina shebang. Especifica que este es un archivo bash y se ejecutará como comandos. El indicador -d se utiliza para iniciar un contenedor en el modo de demonio, o como proceso en segundo plano.
Para probar la creación de las imagen de Docker y los contenedores a partir de las imágenes resultantes, ejecute:
sudo bash start.sh
Una vez que la secuencia de comandos termine de ejecutarse, utilice el siguiente comando para enumerar todos los contenedores en ejecución:
sudo docker ps
Verá los contenedores en ejecución en ejecución sobre un mismo servicio. Ahora que se está ejecutando, visite la dirección IP pública de su servidor en el puerto especificado de su navegador http://IP:8501. o accediendo desde su dominio personal http://your-domain:8501.
Ahora ya puede visitar la aplicación en http://your-domain:8501 desde un navegador externo al servidor para ver la aplicación en ejecución:
También puede acceder a la documentación de FastAPI desde la url http://your-domain:8008/docs
Si quieres conocer más sobre mí, visita: