From Notebook to Kubeflow Pipelines with HP Tuning: A Data Science Journey

1. Introducción

Kubeflow es un kit de herramientas de aprendizaje automático para Kubernetes. El objetivo de este proyecto es que las implementaciones de flujos de trabajo de aprendizaje automático (AA) en Kubernetes sean simples, portátiles y escalables. El objetivo es proporcionar una forma directa de implementar sistemas de código abierto de primer nivel para AA en diversas infraestructuras.

¿Cómo se ve una implementación de Kubeflow?

Una implementación de Kubeflow tiene las siguientes características:

  • Portátil: Funciona en cualquier clúster de Kubernetes, ya sea que resida en Google Cloud Platform (GCP), de manera local o entre distintos proveedores.
  • Escalable: Puede usar recursos que fluctúan y se ve limitada solo por la cantidad de recursos asignados al clúster de Kubernetes.
  • Componible: Te permite configurar pasos independientes en un flujo de trabajo de AA completo, eligiendo entre un conjunto seleccionado de marcos de trabajo y bibliotecas de AA.

Kubeflow te permite organizar microservicios vinculados de manera flexible como una sola unidad y, además, implementarlos en distintas ubicaciones, ya sea en una laptop, de forma local o en la nube.

En este codelab, se explica cómo crear tu propia implementación de Kubeflow con MiniKF y, luego, ejecutar un flujo de trabajo de Kubeflow Pipelines con ajuste de hiperparámetros para entrenar y entregar un modelo. Todo esto lo haces desde un notebook de Jupyter.

Qué compilarás

En este codelab, compilarás una canalización de ciencia de datos compleja con ajuste de hiperparámetros en Kubeflow Pipelines, sin usar ningún comando de CLI ni SDK. No necesitas tener conocimientos sobre Kubernetes ni Docker. Cuando termine, su infraestructura contendrá lo siguiente:

  • Una VM de MiniKF (Mini Kubeflow) que se instala automáticamente:
  • Kubernetes (con Minikube)
  • Kubeflow
  • Kale, una herramienta para convertir notebooks de Jupyter de uso general en flujos de trabajo de Kubeflow Pipelines ( GitHub)
  • Arrikto Rok para el control de versiones y la reproducibilidad de los datos

Qué aprenderás

  • Cómo instalar Kubeflow con MiniKF
  • Cómo convertir tus notebooks de Jupyter a Kubeflow Pipelines sin usar comandos de la CLI ni SDKs
  • Cómo ejecutar Kubeflow Pipelines con ajuste de hiperparámetros desde un notebook con un solo clic
  • Cómo crear versiones automáticamente de tus datos en un notebook y en cada paso de la canalización

Requisitos

Este es un codelab avanzado que se enfoca en Kubeflow. Para obtener más información y una introducción a la plataforma, consulta la documentación de Introducción a Kubeflow. Los conceptos y los bloques de código no relevantes se pasan por alto y se proporcionan para que simplemente los copies y pegues.

2. Configura el entorno

Configura el proyecto de GCP

Sigue los pasos que se indican a continuación para crear un proyecto de GCP o configurar tu proyecto de GCP existente. Si planeas usar un proyecto existente de GCP, asegúrate de que cumpla con los requisitos mínimos que se describen a continuación. El primer paso es abrir el administrador de recursos en GCP Console.

Crea un proyecto nuevo o selecciona uno existente:

99b103929d928576.png

Verifica los siguientes requisitos mínimos:

  • Asegúrate de tener el rol de propietario del proyecto.
  • Asegúrate de que la facturación esté habilitada para tu proyecto.
  • Si usas el nivel gratuito de GCP o el período de prueba de 12 meses con un crédito de USD 300, ten en cuenta que no puedes ejecutar la instalación predeterminada de MiniKF en GCP, ya que el nivel gratuito no ofrece suficientes recursos. Debes actualizar a una cuenta pagada.

Para obtener más ayuda con la configuración de un proyecto de GCP, consulta la documentación de GCP.

Después de configurar tu proyecto de GCP, ve directamente a las instrucciones para instalar MiniKF.

