Tu propio Servicio de Machine Learning

Dale vida a tu IA

Ya tienes tu modelo, probado, funciona bastante bien y está listo para entrar en la acción. Entonces, ¿cómo lo desplegamos? Si es una solución que quieres ofrecer al público desde la nube, puedes implementar tu propio servicio online y ofrecer soluciones de Machine Learning!

Veamos cómo hacerlo!

Implementar modelos de Machine Learning

Muchas veces el modelo creado por el equipo de Machine Learning, será una «pieza más» de un sistema mayor, como por ejemplo una app, un chatbot, algún sistema de marketing, un sistema de monitoreo de seguridad. Y si bien el modelo puede correr por lo general en Python o R, es probable que interactúe con otro stack distinto de desarrollo. Por ejemplo, una app Android en Java o Kotlin, algún sistema PHP, en la nube ó hasta podría ser aplicaciones de escritorio o CRM . Entonces, nuestro modelo deberá ser capaz de interactuar y «servir» a los pedidos de esas otras herramientas.

Como opciones, podríamos reescribir nuestro código en otro lenguaje (javascript, java, c…) ó si nuestro proceso ejecutara batch, podría ser una «tarea cron» del sistema operativo que ejecute automáticamente cada X tiempo y deje por ejemplo un archivo de salida CSV (ó entradas en una base de datos).

Pero, si nuestro modelo tiene que servir a otros sistemas en tiempo real y no podemos reescribirlo (incluso por temas de mantenimiento futuro, actualización ó imposibilidad de recrear módulos completos de Python) podemos desplegar nuestro modelo en una API accesible desde un servidor (que podría ser público ó privado) y mediante una clave secreta -si hiciera falta-.

Servir mediante una API

Una API es la manera más popular que hay para ofrecer servicios online en la actualidad. Sin meterme en profundidad en el tema, podemos decir que lo que hacemos es publicar un punto de entrada desde donde los usuarios (clientes, apps, u otras máquinas) harán peticiones de consulta, inserción, actualización o borrado de los datos a los que tienen acceso. En nuestro caso, lo típico será ofrecer un servicio de Machine Learning de predicción ó clasificación (por nombrar alguno). Entonces nos llegarán en la petición GET ó POST las entradas que tendrá el modelo (nuestras features, ó lo que normalmente son las «columnas» de un csv que usamos para entrenar). Y nuestra salida podría ser según el caso, el resultado de la predicción, ó una probabilidad, ó un número (por ej. «cantidad de ventas pronosticadas para ese día»).

Para crear una API, podemos utilizar diversas infraestructuras ya existentes en el mercado que ofrecen Google, Amazon, Microsoft (u otros) ó podemos «levantar» nuestro propio servicio con Flask. Flask es un web framework en Python que simplifica la manera de publicar nuestra propia API (Hay otros como Django, Falcon y más).

Instalar Flask

Veamos rápidamente como instalar y dejar montado Flask.

  • Instalar Anaconda en el servidor ó en nuestra máquina local para desarrollo. (Para servidores también puedes usar la versión de mini-conda)
  • Prueba ejecutar el comando «conda» en el terminal para verificar que esté todo ok.
  • Crear un nuevo environment en el que trabajaremos conda create --name mi_ambiente python=3.6
  • Activa el ambiente creado con source activate mi_ambiente
  • Instalar los paquetes Python que utilizaremos: pip install flask gunicorn

Hagamos un «Hello world» con Flask. Crea un archivo de texto nuevo llamado «mi_server.py«

Guarda el archivo y escribe en la terminal:

una vez iniciado, verás algo así:

Entonces abre tu navegador web favorito y entra en la ruta http://localhost:8000/users/juan

Con eso ya tenemos nuestro servidor ejecutando. En breve haremos cambios para poder servir nuestro modelo de Machine Learning desde Flask al mundo 🙂

Crear el modelo de ML

Hagamos un ejemplo de un modelo de ML basándonos en el ejercicio de Pronóstico de Series Temporales que hace un pronóstico de ventas con redes neuronales con Embeddings. Esta vez no usaremos una notebook de Jupyter, si no, archivos de «texto plano» Python:

Ya logramos entrenar un nuevo modelo del que estamos conformes. Ahora veamos como guardarlo para poder reutilizarlo en la API!

Guardar el modelo; Serialización de objetos en Python

El proceso de serialización consiste en poder transformar nuestro modelo en ceros y unos que puedan ser almacenados en un archivo y que luego, al momento de la carga vuelva a regenerar ese mismo objeto, con sus características.

Aunque existen diversas maneras de guardar los modelos, comentemos rápidamente las que usaremos:

  • Pickle de Python para almacenar objetos (en nuestro caso un Transformador que debemos mantener para «reconvertir los resultados escalados» al finalizar de entrenar)
  • h5py para el modelo Keras (podemos guardar el modelo completo ó los pesos asociados a la red)

Podemos comprobar a ver las predicciones sobre el set de validación antes y después de guardar los objetos y veremos que da los mismos resultados.

Crear una API con Flask

Ahora veamos el código con el que crearemos la API y donde incorporaremos nuestro modelo.

Utilizaremos los siguientes archivos:

Vamos a la acción:

  • Crearemos un método inicial que será invocado desde la url «predict»
  • Cargaremos el modelo que entrenamos previamente
  • Responderemos peticiones en formato JSON

