¿Cómo publicar un Modelo como Microservicio (Model as a Service - MaaS)?

¿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

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.