¿Cómo publicar un Modelo como Microservicio (Model as a Service - MaaS)?
Introducción
En este tutorial vamos a implementar un modelo predictivo como microservicio.
El objetivo de este tutorial es mostrar como implementar este tipo de servicios personalizados.
Siguiendo la arquitectura de MVC, planteamos una clase base ModelService la cual es la base de referencia de los MaaS. es por ello que aconsejamos utilizar esta estructura común.
En este caso, el ejemplo está hecho en python, pero el conector con plataforma está hecho en springboot. Este tipo de implamentación es más compleja pero ofrece a las personas con pocos conocimientos de desarrollo de software, hacer modelos de la forma más sencilla posible. Además, como las funcionalidades de supervisión están en la plaicación springboot común, sólo es necesario centrarse en la producción del modelo.
Marco de Referencia de MaaS
Recomendamos que la clase base Model Service implemente, al menos, los siguientes métodos para tener una interfaz común de MaaS y para conectar con el supervisor.
Method name | Type | Description |
|---|---|---|
save_preprocessor | I/O | Guarda el objecto preprocesador a un archivo |
save_model | I/O | Guarda el objecto modelo a un archivo |
save_labels | I/O | Guarda las etiquetas a un archivo |
transform_in | Transformation | Transforma los datos recibidos por rest a la estrucutra de datos de entrada del modelo |
predict | Prediction | Encapsula la predicción del objeto modelo para tener un método común |
transform_out | Transformation | Transforma los datos resultados del modelo a la estructura de salida de rest. |
Además, es posible implementar funcionalidades personalizadas o sobrescribir las existentes.
El objetivo del método "train" implementado es actualizar los pesos del modelo con nuevos datos actuales, así que debe ser usado sólo para estos propósitos. Si se requieren más cambios o un entrenamiento más complejo, por favor, crear una nueva versión del modelo.
Tener en cuenta que el marco de referencia está en continuo desarrollo, así que es posible que haya cambios en el futuro.
El modelo
En este caso, el modelo corresponse a un modelo de predicción binario que a partir de datos meteorológicos ofrece una respuesta con una clasificación de lluvia o no lluvia.
Como es un ejemplo, se provee de una clase Data Simulator la cual crea datos aleatorios y los envía a una ontología de onesait platform (mediante el DiitalClient, ver la /wiki/spaces/PT/pages/142934056 para más información).
Graphic description
Los pasos principales seguidos desde la creación del modelo hasta el despliegue como microservicio son:
1. Create Microservice Template
El primer paso es crear el microservicio en la plataforma. Esto se realiza en Microservicios > Crear.
Este paso creará un repositorio git con el ejemplo, el cual puedes modificar para implementar tu propio modelo en el marco de referencia con el mínimo esfuerzo.
2. Download template
Desde el repositorio de Git puedes descargar y modificar el ejemplo y hacer todos los cambios deseados.
El proyecto Sptring Boot de encapsulación contiene el proyecto de implementación del modelo (realizado con flask y sklearn en python en este caso). No es necesario cambiar nada el el código de este proyecto, sólo parámetros de configuración de conexiones.
3. Make some changes and push
El proyecto de implementación del modelo (carpeta /source/flask/microservice) dentro del projecto SpringBoot es un proyecto independiente, por lo que pueden ser desarrollados y desplegados de diferente manera, aunque recomendamos que sean el mismo microservicio por el momento.
Como es un servicio REST, puede ser implementado en cualquier lenguaje de programación (Python en este caso).
Desarrollar el modelo y exportarlo a un archivo. El objetivo de este paso es analizar los datos y crear un modelo para ser exportado como archivo (.pickle en este caso), junto con funciones y clases útiles.
Además, si es necesario, es posible crear un archivo de preprocesador (para preprocesamientos generales antes de la predicción). Es importante entender que este preprocesador será utilizado antes de cada predicción (un ejemplo sencillo de esto puede ser un objeto Vectorizador tf/idf en modelos NLP o un objeto Standard Scaler en una regresión o modelos de deep learning).
SI existen etiquetas, exportarlas como archivo.
Este paso puede realizarse en un Notebook, IDLE, etc.
Una vez el modelo, preprocesador y etiquetas (si son necesarias) están exportadas, recomendamos poner los archivos en la carpeta /data de donde serán leídas al comienzo de la aplicación.
En este paso, los métodos comunes deberían ser implementados y las funciones y clases propias deberían establecerse adecuadamente en el proyecto del modelo.
La clase ModelService (/sources/flask/microservice/rest/modelservice.py) encapsula el modelo creado, así que será la clase que implementa la lógica del modelo.
Esta clase es la única que es necesario modificar. Aquí deberían estar implementados los métodos comunes.
Se muestra un ejemplo de algunos:
Funciones comunes de predicción implementadas
@logged
def transform_in(self, in_data: dict):
sorted_cols = ['hPa', 'hum', 'tmp0', 'tmp1']
assert set(sorted_cols) == (set(in_data.keys())), "Invalid input data"
in_array = np.array([in_data[col] for col in sorted_cols]).reshape(1, 4)
return self.preprocessor.transform(in_array)
@logged
def predict(self, X, names = None, meta=None):
return self.model.predict(X)
@logged
def transform_out(self, X):
prediction = int(X[0])
return dict(prediction=prediction, label=self.labels[str(prediction)])
Una vez realizados todos los cambios, push y actualiza el repo de Git.
4. Build microservice
Esto puede tardar varios minutos.
5. Deploy your model and use it!
Una vez el modelo está desplegado, es posible hacer peticiones HTTP a sus endpoints implementados.