Serviciado de Modelos de MLFlow como microservicios Python
Disponible desde la versión 7.0.0
Introducción
El objetivo es generar un nuevo tipo de microservicio para evaluar modelos de MLFlow. Para ello, se comenzará ejecutando un código que, en base a ciertos datos de entrenamiento de un dataset referente a calidades de vino, genera un modelo predictivo.
Además, con el uso de la herramienta del Models Manager (encargada del MLOps en Onesait Platform) se va a poder controlar los diferentes experimentos que se hacen previamente, evaluar resultados, compararlos, etc., creando finalmente un modelo óptimo de predicción de vino que va a permitir determinar la calidad del vino a partir de ciertos datos que se proporcionen.
Este modelo de predicción se registrará en la herramienta de Models Manager, lo cual va a permitir su gobierno, así como acceder al mismo en fases posteriores para poder desplegarlo.
El siguiente paso va a consistir en desarrollar el microservicio desde la Plataforma, que abarca desde la descarga del código hasta su compilación y la generación de la imagen Docker mediante Jenkins, su subida a un registro de imágenes, para luego desplegarla en la plataforma CaaS correspondiente.
Finalmente, a través de la Plataforma en el gestor de APIs, se va generar el API, lo que va a permitir definirla y gestionarla. Se va a poder acceder a la interfaz de Swagger y comprobar el funcionamiento del modelo predictivo directamente desde la Plataforma. Al hacerlo de esta manera, se aprovecha la seguridad que ofrece la Plataforma.
Modelo predictivo en Models Manager
Para llevar a cabo este ejemplo se va a utilizar el MLFlow de «sklearn_elasticnet_wine», el cual se puede obtener desde este repositorio de GitHub:
Se generará el modelo predictivo. En este ejemplo, se aprovechará la herramienta que posee la Plataforma para utilizar el Models Manager desde el entorno local. Para ello, se instalarán los siguientes paquetes de Python necesarios para conectar con el Models Manager:
MLFlow → pip install mlflow
mlflow onesaitplatform plugin (uso de la herramienta de subida de ficheros para trabajar con proyectos de ML) → pip install mlflow-onesaitplatform-plugin
Utilizando el ejemplo de mlflow de «sklearn_elasticnet_wine», los archivos MLproject
y conda.yaml
hay que modificarlos para que se conecte correctamente a la Plataforma.
MLproject: hay que modificar la línea 3 a «conda_env: conda.yaml»:
conda.yaml: hay que modificar el Python a 3.11 y hay que añadir el paquete de mlflow de la Plataforma (mlflow-onesaitplatform-plugin):
Si utilizamos un modelo predictivo propio, es importante utilizar el ‘signature’ (función: infer_signature), para que, una vez generemos el swagger, podamos tener los valores que se esperan y pueda generar el ejemplo, tal como se utiliza en el modelo de «sklearn_elasticnet_wine».
El segundo y último paso será definir el entorno con el que se quiere trabajar de la Plataforma. Esta es la forma de conectar el código local con el servidor de onesaitplatform
:
Usando una variable de entorno llamada
MLFLOW_TRACKING_URI
, la cual tendrá que ser definida a{environment}/controlpanel/modelsmanager
:
C:\Users\smartinroldang\Desktop\MLFlow\examples>set MLFLOW_TRACKING_URI=https://lab.onesaitplatform.com/controlpanel/modelsmanager
Teniendo un proyecto de MLFlow, se lanzará el entrenamiento con el siguiente comando:
mlflow run {folder project} -P {mlflowparams}
mlflow run sklearn_elasticnet_wine -P alpha=0.5
Después, se observará el experimento en el Control Panel y se podrá explorar sus detalles.
También se podrá ver el artefacto del proyecto y el modelo en sí mismo (archivo .pkl).
Creación del microservicio desde la Plataforma
En primer lugar, se accederá al módulo de microservicios desde el menú Lógica > Mis Microservicios.
Se mostrará entonces el listado de microservicios disponibles al usuario. Para crear un nuevo microservicio, se pulsará en el botón de «+» situado en la parte superior derecho.
Se abrirá entonces el asistente de creación de microservicios. Se escogerá en «Microservice Template» la opción de «Models Manager». De esta forma, la Plataforma realiza un clonado de un repositorio base (microservice-modelsmanager), con el que se crea una predicción genérica.
Se terminará de rellenar los datos de la configuración general.
Una vez se selecciona en «Microservice Template» la opción de «Models Manager», aparece una opción de «Experiments», donde aparece los experimentos, y cuando se selecciona el que se desea aparece una tabla con los modelos, donde se va a poder seleccionar el modelo con el que se desea trabajar. En este caso, se seleccionará el que se ha creado anteriormente.
Lo siguiente es seleccionar la configuración del Git que se desea.
A continuación, se rellenará la configuración de Jenkins.
Por último, se completerá la configuración del CaaS:
Una vez que se ha introducido toda la información, se pulsará en el botón «Crear» para generar el microservicio. Se mostrará entonces un mensaje indicando que se ha creado correctamente, y la pantalla volverá al listado de microservicios, donde aparecerá el que se acaba de crear.
Al generar el microservicio, se crean dos elementos:
Repositorio de Git: se genera un repositorio de Git con la plantilla base que se ha seleccionado. Al pulsar en el enlace de «Git URL» desde el listado de microservicios, se redirige y se puede ver el repositorio creado con el nombre que se ha puesto.
Pipeline en Jenkins: se genera un pipeline en Jenkins llamado
name
-pipeline (donde «name» es el nombre indicado). Se podrá acceder al pipeline rápidamente al pulsar en el enlace de «Jenkins URL» desde el listado de los microservicios, lo que redirige y permite ver el pipeline creado con el nombre mencionado.
El siguiente paso es realizar el «Build Service», que crea la imagen. Para ello, se pulsará en el icono del martillo que se encuentra en la sección de CI/CD del listado de microservicios, verificando que los parámetros están correctos y seguidamente se pulsa en «Generate».
Aparece entonces un modal que indica que la petición se ha enviado a la cola de Jenkins.
Al dirigirse a Jenkins y al pipeline correspondiente, se puede comprobar que ha sido exitoso.
Navegando hasta el registry, se observa la imagen que se ha generado.
Una vez hecho esto, se pasa al CaaS donde se quiere realizar el despliegue/servicio. Para ello, se debe ir al Control Panel y, en la sección de CI/CD de nuestro microservicio, se pulsa en el icono del cohete. Esto mostrará una pantalla donde se va a poder ingresar los parámetros que se desea para el despliegue/servicio. Una vez rellenados, se pulsa en el botón de «Deploy».
Si todo va correctamente, saldrá otro modal informando que el microservicio ha sido desplegado.
Navegando al Rancher, se podrá observar que el contenedor esta activo y corriendo correctamente.
En el Control Panel se verá que el «status» ya esta con el tick verde, lo que indica que está activo.
Si se quiere, es posible añadir o modificar los parámetros del microservicio. Al hacer clic en el CI/CD, en «Upgrade» (la flecha hacia arriba), se abre una pantalla en la que se puede añadir nuevos parámetros con el «+» o eliminar parámetros con el «-». Habrá que añadir obligatoriamente el HOST, TOKEN, EXPERIMENTID, RUNID, MODEL_NAME, estos no hacen falta obligatoriamente: API_HOST y API_SCHEME. Después de realizar los cambios en los parámetros, simplemente se pulsa en el botón de «Upgrade» y el microservicio se actualiza.
Generación de la API
Una vez realizados todos los pasos anteriores, se podrá crear la API desde el Control Panel. Para ello, hay dos formas de realizarlo:
Primera forma: podremos insertar ciertas variables a nuestro microservicio, y de esta forma se realizará un «autoregister», creando la API de forma automática. Las variables necesarias para ello son:
APIMANAGER_AUTOREGISTER: Debe igualarse a ‘True’ para que se realice el autoregister.
API_NAME: El nombre que queremos ponerle a nuestra API. Se verificará que no exista ninguna API con ese nombre y versión 1. Si no existe ninguna, se creará la API; si ya existe una API con ese nombre y versión 1, se generará un error.
API_HOST: El host al que queremos que el swagger realice las consultas.
Una vez realizado esto y actualizado el contenedor con las nuevas variables, podremos ir a Lógica > Mis APIs y buscar nuestra API.
Segunda forma: se accederá al menú de Lógica > Mis APIs.
Se mostrará entonces el listado de APIs disponibles al usuario. Para crear un nuevo servicio API, se pulsará en el botón de «+» situado en la parte superior derecho.
En la opción de «API Type», se selecciona la opción «Publish External REST API from Swagger» En la parte derecha, aparece un apartado llamado «Operations», donde se introduce la ruta del archivo swagger.json
en «Swagger JSON URL» y se hace clic en «Load». El archivo JSON se carga en el recuadro negro. Después, se completan los campos requeridos y se hace clic en «Create».
Si todo ha ido correctamente, se mostrará un mensaje avisando de ella, y la pantalla se redirigirá al listado de APIs, donde se podrá encontrar la API recién creada.
Una vez ya tenemos nuestra API, se hace clic en los tres puntos de las opciones de la API y se selecciona la opción de «Swagger», lo que va a permite utilizar el Swagger que se ha creado y el endpoint para nuestra predicción de vino.
Lo primero que se debe hacer es introducir el token de usuario ya que, al haberlo realizado en la Plataforma, se cuenta con la seguridad que ofrece. Para ello, en el candado, se introduce el token del usuario y, de esta manera, se podrá hacer uso del endpoint de /prediction
.
En este ejemplo, se sigue el caso del ejemplo proporcionado, ya que está diseñado específicamente para la predicción del vino.