Introducción

Los científicos de datos se destacan en la creación de modelos que representan y predicen datos del mundo real, pero la implementación efectiva de esos modelos de aprendizaje automático es más un arte que una ciencia.

La implementación requiere de habilidades que se encuentran más comúnmente en las áreas de ingeniería de software y de DevOps. Un factor crítico que marca la diferencia entre el éxito y el fracaso es la capacidad de colaborar e iterar como equipo.

El objetivo de crear un modelo de aprendizaje automático es resolver un problema, y un modelo de aprendizaje automático sólo puede hacerlo cuando está en producción y los consumidores lo utilizan activamente.

Como tal, la implementación de modelos es tan importante como la construcción de modelos.

Puede haber una “desconexión entre TI y ciencia de datos”. Es decir:

  • TI tiende a concentrarse en hacer que las cosas estén disponibles y estables. Quieren tiempo de actividad a toda costa.
  • Los científicos de datos, por otro lado, se centran en la iteración y la experimentación. Quieren romper cosas.

Cerrar la brecha entre esos dos mundos es clave para asegurarse de tener un buen modelo y poder ponerlo en producción con éxito.

La mayoría de los científicos de datos sienten que la implementación de modelos es una tarea de ingeniería de software, y debe ser manejada por ingenieros de software, porque las habilidades requeridas están más estrechamente alineadas con su trabajo diario.

Los científicos de datos que aprendan estas habilidades tendrán una ventaja, especialmente en las organizaciones lean.

Herramientas como TFX, MLflow, Kubeflow, etc. pueden simplificar todo el proceso de implementación del modelo, y los científicos de datos pueden (y deben) aprender a usarlas rápidamente.

Las dificultades en la implementación y gestión de modelos han dado lugar a un nuevo rol especializado: el del ingeniero de aprendizaje automático.

Los ingenieros de aprendizaje automático están más cerca de los ingenieros de software que de los científicos de datos típicos y, como tales, son el candidato ideal para poner modelos en producción.

Como no todas las empresas pueden darse el lujo de contratar ingenieros especializados solo para implementar modelos, es aconsejable que los científicos de datos aprendan cómo desplegar sus modelos en producción.

En todo esto surge otra pregunta: ¿cuál es la forma más efectiva de poner en producción modelos de aprendizaje automático?

Esta pregunta es fundamental, porque el aprendizaje automático promete mucho potencial para las empresas, y cualquier empresa que pueda llevar sus modelos a producción, de forma rápida y eficaz, puede eclipsar a sus competidores.

A continuación voy a exponer algunas de las prácticas y métodos que nos ayudarán a poner en producción modelos de aprendizaje automático; así como diferentes técnicas y casos de uso, y los pros y los contras de cada método.

Del modelo a la producción

Muchos equipos se embarcan en proyectos de aprendizaje automático sin un plan de producción.

Este enfoque “pistolero”, a menudo, genera problemas graves cuando llega el momento de la implementación.

Crear modelos es una actividad costosa y (suele ser) lenta, por lo que no deberíamos invertir en un proyecto de aprendizaje automático si no tenemos un plan para ponerlo en producción (excepto cuando se realiza como una actividad de investigación pura).

Las tres áreas clave que debemos considerar antes de embarcarnos en cualquier proyecto de aprendizaje automático son:

  1. Almacenamiento y recuperación de datos
  2. Marcos (frameworks) y herramientas
  3. Retroalimentación e iteración

Almacenamiento y obtención de los datos

Un modelo de aprendizaje automático no le sirve a nadie si no tiene ningún dato asociado.

Es probable que tengamos conjuntos de datos de entrenamiento, evaluación, pruebas e incluso predicciones.

Antes de hacer cualquier otra cosa en un proyecto de aprendizaje automático, pensemos en estas preguntas sobre los datos:

  • ¿Cómo se almacenan los datos de entrenamiento?
  • ¿Qué tamaño tienen los datos?
  • ¿Cómo se obtendrán los datos para el entrenamiento?
  • ¿Cómo se obtendrán los datos para la predicción?

