Cultura DevOps en proyectos de Inteligencia Artificial y Analítica Avanzada

Imagen de Freepik
Imagen de Freepik

Tal y como has podido leer en diversos post que hemos publicado, nuestro trabajo consiste, entre otras, en el desarrollo de modelos matemáticos, modelos de aprendizaje automático y hasta modelos de computación visual o de comprensión del lenguaje.

Algunas preguntas recurrentes son: ¿Cómo trabajaremos con este cliente? ¿Qué tipo de despliegue usaremos? ¿Y la nube? ¿Y si no tiene nube? Una vez realizado este trabajo para un cliente, ¿Cómo procedemos a realizar la entrega del mismo?

La respuesta a estas preguntas es simple si se mira desde el prisma de la filosofía DevOps: ¡colaborando!

DevOps = Colaboración

Primero haremos el esfuerzo de no usar terminología propia de DevOps (meet, cloud, delivery, testing, agile, deployment, machine learning, docker, kubernetes), puesto que este artículo trata de la cultura DevOps y no de las herramientas y plataformas que facilitan su implantación.

Según la metodología DevOps, debemos seguir una serie de prácticas para asegurar un proceso de entrega de software fiable:

  • Desarrollar y probar en entornos similares a producción.
  • Realizar despliegues mediante procesos repetibles y fiables.
  • Supervisar y validar la calidad operativa.
  • Amplificar los bucles de retroalimentación.

Los pases a producción se deben realizar bajo un plan de mejoras y las entregas se modificarán en pos del negocio.

Medir y planificar

Aterricemos toda esta teoría y tomemos algunas decisiones.

Partiremos del punto en el cual ya hemos identificado el problema a resolver y además el grupo de trabajo está formado. Cabe recordar que el grupo de trabajo debe incluir al usuario final siempre. Podemos llamarle PM, jefe de proyecto o usuario responsable; pero éste debe estar siempre presente y debe ser tomado en cuenta en cada cambio de rumbo o especificaciones.

Vamos a comenzar poniéndonos las cosas lo más fácil posible. Idealmente nos decantamos por usar lenguajes de desarrollo que sean extensivamente utilizados. Por ejemplo, Python, R, C++/C#, .NET o Java. Estos lenguajes nos aseguran casi por completo dos cosas:

  1. El cliente puede mantener la solución una vez entregada
  2. Facilita la integración con distintos orígenes de datos: bases de datos, ficheros Excel, almacenamiento en la nube, etc.

Otra característica que nos ayudará en el proceso es el uso de la informática en la nube: AWS, Azure o Google Cloud Platform. Gracias a la infraestructura en la nube podremos crear entornos similares a producción en la que explotar los modelos y ahorrar en costes optimizando el tiempo de uso. También podemos ejecutar los modelos como servicio y no depender de una infraestructura propia.

La experiencia desarrollando diferentes clases de modelos nos permite medir los recursos necesarios para la explotación:

  • Cuando hablamos de modelos de optimización, priorizamos la capacidad de cómputo: no sólo la paralización en hilos del proceso, también la velocidad de reloj del procesador. Si el despliegue del modelo es en la nube, debemos asegurar que la máquina tenga capacidades de cómputo adecuadas.
  • Si el proyecto es un modelo de aprendizaje automático debemos equilibrar el uso de memoria con el de cómputo. Este punto es difícil puesto que el entrenamiento de modelos deberemos hacerlo, en la medida de lo posible, en máquinas con altas capacidades separadas del entorno de explotación. Nos permitirá ahorrar en costes de infraestructura.
  • Si el modelo de optimización es complejo y requiere de un solver matemático, la solución no es trivial. Necesitamos un entorno de ejecución personalizado: potencia de cómputo y resolver dependencias instalando librerías y el licenciamiento para el modelo.

No olvidemos algo importante: ahora toca buscar una plataforma que permita desarrollar, probar y explotar la solución y que sea válida para todos.

Aquí normalmente se nos presentan las siguientes preguntas:

  • ¿Cuántos usuarios van a trabajar con el modelo?
  • ¿Se ejecutará de forma simultánea?
  • ¿Qué periodicidad de ejecución tendrá el mismo?

Una vez el cliente nos responde a estas preguntas, en baobab soluciones sabemos cuál es el mejor entorno que se adaptará a nuestros clientes. Si tienes un proyecto de optimización en mente y no conoces las respuestas, por favor, escríbenos y te las daremos.

Desarrollar y probar

