Arquitectura y diseño para predecir el valor del ciclo de vida del cliente con Kubeflow Pipelines

Este documento es el primero de dos documentos en los que se analiza cómo usar Kubeflow Pipelines para organizar el entrenamiento, la implementación y la inferencia de los modelos predictivos del valor del ciclo de vida del cliente (CVC). En este documento se describen los patrones de arquitectura y diseño que se usan para implementar canalizaciones de inferencia y entrenamiento de CVC. En un instructivo adjunto se muestra cómo implementar, usar y personalizar las muestras de código de canalización en el repositorio de GitHub complementario.

Para obtener una descripción general sobre cómo usar Kubeflow Pipelines a fin de diseñar, organizar y automatizar un sistema de aprendizaje automático (AA) integrado y usar Cloud Build para configurar una integración continua/implementación continua (CI/CD), consulta Arquitectura para canalizaciones de CI/CD y AA con Kubeflow y Cloud Build

Descripción general

Este documento tiene dos objetivos:

  • Demostrar patrones de arquitectura y diseño para Kubeflow Pipelines que organizan los servicios de análisis de datos y el AA que administra Google Cloud
  • Proporcionar un kit básico para poner en funcionamiento el entrenamiento, la implementación y la puntuación de los modelos predictivos de CVC

La arquitectura y el diseño que se analizan en este documento representan un caso práctico de ventas en el que debes ajustar y volver a entrenar un modelo predictivo con frecuencia. Debido a que el núcleo de los datos de entrenamiento es un flujo constante de transacciones nuevas de ventas, debes mantener los modelos actualizados con patrones de compra cambiantes. Automatizar los flujos de trabajo de implementación y entrenamiento se vuelve fundamental.

Este documento se basa en las técnicas de preprocesamiento y modelado de datos que se describen en la serie Predice valor del ciclo de vida del cliente con AI Platform. Esa serie puede ayudarte a comprender mejor los conceptos de CVC y los enfoques de algoritmos.

Este documento está dirigido a ingenieros de aprendizaje automático y científicos de datos. Para el documento y el instructivo adjunto, se da por hecho que tienes un conocimiento básico de los siguientes conceptos y servicios de Google Cloud:

Kubeflow Pipelines es un componente clave del proyecto de Kubeflow. El proyecto de Kubeflow es una plataforma de código abierto nativa de Kubernetes para desarrollar, organizar, implementar y ejecutar cargas de trabajo de AA escalables y portátiles. Para obtener más información sobre Kubeflow Pipelines, consulta la documentación de Kubeflow.

Kubeflow Pipelines suele instalarse como parte de una instalación de Kubeflow. También puedes instalar Kubeflow Pipelines como un conjunto independiente de servicios sin dependencias de otros componentes de Kubeflow.

Puedes alojar Kubeflow Pipelines en varias distribuciones de Kubernetes. Este documento se centra en la ejecución de Kubeflow Pipelines en GKE.

Kubeflow Pipelines como organización

En este documento se muestra un patrón de arquitectura en el que usas Kubeflow Pipelines como organizador de los servicios de análisis de datos y el AA que administra Google Cloud. En este caso Kubeflow Pipelines solo ejecuta el flujo de trabajo, pero no realiza ningún otro procesamiento en un clúster de Kubernetes de hosting.

En el siguiente diagrama, se muestra la arquitectura de alto nivel de la solución de CVC que se describe en este documento.

Descripción general de los componentes clave de Kubeflow Pipelines y Google Cloud para la solución de CVC.

Los servicios de Kubeflow Pipelines están alojados en GKE. Las canalizaciones que se analizan aquí y en el instructivo se crean en Kubeflow Pipelines. Estas canalizaciones interactúan con Cloud Storage, BigQuery y AutoML Tables a través de un conjunto de componentes de Kubeflow Pipelines que unen las API de Cloud respectivas. Usa Container Registry para administrar las imágenes de contenedor de los componentes que usan las canalizaciones.

La solución de GitHub adjunta incluye dos canalizaciones de muestra:

  • La canalización de implementación y entrenamiento
  • La canalización de predicción por lotes