Estas preguntas son importantes, ya que nos guiarán sobre:

  • ¿qué marcos (frameworks) y/o herramientas a usar?,
  • ¿cómo abordar el problema?, y
  • ¿cómo diseñar el modelo de aprendizaje automático?

Los datos se pueden almacenar en las instalaciones del centro de datos (on-premises), en la nube (cloud) o en un híbrido de los dos.

Tiene sentido almacenar los datos donde ocurra el entrenamiento del modelo y se entreguen los resultados, es decir,

  • cuando los datos están en on-premises, especialmente si los datos son grandes, lo más adecuado es tener el entrenamiento y puesta en servicio del modelo de aprendizaje automático en el propio centro de datos (on-premises),
  • mientras que, el entrenamiento y puesta en servicio del modelo ML en la nube será lo más adecuado cuando los datos se almacenan en la nube (Google Cloud Storage, AWS S3 o Azure Storage).

El tamaño de los datos también es muy importante. Si el conjunto de datos es grande, entonces necesitaremos más potencia de cálculo para los pasos de preprocesamiento y para las fases de optimización del modelo.

Esto significa que deberemos planificar el poder de computación (si estamos operando localmente) o configurar el escalado automático o escalado dinámico (si estamos operando en un entorno de nube).

Cualquiera de estas estrategias puede resultar costosa si no hemos pensado en las necesidades de los datos. Por lo tanto, debemos planificarlas por adelantado para asegurar que nuestro presupuesto puede respaldar el entrenamiento del modelo y el posterior pase a producción.

Incluso si tenemos los datos de entrenamiento almacenados junto con el modelo a entrenar, deberemos considerar cómo se obtendrán y procesarán esos datos, es decir, aquí debemos definir si la obtención de datos la haremos por lotes o la haremos en tiempo real, y esto debemos considerarlo antes de diseñar el proceso de aprendizaje automático.

La recuperación de datos por lotes significa que los datos se recuperan “en trozos” desde un sistema de almacenamiento; mientras que la recuperación de datos en tiempo real significa que los datos se recuperan tan pronto como estén disponibles.

Junto con la obtención de los datos de entrenamiento, también deberemos pensar en la obtención de los datos de predicción, ya que los datos de predicción rara vez están tan bien preparados (al contrario que los datos de entrenamiento, que sí están limpios, homologados, estandarizados, etc.), por lo que deberemos considerar algunos problemas adicionales relacionados con la forma en que nuestro modelo recibirá los datos en el momento de la inferencia:

  • ¿Obtendremos los datos desde páginas web o desde APIs?
  • ¿Estaremos haciendo predicciones por lotes o en tiempo real?

 

Datos desde páginas web o desde APIs

Si obtenemos datos desde páginas web, la pregunta es: ¿qué tipo de datos son?

Los datos de los usuarios en las páginas web pueden ser datos estructurados (CSV, JSON) o pueden ser datos no estructurados (imágenes, videos, sonido), y el motor de inferencia debe ser lo suficientemente sólido como para recuperar, procesar y realizar predicciones.

Los datos de inferencia de las páginas web pueden ser muy sensibles para los usuarios y, como tal, debemos tener en cuenta aspectos como la privacidad y la ética.

Aquí, se pueden considerar marcos como el aprendizaje federado, donde el modelo se lleva a los datos y los datos nunca abandonan las páginas web.

Otro problema aquí tiene que ver con la calidad de los datos. Los datos utilizados para la inferencia a menudo serán muy diferentes de los datos de entrenamiento, especialmente cuando provienen directamente de los usuarios finales (y no de APIs).

Por lo tanto, debemos proporcionar la infraestructura necesaria para automatizar completamente la detección de cambios, así como el procesamiento de estos nuevos datos.

 

Datos por lotes o en tiempo real

Debemos considerar si la inferencia se realiza en lotes o en tiempo real.