Abre tu proyecto de GCP preasignado

Para abrir tu proyecto de GCP preasignado, haz clic en el siguiente botón para visitar GCP Console y abrir el panel principal, que se encuentra en el menú de hamburguesas en la parte superior izquierda. Si la pantalla está vacía, haz clic en Sí en el mensaje para crear un panel.

3fdc4329995406a0.png

Si el proyecto aún no está seleccionado, haz clic en Seleccionar un proyecto:

e8952c0b96067dea.png

Elige tu proyecto. Solo debes tener uno:

fe25c1925487142.png

3. Instala MiniKF

Crea una instancia de Compute que incluya MiniKF

En GCP Marketplace, busca "MiniKF".

Selecciona la máquina virtual MiniKF de Arrikto:

d6b423c1911ea85a.png

Haz clic en el botón LAUNCH y selecciona tu proyecto:

7d07439db939b61c.png

En la ventana Configure & Deploy, elige un nombre y una zona para tu instancia de MiniKF y deja las opciones predeterminadas. Luego, haz clic en el botón Implementar:

7d5f7d17a80a1930.png

Espera a que se inicie la instancia de procesamiento de MiniKF:

5228086caadc44c6.png

Accede a MiniKF

Cuando la VM de MiniKF esté en funcionamiento, haz clic en el botón SSH para conectarte y acceder. Sigue las instrucciones en pantalla para ejecutar el comando minikf, que iniciará la implementación de Minikube, Kubeflow y Rok. Este proceso tardará unos minutos en completarse.

774e83c3e96cf7b3.png

Accede a Kubeflow

Cuando se complete la instalación y todos los Pods estén listos, visita el panel de MiniKF. Accede a Kubeflow con el nombre de usuario y la contraseña de MiniKF:

251b0bcdbf6d3c71.png

9d49d899bb0b5bd1.png

Los usuarios de Chrome verán esta pantalla:

6258e0f09e46a6c2.png

Los usuarios de Firefox verán esta pantalla:

8cff90ce2f0670bd.png

Los usuarios de Safari verán esta pantalla:

1c6fd768d71c0a92.png

Accede a Rok

Después de acceder a Kubeflow, haz clic en el ícono de hamburguesa para abrir el menú de la izquierda. Haz clic en Snapshots y accede a Rok con el nombre de usuario y la contraseña de MiniKF.

16171f35a935a9af.png

80aad6ba5d298a7e.png

¡Felicitaciones! Implementaste correctamente MiniKF en GCP. Ahora puedes crear notebooks, escribir tu código de AA, ejecutar Kubeflow Pipelines y usar Rok para el control de versiones y la reproducibilidad de los datos.

4. Ejecuta una canalización desde tu notebook

En esta sección, ejecutarás el ejemplo de identificación de razas de perros, un proyecto del nanogrado de IA de Udacity. Dada una imagen de un perro, el modelo final proporcionará una estimación de la raza del perro.

Crea un servidor de notebook en tu clúster de Kubeflow

Navega al vínculo Notebooks en el panel central de Kubeflow.

60825e935fd0f39b.png

Haz clic en New Server.

f9303c0a182e47f5.png

Especifica un nombre para tu servidor de notebook.

a2343f30bc9522ab.png

Asegúrate de haber seleccionado la siguiente imagen de Docker (ten en cuenta que la etiqueta de la imagen puede diferir):

gcr.io/arrikto/jupyter-kale:f20978e

Agrega un volumen de datos nuevo y vacío de 5 GB y asígnale el nombre data.

8544d9b05826b316.png

Haz clic en Launch para crear el servidor de notebooks.

28c024bcc55cc70a.png

Cuando el servidor de notebooks esté disponible, haz clic en Conectar para conectarte a él.

52f1f8234988ceaa.png

Descarga los datos y el notebook

Se abrirá una nueva pestaña con la página de destino de JupyterLab. Crea una terminal nueva en JupyterLab.

ab9ac96f1a1f0d09.png

En la ventana de la terminal, ejecuta estos comandos para navegar a la carpeta data y descargar el notebook y los datos que usarás durante el resto del lab:

