Serviciado de modelos desde línea de comandos

El último paso para un proceso de ML es el despliegue y servicio de un modelo, con el fin de poder consumirlo desde diferentes aplicaciones o procesos. Una de las mejores formas de usar estos modelos en modo interactivo o incluso por un proceso batch es a traves de un API Rest, con este sencillo protocolo podremos implementar aplicaciones o procesos que usen este estandar para usar el modelo de forma muy sencilla.

Existe la posibilidad de crear tu propio servidor con tu propia lógica, pero esto sería un proceso complejo debido a la necesidad de tener en cuenta de todas las dependencias del modelo en si, exponerlo como un endpoint, seguridad y muchas otras cosas. También, este proceso será indenpendiente modelo a modelo con lo que dificulta su escalabilidad.

Con el manager de modelos, puedes usar un repositorio centralizado con mlflow y el concepto de proyecto con la configuración del modelo y todas las dependencias (dadas por un entorno de conda definido en un .yml) con el objetivo de contruir una aplicación encapsulada con todo lo necesario para exponer el modelo y ejecutarlo, aceptando llamadas vía API Rest y usar el modelo para predecir algún resultado.

Puedes usar el comando de mlflow (previamente habiendo declarado la variable de entorno MLFLOW_TRACKING_URI apuntando a un entorno de plataforma con el manager de modelos activado y teniendo instaladas las dependencias pertinentes) para crear un servidor de forma sencilla basado en Gunicorn:

export MLFLOW_TRACKING_URI=https://moonwalker.onesaitplatform.com/controlpanel/modelsmanager

pip install mlflow mlflow-onesaitplatform-plugin

Y el comando en si mismo para lanzar el servidor:

mlflow models serve -m runs:/{runid}/model

El run id está en la sección de experimentos:

Esto expondrá el servidor gunicorn en el puerto 5000 aceptando peticiones REST para hacer predicciones

Se usa el formato “panda split” (especificado en la cabecera) con lo que podemos enviar datos en este formado

Construcción de una imagen de docker con el manager de modelos

Esta es una forma más avanzada que nos permite construir una imagen de docker autocontenida con todo lo necesario para ejecutar y exponer el modelo, con lo que podemos usar la misma para exponerlo dentro de un caas como un endpoint consumible de forma pública incluso.

El comando es muy sencilla:

mlflow models build-docker -m "runs:/{runid}/model" -n "{docker image name}"

Y después, arrancar la imagen de docker por línea de comando (se expone desde dentro el puerto 8080)

Con esto podremos usar el puerto 5005 para enviar peticiones al contenedor generado y ver los resultado de forma inmediata