Estos dos escenarios requieren de enfoques diferentes, ya que la tecnología/habilidades involucradas pueden ser diferentes:

  • para la inferencia por lotes, es posible que deseemos guardar una solicitud de predicción en un almacén central (data lake, data warehouse) y, luego, haremos las inferencias después de un período determinado;
  • mientras que, en tiempo real, la predicción se realiza tan pronto como se realiza la solicitud de inferencia.

Por lo tanto, debemos planificar cuándo y cómo programar los recursos informáticos, así como qué herramientas vamos a utilizar.

 

Marcos (frameworks) y herramientas

Después de examinar y preparar el uso de datos, la siguiente línea de pensamiento debe considerar qué combinación de marcos (frameworks) y herramientas deberemos utilizar.

Nuestro modelo no se va a entrenar, ejecutar ni desplegar por sí solo. Para ello necesitamos de marcos (frameworks) y herramientas, software y hardware, que nos ayuden a implementar modelos de aprendizaje automático de manera efectiva.

Estos marcos (frameworks) pueden ser TensorFlow, PyTorch, Scikit-Learn, etc. para modelos de entrenamiento; y lenguajes de programación como Python, Java y Go… e incluso entornos en la nube como AWS, GCP y Azure.

La elección del marco es muy importante, ya que puede decidir la continuidad, el mantenimiento y el uso de un modelo.

En este paso, debemos responder a las siguientes preguntas:

  • ¿Cuál es la mejor herramienta para la tarea en cuestión?
  • La elección de herramientas… ¿es de código abierto o cerrado?
  • ¿Cuántas plataformas admite la herramienta?

Para ayudar a determinar la mejor herramienta para la tarea, deberemos investigar y comparar los hallazgos de diferentes herramientas que realizan el mismo trabajo.

Por ejemplo, podemos comparar estas herramientas según criterios como:

  • Eficiencia: ¿Qué tan eficiente es el marco o la herramienta en producción? Un marco o herramienta es eficiente si utiliza de manera óptima recursos como la memoria, la CPU o el tiempo de procesamiento. Es importante considerar la eficiencia de los frameworks, o las herramientas que pretendemos utilizar, porque tienen un efecto directo sobre el rendimiento, la confiabilidad y la estabilidad del proyecto.
  • Popularidad: ¿Qué tan popular es la herramienta en la comunidad de desarrolladores? La popularidad, a menudo, significa que funciona bien, que está en uso activo y que tiene mucho apoyo. Vale la pena mencionar que pueden existir herramientas más nuevas que sean menos populares… aunque sean más eficientes que las populares (especialmente en el caso de herramientas propietarias de código cerrado). En general, en proyectos de código abierto, nos inclinaremos por las herramientas que sean más populares y maduras.
  • Soporte: ¿Cómo es el soporte para el marco (framework) o la herramienta? ¿Tiene una comunidad vibrante detrás (si es de código abierto), o tiene un buen soporte (si es de código cerrado)? ¿Qué tan rápido podemos encontrar consejos, trucos, tutoriales u otros casos de uso en proyectos reales?

Debemos ser conscientes de que, tanto si las herramientas o el marco que hayamos seleccionado son de código abierto como si no, van a tener sus ventajas y sus desventajas, y la respuesta dependerá de aspectos como el presupuesto, el soporte, la continuidad, la comunidad, etc.

Algunas preguntas adicionales que deberemos responder son:

  • ¿cuántas plataformas admite el marco elegido? Es decir, ¿el marco es compatible con plataformas populares (como entornos web o entornos móviles)?
  • ¿funciona en Windows, Linux o MacOS?
  • ¿es fácil de personalizar o de implementar?

Estas preguntas son importantes, ya que puede haber muchas herramientas disponibles para investigar y experimentar en un proyecto, pero pocas herramientas que respalden adecuadamente nuestro modelo mientras éste está en producción.

Retroalimentación e iteración

Los proyectos de aprendizaje automático nunca son estáticos: esto es parte de la ingeniería y del diseño que debemos considerar desde el principio.