cd data/
git clone https://github.com/kubeflow-kale/kale

El repositorio clonado contiene una serie de ejemplos seleccionados con datos y notebooks anotados.

En la barra lateral, navega a la carpeta data/kale/examples/dog-breed-classification/ y abre el notebook dog-breed.ipynb.

2bc436465522f65b.png

Explora el código de AA del ejemplo de identificación de razas de perros

Por el momento, no ejecutes las celdas que descargan los conjuntos de datos, ya que usarás algunos conjuntos de datos más pequeños incluidos en el repositorio que acabas de clonar. Si ejecutas este ejemplo a tu propio ritmo desde tu casa, puedes descargar los conjuntos de datos.

Ejecuta la celda imports para importar todas las bibliotecas necesarias. Ten en cuenta que el código falla porque falta una biblioteca:

5e2b97ab2512f139.png

Normalmente, deberías crear una nueva imagen de Docker para poder ejecutar este notebook como una canalización de Kubeflow y, así, incluir las bibliotecas recién instaladas. Afortunadamente, Rok y Kale se aseguran de que las bibliotecas que instales durante el desarrollo lleguen a tu canalización, gracias a la tecnología de instantáneas de Rok y a que Kale monta esos volúmenes de instantáneas en los pasos de la canalización.

Ejecuta la siguiente celda para instalar la biblioteca faltante:

c483da77943a6f01.png

Haz clic en el ícono de Reiniciar para reiniciar el kernel del notebook:

376b5203209c2c91.png

Vuelve a ejecutar la celda imports con las bibliotecas correctas instaladas y observa cómo se ejecuta correctamente.

Cómo convertir tu notebook en una canalización en Kubeflow Pipelines

Para habilitar Kale, haz clic en el ícono de Kubeflow en el panel izquierdo del notebook:

7b96241f2ab6c389.png

Haz clic en el control deslizante del Panel de implementación de Kale para habilitar Kale:

804cfbf9d76b7e23.png

Explora las dependencias por celda dentro del notebook. Observa cómo varias celdas de notebook pueden formar parte de un solo paso de la canalización, como se indica con las barras de color a la izquierda de las celdas, y cómo un paso de la canalización puede depender de pasos anteriores, como se indica con las etiquetas depends on sobre las celdas. Por ejemplo, la siguiente imagen muestra varias celdas que forman parte del mismo paso de la canalización. Tienen el mismo color rojo y dependen de un paso anterior de la canalización.

fcd0fb351cdfb359.png

Haz clic en el botón Compile and Run:

18f2f6f0e12393d5.png

Ahora Kale se hace cargo y compila tu notebook convirtiéndolo en una canalización de Kubeflow Pipelines. Además, como Kale se integra con Rok para tomar instantáneas del volumen de datos del notebook actual, puedes ver el progreso de la instantánea. Rok se encarga del control de versiones de los datos y de reproducir todo el entorno tal como estaba cuando hiciste clic en el botón Compile and Run. De esta manera, tendrás una máquina del tiempo para tus datos y código, y tu canalización se ejecutará en el mismo entorno en el que desarrollaste tu código, sin necesidad de compilar nuevas imágenes de Docker.

de1b88af76df1a9a.png

La canalización se compiló y subió a Kubeflow Pipelines. Ahora haz clic en el vínculo para ir a la IU de Kubeflow Pipelines y ver la ejecución.

e0b467e2e7034b5d.png

La IU de Kubeflow Pipelines se abrirá en una pestaña nueva. Espera a que finalice la ejecución.

21a9d54a57f3e20c.png

39e6fa39516d2773.png

¡Felicitaciones! Acabas de ejecutar una canalización de extremo a extremo en Kubeflow Pipelines, comenzando desde tu notebook.

5. Aprendizaje por transferencia con ajuste de hiperparámetros

Examina los resultados

Consulta los registros del paso cnn-from-scratch. (Haz clic en el paso del gráfico en la IU de Kubeflow Pipelines y, luego, en la pestaña Registros). Este es el paso en el que entrenaste una red neuronal convolucional (CNN) desde cero. Observa que el modelo entrenado tiene una exactitud muy baja y, además, este paso tardó mucho en completarse.