En baobab soluciones nos gusta desarrollar, aunque no os lo creáis nos gusta incluso más que mantener largas reuniones. De forma predeterminada y para todos los proyectos usamos una plataforma en la nube de versionado de código. El uso de esta tecnología es la base de la colaboración en el desarrollo del proyecto y la primera piedra sobre la que podremos construir nuestro entorno de colaboración.

El código es el resultado del conocimiento del proyecto. Se trata de la solución que aportamos a los negocios de nuestros clientes. En baobab soluciones contamos con la suficiente experiencia para saber que el usuario final debe poder acceder a este fácilmente e interpretarlo, auditar y visualizar las mejoras continuas que se realizan en todo momento.

Si usamos Git sabremos cuándo, cómo y por qué el código funciona. Idealmente también para ver dónde falla. Pero Git nos abrirá la puerta a la entrega de software continua y el despliegue automático.

Si un cliente nos pregunta: ¿Qué plataforma preferís para colaborar durante el proyecto? Nuestra respuesta es: cualquiera que nos permita colaborar desde la planificación hasta el despliegue en producción.

La respuesta anterior es inherente a la plataforma para realizar las pruebas. El modelo de optimización o previsión se probará en el entorno adecuado antes del despliegue. En baobab soluciones nos aseguramos de realizar la entrega tras un exhaustivo plan de pruebas. El usuario final siempre es partícipe de este proceso y es el responsable de analizar los datos y autorizar el pase a producción.

El despliegue en producción, crucemos los dedos

Antiguamente, podríamos haber expuesto un SFTP para proceder a la descarga de una carpeta que contuviese el manual de instrucciones y el modelo encargado. O podríamos haber quemado un CD con una serigrafía. Algo como “only works with Windows 98/NT”. ¡Toma ya! Yo hice mi trabajo, ahora, te las apañas tú. Afortunadamente, no estamos en esa etapa de la informática y entre todos hemos construido un futuro muy prometedor.

Ahora tenemos las herramientas para hacer del proceso de entrega algo sencillo y, sobre todo, algo que podamos compartir con nuestros clientes y comprobar entre todos que la solución funciona. Este es uno de los puntos más importantes en la filosofía DevOps: hacer partícipe al usuario durante todas las fases del proyecto. La entrega debe comenzar en la misma toma de requisitos.

Durante la fase de desarrollo habremos creado entornos similares al de producción. Y además estarán descritos en el repositorio: infraestructura como código. De forma predilecta usamos lenguajes de contenedores. Lo preferimos porque se logra encapsular el entorno de ejecución del modelo de optimización y eliminar incógnitas propias de cada máquina donde se ejecuta el código. No obstante, podemos usar alternativas como construcción de imágenes permanentes o lenguaje declarativo para desplegar en la nube.

Declarando la infraestructura como código obtenemos una serie de ventajas:

  • Despliegues repetibles.
  • Seguridad granular.
  • Independencia del proveedor de infraestructura.

Pregunta del cliente: ¿nos acompañas en los procesos de despliegue continuo? Respuesta: será un placer.

Supervisar y… ¡a optimizar!

Nuestro trabajo no es únicamente código, es el conocimiento y la experiencia de tratar con dicho modelo matemático. ¿Cómo entregamos esto? Respuesta: en papel ¿no? Los manuales de hoy en día no se entregan en papel. Usamos herramientas que sean accesibles y permitan, una vez más, colaborar en su elaboración: GitHub/Bitbucket, Confluence, Sharepoint / Teams, Google Docs, etc.

Durante el desarrollo se imprimirá en consola la información relevante para monitorizar la aplicación/solución. Tendremos que revisar los logs y podremos comparar las diferentes soluciones aportadas por el modelo. Si entre todos hemos sumado en la etapa de planificación y desarrollo, sabremos localizar las correcciones que se deban implementar rápidamente.

Nos complace ver que la solución aportada se transforma en beneficios para el cliente ya sea en forma de tiempo, retorno de la inversión o disposición de los recursos (casi siempre va todo de la mano).

Al despliegue en producción le sigue una etapa de soporte post-arranque en la cual vamos de la mano con el cliente identificando mejoras, errores y las mejores maneras de poner en práctica las soluciones aportadas.

Terminaremos este post con el mayor de los deseos y es seguir acompañando a nuestros clientes (los presentes y futuros) para evolucionar juntos en la búsqueda de la mejor de las soluciones posibles a nuestros aún no conocidos problemas.