BentoML es un framework para servir, gestionar y desplegar modelos Machine Learning.
El objetivo de BentoML es simplificar el gap entre el equipo de Data Scientists (desarrollo de modelos) y DevOps (despliegue de modelos) y permitir a los equipos publicar servicios de predicción de una forma sencilla y escalable.
Entre sus principales características tenemos:
- Capacidad para empaquetar modelos entrenados con cualquier framework ML/IA y servirlos en producción
- Despliegue de los modelos como APIs REST
- Modelo de APIs de alto performance con soporte para micro-batchs
- Hub central para gestionar los modelos
- Despliegue a través de UI web y APIs
- Diseño modular y flexible adaptable a diferentes infraestructuras (Kubernetes, AWS Lambda, Azure Functions, Heroku,…)
Conceptos principales
El objetivo principal de BentoML es que el equipo Data Scientist sea capaz de ejecutar sus modelos de una manera que sea fácil de probar, de desplegar y de integrar. Y para esto, BentoML ofrece a los científicos de datos herramientas que les ayuden a construir y servir modelos de predicción, en lugar de hacerlo manualmente.
bentoml.BentoService es la clase base para construir servicios de predicción utilizando BentoML.
Veamos un ejemplo sencillo:
Cada clase BentoService puede contener múltiples modelos declarados a través de la API @bentoml.artifact, y múltiples APIs para acceder a este servicio.
Cada definición de API requiere un tipo InputAdapter, que define el formato de datos de entrada esperado para esta API. BentoML proporciona adaptadores de entrada que cubren la mayoría de los casos de uso del servicio de modelos, incluyendo DataframeInput, TfTensorInput, ImageInput y JsonInput.
Una vez entrenado un modelo ML, una instancia de BentoService puede empaquetar el modelo entrenado con el método BentoService#pack. Este modelo entrenado es entonces accesible dentro del código de la función API a través de self.artifacts.ARTIFACT_NAME. En el ejemplo, el artefacto se inicializa con el nombre "model", por lo que el código del usuario puede acceder al modelo a través de self.artifacts.model.
La instancia de BentoService está ahora lista para ser utilizada para la inferencia. Pero además BentoML resuelve el problema de guardar todo el BentoService en el disco, distribuir el archivo guardado y reproducir exactamente el mismo servicio de predicción en el entorno de pruebas y de producción.
Para guardar la instancia de BentoService, basta con llamar al método BentoService#save. En este proceso, BentoML
- Guarda el modelo basado en el marco de entrenamiento ML y el tipo de artefacto utilizado
- Extrae automáticamente todas las dependencias pip requeridas por su clase BentoService y las pone en un archivo requirements.txt
- Guarda todas las dependencias locales de código python
- Coloca todos los archivos generados en un directorio de archivos, que, por defecto, es una ubicación gestionada por BentoML
El directorio de archivos BentoService guardado se llama Bento y es un directorio de archivos versionados que contiene toda la información necesaria para ejecutar este servicio de predicción.
Así que Bento me ofrece una modelo ejecutable para cada modelo ML, se puede generar un Bento al final de cada trabajo de entrenamiento, reflejando los cambios más recientes en el código y en los datos de entrenamiento.
A continuación, se puede almacenar y distribuir fácilmente el archivo Bento, probar el servicio de predicción y, a continuación, actualizarlo al punto final de servicio del modelo de producción.
BentoML realiza un seguimiento de todos los servicios guardados y proporciona una interfaz web y comandos CLI para la gestión del modelo.
En el UI de BentoML puedo gestionar mis modelos:
Por defecto, BentoML guarda todos los archivos y metadatos del modelo en el sistema de archivos local, aunque se recomienda ejecutar un servidor BentoML compartido para todo el equipo, que almacena todos sus archivos, esto permite a su equipo de ML compartir, encontrar y utilizar fácilmente los modelos de otros y los endpoints donde se sirven los modelos.