Ambas canalizaciones siguen un flujo de procesamiento de datos, entrenamiento y puntuación similar al que se describe en Predice el valor del ciclo de vida del cliente con AutoML Tables. En ese flujo de trabajo, debes hacer lo siguiente:

  • Usar BigQuery para la limpieza de datos y la ingeniería de atributos
  • Usar AutoML Tables para el entrenamiento, la implementación y la puntuación de modelos

Flujo de trabajo de implementación y entrenamiento

La canalización de implementación y entrenamiento usa datos históricos de transacciones de ventas para entrenar y, de forma opcional, implementar un modelo de regresión de AA. El modelo está entrenado para predecir un valor de compras futuras de un cliente en función de su historial de compras. Si deseas obtener más información sobre el modelado para la predicción de CVC, consulta Predice el valor del ciclo de vida del cliente con AI Platform: introducción.

En el siguiente diagrama, se muestra el flujo de trabajo que ejecuta la canalización.

Componentes en el flujo de trabajo de implementación y entrenamiento.

En este flujo de trabajo, debes hacer lo siguiente:

  1. Cargar transacciones de ventas históricas desde Cloud Storage a una tabla de etapa de pruebas de BigQuery. Si los datos ya están en BigQuery, se omite este paso
  2. Preparar una consulta de BigQuery. La consulta se genera a partir de una plantilla de consulta y de argumentos del entorno de ejecución que se pasan a la canalización
  3. Ejecutar una consulta de BigQuery para crear atributos a partir de las transacciones de ventas históricas. Los atributos de ingeniería se almacenan en una tabla de BigQuery
  4. Importar atributos a un conjunto de datos de AutoML
  5. Activar el entrenamiento de modelos de AutoML
  6. Después de completar el entrenamiento, recuperar las métricas de evaluación del modelo
  7. Comparar el rendimiento del modelo con el umbral de rendimiento
  8. Si el modelo cumple o excede el umbral de rendimiento, implementar el modelo para las predicciones en línea

Para obtener más información sobre el diseño y el uso de la canalización de entrenamiento, consulta la documentación en el repositorio de GitHub complementario de esta solución.

Flujo de trabajo de predicción por lotes

La canalización usa los mismos pasos de procesamiento previo y de ingeniería de atributos que la canalización de entrenamiento. Usa el método batchPredict de AutoML Tables para las predicciones por lotes.

En el siguiente diagrama, se muestra el flujo de trabajo que ejecuta la canalización.

Flujo de trabajo de canalización para los pasos de procesamiento previo y de ingeniería

  1. Cargar transacciones de ventas históricas desde Cloud Storage a una tabla de etapa de pruebas de BigQuery. Si los datos ya están en BigQuery, se omite este paso
  2. Preparar una consulta de BigQuery. La consulta se genera a partir de una plantilla de consulta y de argumentos del entorno de ejecución que se pasan a la canalización
  3. Ejecutar una consulta de BigQuery para crear atributos a partir de las transacciones de ventas históricas. Los atributos de ingeniería se almacenan en una tabla de BigQuery
  4. Invocar el método batchPredict de AutoML Tables para puntuar los datos. El método batchPredict de AutoML Tables almacena las predicciones resultantes en Cloud Storage o BigQuery.

Patrones de diseño de Kubeflow Pipelines

Las canalizaciones que se analizan en este documento son fáciles de administrar, implementar y personalizar.

Usa componentes genéricos o específicos de la canalización de Kubeflow Pipelines

En general, puedes clasificar los componentes de Kubeflow en dos tipos:

  • Componentes genéricos. Un componente genérico tiene una funcionalidad que no es específica de un flujo de trabajo implementado por una canalización determinada. Por ejemplo, un componente que envía un trabajo de BigQuery es un componente genérico. Debido a que el componente no contiene ninguna lógica específica para una canalización determinada, puedes volver a usarla en varias situaciones.
  • Componentes específicos de la canalización. Por lo general, un componente específico de la canalización es un componente auxiliar que tiene una funcionalidad específica para una canalización determinada o un grupo de canalizaciones relacionadas (por ejemplo, un componente que calcula y registra una métrica de rendimiento personalizada específica de un flujo de trabajo de entrenamiento particular). Reutilizar un componente específico de la canalización no es fácil.