Aquí es importante responder a preguntas como:

  • ¿Cómo obtenemos retroalimentación de un modelo en producción?
  • ¿Cómo se configura la entrega continua? (Continuous Delivery / Continuous Integration)

Obtener retroalimentación de un modelo en producción es muy importante: el seguimiento activo y la supervisión del estado del modelo pueden advertirnos en casos de deterioro del rendimiento del modelo, variación del sesgo de los resultados o, incluso, sobre el sesgo y deriva de los datos.

Esto garantizará que dichos problemas se resuelvan rápidamente antes de que el usuario final se dé cuenta.

Consideremos cómo experimentar, reentrenar e implementar nuevos modelos en producción sin “tumbar” ese modelo ni interrumpir su funcionamiento.

Un nuevo modelo debe probarse adecuadamente antes de usarlo para reemplazar el anterior.

Esta idea de prueba y despliegue continuos de nuevos modelos, sin interrumpir los procesos del modelo existente, se denomina integración continua.

 

Un ejemplo de implementación de aprendizaje automático

Vamos a practicar lo explicado con anterioridad a través de un proyecto de aprendizaje automático.

Supongamos que somos un ingeniero de aprendizaje automático que trabaja en un proyecto prometedor en el que se busca diseñar un sistema a prueba de fallos que pueda desplegar, monitorear, rastrear e implementar de manera efectiva un modelo de aprendizaje automático.

Consideremos Ads_by_ME, una agencia de publicidad que brinda a las empresas online un seguimiento y monitoreo eficiente de sus anuncios.

Recientemente obtuvieron un contrato para construir un sistema de aprendizaje automático para predecir si los clientes harán clic en un anuncio que se muestra en una página web o no.

Los contratistas tienen un conjunto de datos (de gran volumen) en Google Cloud Storage (GCS) y quieren que Ads_by_ME desarrolle un sistema de aprendizaje automático integral para ellos.

Debemos encontrar una solución de diseño antes de que comience el proyecto.

Para abordar este problema, es necesario que nos hagamos cada una de las preguntas formuladas anteriormente y desarrollemos un diseño end-to-end para este sistema.

Primero, hablemos de los datos.

¿Cómo se almacenan los datos de entrenamiento?

Los datos se almacenan en un depósito de GCS y vienen en dos formas:

  • el primero es un archivo CSV que describe el anuncio, y
  • el segundo es la imagen correspondiente al anuncio.

Los datos ya están en la nube, por lo que puede ser mejor crear nuestro sistema de aprendizaje automático en la nube. De esta forma obtendremos una menor latencia para las operaciones de E/S, un escalado sencillo a medida que los datos se hacen más grandes (cientos de gigabytes), y una instalación y configuración rápidas en caso de que necesitemos GPUs y/o TPUs adicionales.

¿Qué tamaño tienen los datos?

El contratista publica millones de anuncios cada mes y los datos se agregan y almacenan en GCS al final de cada mes.

Por lo tanto, ahora sabemos que los datos son grandes (cientos de gigabytes de imágenes), por lo que la intuición de construir nuestro sistema en la nube es aún más fuerte.

¿Cómo recuperaremos los datos para el entrenamiento?

Dado que los datos se almacenan en GCS, los modelos creados en Google Cloud Platform (GCP) pueden recuperarlos y consumirlos fácilmente. Así que ya tenemos una idea de qué proveedor de nube usar (Google).

¿Cómo recuperaremos los datos para la predicción?

En relación a los datos de inferencia, los contratistas informaron que su API interna solicitará la predicción, ya que dichos datos para la predicción serán llamados por una REST API.

Esto nos da una idea de la plataforma de destino del proyecto.

 

Marcos y herramientas para el proyecto

Hay muchas combinaciones de herramientas que podemos utilizar en esta etapa, y la elección de una herramienta puede afectar a las demás etapas.

En términos de lenguajes de programación para la creación de prototipos, la construcción de modelos y la implementación, podemos decidir elegir el mismo lenguaje para estas tres etapas o utilizar diferentes lenguajes (según los resultados de la investigación).

