En idealista llevamos varios años trabajando en mejorar nuestros productos y crear otros nuevos mediante la explotación avanzada de los datos. Con este post iniciamos una serie de artículos en los que queremos compartir lecciones aprendidas en proyectos Data Science que hemos desarrollado tanto para idealista.com/data como para otras verticales de negocio.
Entre las iniciativas que incorporan analítica avanzada podemos destacar: idealista.com/maps donde ofrecemos estimaciones de valoración de cualquier inmueble residencial en España además de indicadores del mercado residencial; idealista.com/energy que permite simular el ahorro que supondría para una comunidad de vecinos la instalación de placas solares en su tejado y el servicio de detección de duplicados que permite a los clientes de idealista.com/tools saber si el inmueble que están subiendo a idealista ya se encuentra en el portal anunciado por un particular u otra agencia.
Estos proyectos conllevan multitud de retos relacionados con la calidad del dato, su gobernanza o la escalabilidad de la propia solución. En el caso de los sistemas de Machine Learning (ML) a estos desafíos hay que añadir muchos otros y que provocan que tan sólo un 22% de las empresas realizando proyectos de ML sean capaces de llevarlos a producción.
Brevísima introducción a Sistemas de ML
Antes de entrar en materia, vamos a revisar brevemente en qué consiste la construcción de sistemas de Machine Learning y en qué se diferencia de un desarrollo tradicional de software. Y antes de continuar nos gustaría aclarar una serie de conceptos que aparecerán de forma recurrente en esta publicación y posteriores:
- Algoritmo, en matemáticas y ciencias de la computación, es una secuencia finita de instrucciones bien definidas que se pueden implementar en una computadora, típicamente para resolver una clase de problemas o realizar un cálculo. En nuestro dominio, normalmente lo referimos al algoritmo utilizado para construir un modelo de ML.
- Modelo, es un constructo o programa que representa el comportamiento de un sistema, por ejemplo una función que nos diga cuánto se parece una foto de un anuncio a la de otro anuncio. Como adelantamos, el algoritmo por tanto es el método que hemos usado para construir un modelo. De esta forma usamos el algoritmo de red neuronal artificial para generar un modelo que nos diga si una foto se parece a otra.
- Machine Learning o Aprendizaje automático, es una familia de algoritmos que permiten crear programas (modelos) de forma declarativa, indicando las entradas y salidas de nuestro proceso para que un algoritmo decida cómo construir un programa que se ajuste a estas especificaciones.
- La inteligencia artificial, es un campo de las ciencias de la computación cuyo objetivo es imitar las cualidades cognitivas del ser humano (inteligencia). De manera que se puedan generar programas complejos cuyo funcionamiento replique las capacidades de toma de decisiones complejas, análisis y síntesis de imagen y voz, razonamiento lógico entre otras cuestiones.
Es importante resaltar que un sistema de ML está formado por tres componentes: los datos, el código y el propio modelo. El flujo de trabajo típico comenzaría con la adquisición y preparación de datos, seguido por el entrenamiento y empaquetado del modelo para finalizar en la integración del modelo en el producto final.
En cierta manera los artefactos generados por el aprendizaje automático son piezas de software. Elementos construidos sobre un paradigma declarativo extremo, pero que están sujetos al menos a unas prácticas de devops como cualquier otra pieza de software: versionado, integración, gestión de entornos, etc. Sin embargo el proceso de creación de los modelos cuenta con ciertas peculiaridades, que lo asemejan más al flujo de trabajo del método científico que al del desarrollo en la ingeniería de software tradicional.
Las empresas tienen grandes problemas para implantar estos sistemas y posiblemente se deba por abordarlos a través de una aproximación incorrecta. Por un lado a veces se ataca la construcción del sistema con una perspectiva puramente investigadora, centrándose en un modelar y correr, donde el foco está en la creación del modelo olvidando el resto de componentes fundamentales. En el extremo contrario está la aproximación desde la ingeniería de software tradicional, con el foco en construir y entregar, sin seguir un proceso de descubrimiento, formulación de hipótesis, experimentación y conclusión.
En el desarrollo tradicional de software son los cambios en el código los que provocan la necesidad de construir e integrar una nueva versión de la aplicación mientras que en los sistemas de ML son los cambios en el modelo, el código o en los datos los que disparan el empaquetado de una nueva release.
De la necesidad de integrar ese enfoque híbrido entre ciencia y desarrollo de software a las prácticas tradicionales de DevOps se están incorporando otras nuevas que tratan las peculiaridades del desarrollo de modelos y la operativa de datos bajo el paraguas MLOps.
Existen amplias discusiones sobre las diferencias entre DevOps y MLOps (MLOps por Google y MLOps Principles), pero para centrar la discusión destacamos:
- La Integración Continua no trata únicamente de validar código y componentes, sino también testar y validar datos, esquemas de datos y modelos.
- El Despliegue Continuo no se refiere a un único paquete o servicio, sino a un sistema completo (Pipeline de Entrenamiento de ML) que debería desplegar automáticamente otro servicio (Servicio de Predicción del Modelo).
- El Entrenamiento Continuo es una nueva propiedad, única para sistemas de ML, que se ocupa del reentrenamiento automático y su despliegue para servir los resultados de los modelos a las distintas aplicaciones.
Cerramos este primer post con una reflexión importante, y es que cuando usamos ML estamos generando software, aunque sea mediante un proceso de producción distinto al del software tradicional. Cuando nuestro modelo sale del laboratorio, estamos generando un componente de software que tiene que seguir un flujo de integración como los demás.
En nuestro siguiente post hablaremos de las lecciones que hemos aprendido a lo largo de este tiempo creando estos modelos e integrándolos en microservicios y aplicaciones.