Puedes desarrollar, compilar, implementar y administrar componentes genéricos de forma independiente de las canalizaciones que los usan.

Por lo general, el desarrollo, la compilación y la implementación de un componente específico de la canalización están estrechamente relacionados con el ciclo de vida de la canalización de consumo. El uso de componentes básicos de Python es una forma conveniente y común de implementar componentes específicos de la canalización.

Las canalizaciones usan componentes genéricos y específicos de la canalización.

Para ejecutar tareas de ingeniería de atributos y procesamiento previo de datos, las canalizaciones usan el componente de BigQuery que se empaqueta con la distribución de Kubeflow Pipelines. El componente procesa una consulta arbitraria de BigQuery y almacena los resultados en una tabla de BigQuery o un BLOB de Cloud Storage.

Para el entrenamiento la implementación y la inferencia de modelos, las canalizaciones usan un conjunto de componentes de AutoML Tables proporcionados como parte de las muestras de código de GitHub. Los componentes de AutoML Tables unen un subconjunto de las API de AutoML Tables.

Las canalizaciones también usan los siguientes componentes auxiliares que se implementan como componentes básicos de Python:

  • El componente Load transactions. El componente Load transactions carga los datos históricos de transacciones de ventas a partir de un conjunto de archivos CSV de Cloud Storage en una tabla de etapa de pruebas de BigQuery.
  • El componente Prepare query. El componente Prepare query (un buen ejemplo de un componente específico de la canalización) genera una plantilla de consulta de SQL de BigQuery. Sin embargo, BigQuery no admite la configuración de parámetros de identificadores, nombres de columnas o nombres de tablas. A fin de evitar realizar un ajuste del tipo hard-code para estas partes de la consulta de procesamiento previo y de ingeniería de atributos, Prepare query sustituye los marcadores de posición en la plantilla de consulta con los valores que se pasan al componente como parámetros del entorno de ejecución.

Para obtener información más detallada sobre el diseño y el uso de los componentes usados en las canalizaciones, consulta la documentación de esta solución en GitHub.

Administra la configuración de la canalización

Un aspecto fundamental del diseño de canalización es cómo administrar la configuración. No recomendamos hacer un ajuste del tipo hard-code para esta configuración directamente en el lenguaje específico del dominio (DSL) de una canalización. Una configuración hard-coded puede generar problemas cuando implementes canalizaciones en diferentes entornos.

Por ejemplo, los nombres y las ubicaciones de las imágenes de contenedor de los componentes que usa una canalización pueden ser diferentes en los entornos de desarrollo, etapa de pruebas y producción. De manera similar, las URL a los recursos que usan los componentes (como la plantilla de consulta que usa el componente Prepare query) pueden diferir de un entorno a otro.

En la solución de GitHub adjunta, se muestra un enfoque para la administración de la configuración. En la solución un solo archivo de configuración YAML administra toda la configuración de la canalización. El archivo de configuración tiene dos secciones: argument_defaults y compiler_settings.

En la sección argument_defaults, debes definir los valores predeterminados para los argumentos del entorno de ejecución de las canalizaciones. En la sección compiler_settings, debes definir la configuración que controla cómo el compilador DSL convierte el formato DSL de Python en el formato YAML resultante. Un ejemplo de una configuración de compilador es una marca que controla si una canalización debe compilarse para usar la cuenta de servicio de usuario de canalización específica o la cuenta de servicio de Compute Engine predeterminada cuando la canalización accede a los servicios administrados por Google Cloud.

Durante la compilación, el archivo de configuración se fusiona con el código DSL de las canalizaciones.

Visualiza los resultados de una canalización ejecutada en el panel de Kubeflow Pipelines

La plataforma de Kubeflow Pipelines tiene compatibilidad integrada para registrar y visualizar artefactos que pueden ayudar con el seguimiento, la comprensión, la evaluación y la comparación de una serie de ejecuciones. En particular, esta asistencia es importante cuando administras una cantidad potencialmente grande de ejecuciones durante las fases de experimentación y entrenamiento del ciclo de vida del AA.