Por ejemplo, Java es un lenguaje muy eficiente para la programación de back-end, pero no se puede comparar con un lenguaje versátil como Python cuando se trata de aprendizaje automático.

Después de considerarlo detenidamente, decidimos usar:

  • Python como lenguaje de programación,
  • TensorFlow para la construcción de modelos Deep Learning (porque trabajaremos con un gran conjunto de datos que incluye imágenes), y
  • TensorFlow Extended (TFX), una herramienta de código abiertoc, lanzada y utilizada internamente en Google, para construir nuestros pipelines.

¿Qué pasa con los otros aspectos de la construcción del modelo, como el análisis, la supervisión, el servicio, etc. del modelo? ¿Qué herramientas usaremos?

Bueno… la verdad es que… TFX lo cubre prácticamente todo!

TFX proporciona una serie de marcos, bibliotecas y componentes para definir, lanzar y monitorear modelos de aprendizaje automático en producción.

Los componentes disponibles en TFX nos permiten crear pipelines de aprendizaje automático eficientes, diseñados específicamente para escalar desde el principio.

Estos componentes tienen soporte integrado para el modelado, el entrenamiento, el despliegue e, incluso, la administración de implementaciones de aprendizaje automático en diferentes entornos.

TFX también es compatible con nuestra elección de lenguaje de programación (Python), así como con la elección de generador de modelos de Deep Learning (TensorFlow), y esto fomentará la coherencia en todo el equipo.

Además, dado que TFX y TensorFlow fueron creados por Google, tienen soporte de primera clase en Google Cloud Platform.

Y… no nos olvidemos de una cosa: los datos se almacenan en GCS.

La elección de herramientas: ¿código abierto o cerrado?

Python, TFX y TensorFlow son todas herramientas de código abierto y son las principales herramientas para construir nuestro sistema.

En términos de potencia informática y almacenamiento, están utilizando GCP, que es un servicio en la nube administrado y de pago.

Esto tiene sus pros y sus contras, y también puede depender del caso de uso.

Algunas de las ventajas del uso de servicios administrados en la nube son:

  • Son rentables.
  • Instalación e implementación rápidas.
  • Copia de seguridad y recuperación eficientes.

Algunas de las desventajas son:

  • Problema de seguridad, especialmente con datos confidenciales.
  • La conectividad a Internet puede afectar el trabajo, ya que todo funciona en línea.
  • Costos recurrentes.
  • Control limitado sobre las herramientas.

En general, para las empresas más pequeñas, como start-ups, suele ser más barato y mejor utilizar los servicios gestionados en la nube para sus proyectos.

¿Cuántas plataformas admiten la herramienta?

TFX y TensorFlow se ejecutan en cualquier lugar donde se ejecute Python.

Además, los modelos creados con TensorFlow se pueden guardar y desplegar fácilmente en los navegadores usando Tensorflow.js; o en dispositivos móviles e IoT usando TensorFlow Lite; o en la nube e incluso on-premises.

¿Cómo obtenemos retroalimentación de un modelo en producción?

TFX dispone de un mecanismo de retroalimentación que se puede usar fácilmente para administrar el control de versiones del modelo, así como para implementar nuevos modelos.

Se pueden crear comentarios personalizados en torno a esta herramienta para realizar un seguimiento eficaz de los modelos en producción.

Un componente TFX llamado TensorFlow Model Analysis (TFMA) nos permite evaluar fácilmente nuevos modelos versus los actuales antes de su implementación.

Teniendo en cuanta las respuestas anteriores, ya podemos comenzar a imaginar cómo se verá el diseño final de nuestro sistema de aprendizaje automático.

 

Conclusión

Poner en producción un modelo de aprendizaje automático de manera efectiva no tiene por qué ser difícil si se marcan todas las casillas antes de que nos embarquemos en un proyecto.

Recordemos el viejo consejo: “- medir 2 veces, cortar 1”.