62bf0835e9896c67.png

Echa un vistazo a los registros del paso cnn-vgg16. En este paso, usaste el aprendizaje por transferencia en el modelo VGG-16 previamente entrenado, una red neuronal entrenada por el Visual Geometry Group (VGG). La precisión es mucho mayor que la del modelo anterior, pero aún podemos mejorarla.

2b45072da65e20ae.png

Ahora, observa los registros del paso cnn-resnet50. En este paso, usaste el aprendizaje por transferencia en el modelo ResNet-50 entrenado previamente. La precisión es mucho mayor. Por lo tanto, este es el modelo que usarás durante el resto del codelab.

a1dc84ea48a87820.png

Ajuste de hiperparámetros

Vuelve al servidor de notebooks en la IU de Kubeflow y abre el notebook llamado dog-breed-katib.ipynb (en la ruta de acceso data/kale/examples/dog-breed-classification/). En este notebook, ejecutarás algunos experimentos de ajuste de hiperparámetros en el modelo ResNet-50 con Katib. Observa que tienes una celda al principio del notebook para declarar parámetros:

87b9f6c98dc1823e.png

En el panel izquierdo del notebook, habilita HP Tuning with Katib para ejecutar el ajuste de hiperparámetros:

a518eba74d341139.png

Luego, haz clic en Set up Katib Job para configurar Katib:

f4e34fff6a93aa60.png

Define el espacio de búsqueda para cada parámetro y define un objetivo:

cfc6b7bcdc685a02.png

Haz clic en el botón Compile and Run Katib Job:

f9c1ab0a6a3c5e8d.png

Observa el progreso del experimento de Katib:

f3514011876564db.png

Haz clic en Ver para ver el experimento de Katib:

ab2f5a5edd48e8dc.png

Haz clic en Listo para ver las ejecuciones en Kubeflow Pipelines (KFP):

410a843b6f044a4b.png

En la página del experimento de Katib, verás las nuevas pruebas:

a511dca519580133.png

En la IU de KFP, verás las ejecuciones nuevas:

43dd34ee2b75018d.png

Analicemos lo que acaba de suceder. Anteriormente, Kale producía una ejecución de canalización a partir de un notebook, y ahora crea varias ejecuciones de canalización, en las que cada una se alimenta con una combinación diferente de argumentos.

Katib es el componente de Kubeflow para ejecutar trabajos de ajuste de hiperparámetros de uso general. Katib no sabe nada sobre los trabajos que realmente ejecuta (llamados pruebas en la jerga de Katib). A Kale solo le importa el espacio de búsqueda, el algoritmo de optimización y el objetivo. Katib admite la ejecución de trabajos simples (es decir, Pods) como pruebas, pero Kale implementa un shim para que las pruebas ejecuten canalizaciones en Kubeflow Pipelines y, luego, recopilen las métricas de las ejecuciones de canalización.

A medida que el experimento de Katib produce pruebas, verás más pruebas en la IU de Katib:

3e854d3d4bb766c.png

Y más ejecuciones en la IU de KFP:

ffd30dcefa739962.png

Cuando se complete el experimento de Katib, podrás ver todas las pruebas en la IU de Katib:

9096ae9caa77e42a.png

Y todas las ejecuciones en la IU de KFP:

7acc64dfee4f35a3.png

Si vuelves al notebook, verás un botón de información junto al experimento de Katib dentro del panel de Kale:

95b092180d71dc80.png

Haz clic en él y verás el mejor resultado y los parámetros que lo produjeron:

3b0ce47e548e5afb.png

6. Limpia

Destruye la VM de MiniKF

Navega a Deployment Manager en GCP Console y borra la implementación de minikf-on-gcp.

7. Felicitaciones

¡Felicitaciones! Ejecutaste correctamente un flujo de trabajo de ciencia de datos de extremo a extremo con Kubeflow (MiniKF), Kale y Rok.

¿Qué sigue?

Únete a la comunidad de Kubeflow:

Lecturas adicionales