Muy bien, podemos ejecutar nuestra API desde la terminal para testear con:

Y ahora hagamos una petición para probar nuestra API con un archivo Python y veamos la salida:

Este ejemplo nos devuelve de salida:

Actualizar el modelo (según sea necesario!)

No olvidar que si nuestro modelo es dependiente del tiempo, ó de datos históricos, ó datos nuevos que vamos recopilando (nuevas muestras) deberemos reentrenar el modelo.

Eso se podría automatizar, re-ejecutando el archivo de entrenamiento y sobreescribiendo el archivo «h5py» que habíamos generado antes cada X días ó a raíz de otro evento que en nuestro negocio sea significativo y sea el detonador del re-entreno.

Conclusiones

En este artículo vimos que nuestro modelo de ML puede llegar a ser una pequeña pieza de un puzzle mayor y puede ofrecer soluciones a usuarios finales ó a otros subsistemas. Para poder ofrecer sus servicios podemos contar con diversas soluciones, siendo una de ellas el despliegue de una API. Podemos crear una API fácil y rápidamente con el web framework de Flask. Ya puedes ofrecer tus modelos al mundo!

NOTAS finales: Recuerda ejecutar los archivos en el siguiente orden:

  1. Copia el archivo timeseries.csv con los datos del ejercicio en tu server.
  2. Entrena el modelo y crea los archivos necesarios con python api_train_model.py
  3. Inicia el server desde una terminal con gunicorn como vimos anteriormente.
  4. Ejecuta el archivo de pruebas desde otra terminal con python test_api.py

Déjame tus comentarios y cuéntame qué proyectos Machine Learning te traes entre mano! Saludos.

Unete al Blog!

Recibe los próximos artículos sobre Machine Learning, estrategias, teoría y código Python en tu casilla de correo!

NOTA: algunos usuarios reportaron que el email de confirmación y/o posteriores a la suscripción entraron en su carpeta de SPAM. Te sugiero que revises y recomiendo que agregues nuestro remitente a tus contactos para evitar problemas. Gracias!

Recursos Adicionales

Descarga los archivos creados en este artículo

Otros artículos relacionados en Inglés

13 comments

  1. David Martínez · julio 24

    Hola Juan,

    Como estamos? Estoy haciendo mis cosillas con python con anaconda desde windows y quería publicar mis proyectos como servicio web en un apache en ubuntu y he visto tu post.

    Es correcto que con flask y unicorn puedes publicar un proyecto python a un puerto y una ruta de tu dominio?

    Gracias por la ayuda!

    David

    • Na8 · julio 24

      Hola David, sí, claro, lo puedes desplegar en apache, te dejo un enlace: Flask configuring Apache y en esa misma web tienes la doc oficial de flask

      • David Martínez · julio 24

        Perfecto, miraré a ver que tal… otra pregunta… para hacer NLP es decir leer textos y aplicar deep learning… mi objetivo es crear un robot que hable y para eso necesito que aprenda de libros de textos en diferentes idiomas… y en base a lo aprendido que tenga la capacidad de hablar y razonar… mi otro proyecto, más realizable seguramente, es un reconocimiento de imagen que detecte lo que hay en una imagen y devuelva las etiquetas. Ambos proyectos son posibles con python y flask?

        • Na8 · julio 24

          Hola David, si. Con independencia del modelo que utilices, lo podrás ofrecer mediante una API. De hecho la mayoría de apps que hacen reconocimiento de imágenes complejos (cómo faceapp) realizan los cálculos en server mediante apis

          • David Martínez · julio 24

            Hola Juan,
            Y la API para qué sirve? Como se define una API?
            Gracias,
            David

          • Na8 · julio 29

            Una api es una interface de comunicación entre tu servicio (en este caso de ejemplo, «pronóstico de ventas con ML») y cualquier otro «cliente» interesado. Se utiliza como una manera estándar de brindar servicios. Mediante la API se realiza un «contrato» ente las partes para que puedan consultar los servicios que se ofrecen y participar.

          • David Martínez · julio 30

            Pero hay una representacion global visual de toda la api? O simplemente son un conjunto de servicios publicados?
            Aqui he hecho mi primer proyecto python con flask http://davidmartinezros.com:8000/extract_files
            http://davidmartinezros.com:8000/test
            http://davidmartinezros.com:8000/training

  2. Oscar Riojas · julio 24

    Hola mil gracias por tu aporte muy buen articulo

  3. Cristian Contreras · julio 25

    excelente artículo, felicidades

    • Na8 · julio 29

      Gracias por visitar el blog! Saludos

  4. AnaC · agosto 6

    Hola Juan: He estado trabajando en un clasificador de imágenes sísmicas basado y adaptado de la cnn de tu blog que clasifica deportes. Este un proyecto de titulación a nivel licenciatura. Me encantaría poder compartirlo contigo y referenciar el gran trabajo que haces en el tema de Machine Learning. Al igual que poder intercambiar retroalimentación del mismo. Excelente día, es un gran gusto seguir leyendo tu blog. ¡Saludos desde México!

    • Na8 · agosto 7

      Hola Ana, te he contestado al email. Gracias por escribir, tienes el permiso de usar el material de este blog y te agradecería que aparezca mi nombre y la url del blog. Te felicito por tu trabajo en geología! Saludos y seguimos en contacto

Responder a David Martínez Cancelar respuesta