El panel de Kubeflow Pipelines admite dos tipos de visualizaciones:

  • Métricas de la canalización. Una métrica de la canalización es una métrica escalar que se procesa como una visualización en la página Ejecuciones de un experimento particular en el panel de Kubeflow Pipelines. El objetivo principal de una métrica de la canalización es proporcionar una vista rápida del rendimiento de una ejecución y comparar varias ejecuciones.
  • Visualizadores de salida: Los visualizadores de salida se usan para registrar y procesar información más detallada sobre una ejecución. En el panel de Kubeflow Pipelines, puedes encontrar los artefactos que un componente determinado generó en la sección Artefactos del panel de tareas y el resumen de todas las salidas en el panel Run Output de una ejecución.

Por el momento, el panel de Kubeflow Pipelines admite los siguientes tipos de visualizadores de salida:

  • Matriz de confusión
  • Curva ROC
  • TensorBoard
  • App web
  • Tabla
  • Markdown

Los últimos tres visualizadores son flexibles porque te permiten capturar y visualizar información arbitraria.

Un componente de canalización puede usar visualizadores de salida del panel de Kubeflow Pipelines mediante la escritura de metadatos para los visualizadores de salida en un archivo JSON. Los metadatos deben cumplir con el esquema descrito en la documentación de Kubeflow Pipelines.

La mayoría de los componentes genéricos distribuidos con Kubeflow Pipelines generan metadatos que reflejan sus acciones. Recomendamos que instrumentes cualquier componente personalizado desarrollado como parte de la solución de Kubeflow Pipelines con la generación de metadatos.

Si necesitas capturar información que ninguno de los componentes compilados con anterioridad que usa tu canalización genera de forma automática, puedes usar la infraestructura flexible de los componentes básicos de Python para generar artefactos adicionales.

Con los componentes de AutoML Tables, se muestra cómo usar los artefactos del panel de Kubeflow Pipelines para hacer un seguimiento de las salidas de las llamadas a la API de AutoML Tables.

El componente log_evalutation_metrics recupera las métricas de evaluación más recientes de un modelo de AutoML determinado y genera como salida de esas métricas un artefacto de Markdown.

El componente también registra la métrica principal especificada como su argumento de entrada como una métrica de la canalización.

Automatización de implementación y compilación

Las canalizaciones de producción pueden volverse complejas. Pueden hacer lo siguiente:

  • Usar varios componentes de diferentes fuentes. Por ejemplo, pueden usar componentes precompilados genéricos de Kubeflow Pipelines y componentes personalizados desarrollados para una solución determinada
  • Usar recursos externos. Por ejemplo, pueden usar secuencias de comandos y plantillas de SQL, secuencias de comandos de PySpark o plantillas de visualizador de salida
  • Requerir valores diferentes de los valores predeterminados para los parámetros del entorno de ejecución o la configuración del compilador, o ambos, según el entorno de ejecución de destino. Por ejemplo, para algunos entornos, es posible que debas compilar una canalización a fin de usar una cuenta de servicio personalizada, mientras que, para los otros entornos, la canalización puede usar la cuenta predeterminada de Compute Engine

En todos los casos, excepto en los más simples, no es factible administrar la compilación y la implementación de soluciones de Kubeflow Pipelines mediante el uso de guías de compilación o guías paso a paso. La automatización de los procesos de compilación y de implementación es fundamental. Cuando se combina con la administración de configuración flexible, como se describe en la sección Administra la configuración de la canalización, la automatización de compilación establece una base para una administración de configuración de las soluciones de Kubeflow Pipelines sólida, repetible y rastreable.

En las muestras de código del repositorio de GitHub complementario, se demuestra un enfoque para automatizar el proceso de compilación: usar Cloud Build. En esta situación Cloud Build realiza los siguientes pasos:

  1. Compila la imagen base para los componentes básicos de Python.
  2. Compila la imagen que aloja los componentes de AutoML Tables.
  3. Implementa las imágenes en el registro de contenedores de tu proyecto.
  4. Compila las canalizaciones.
  5. Implementa las canalizaciones compiladas en Cloud Storage.
  6. Implementa los artefactos de las canalizaciones en Cloud Storage.
  7. Copia el conjunto de datos de muestra que se usan en el instructivo en Cloud Storage.

Para obtener una descripción más detallada del proceso de compilación, consulta el repositorio de GitHub de la solución.

Próximos pasos