Simplifica la creación y mantenimiento de DAG en Airflow con Hamilton en 8 minutos

Simplifica DAG en Airflow con Hamilton en 8 min.

Cómo Hamilton puede ayudarte a escribir DAGs de Airflow más mantenibles

Una representación abstracta de cómo se relacionan Airflow y Hamilton. Airflow ayuda a unirlo todo, mientras que Hamilton hace que los entresijos sean manejables. Imagen de Pixabay.

Esta publicación está escrita en colaboración con Thierry Jean y originalmente apareció aquí.

Esta publicación te guiará a través de los beneficios de tener dos proyectos de código abierto, Hamilton y Airflow, y cómo sus grafos dirigidos acíclicos (DAGs) trabajan en conjunto. A alto nivel, Airflow se encarga de la orquestación (pensando a nivel macro) y Hamilton ayuda a crear transformaciones de datos limpias y mantenibles (pensando a nivel micro).

Para aquellos que no están familiarizados con Hamilton, les recomendamos una descripción interactiva en tryhamilton.dev, o nuestros otros artículos, como este. De lo contrario, hablaremos de Hamilton a alto nivel y señalaremos la documentación de referencia para más detalles. Como referencia, soy uno de los co-creadores de Hamilton.

Para aquellos que todavía están tratando de entender cómo pueden funcionar juntos, la razón por la que puedes ejecutar Hamilton con Airflow es que Hamilton es solo una biblioteca con una pequeña huella de dependencia, por lo que se puede agregar Hamilton a la configuración de Airflow en poco tiempo.

Para recapitular, Airflow es el estándar de la industria para orquestar pipelines de datos. Impulsa todo tipo de iniciativas de datos, incluyendo ETL, pipelines de aprendizaje automático y BI. Desde su inicio en 2014, los usuarios de Airflow han enfrentado ciertos problemas en cuanto a la autoría y el mantenimiento de pipelines de datos:

  1. Gestionar de manera mantenible la evolución de los flujos de trabajo; lo que comienza siendo simple puede volverse inevitablemente complejo.
  2. Escribir código modular, reutilizable y testeable que se ejecute dentro de una tarea de Airflow.
  3. Hacer un seguimiento de la línea de código y los artefactos de datos que produce un DAG de Airflow.

¡Aquí es donde creemos que Hamilton puede ayudar! Hamilton es un micro-framework de Python para escribir transformaciones de datos. En resumen, se escriben funciones en Python en un estilo “declarativo”, que Hamilton analiza y conecta en un grafo en base a sus nombres, argumentos y anotaciones de tipo. Se pueden solicitar salidas específicas y Hamilton ejecutará el camino de función requerido para producirlas. Debido a que no proporciona capacidades de orquestación a nivel macro, se combina muy bien con Airflow al ayudar a los profesionales de datos a escribir código más limpio y reutilizable para los DAGs de Airflow.

El paradigma de Hamilton en una imagen. Este ejemplo muestra cómo se podría mapear código procedural de pandas a funciones de Hamilton que definen un DAG. Nota: Hamilton se puede utilizar para cualquier tipo de objeto Python, no solo para Pandas. Imagen del autor.

Escribir DAGs de Airflow mantenibles

Un uso común de Airflow es ayudar con machine learning/ciencia de datos. Ejecutar este tipo de cargas de trabajo en producción a menudo requiere flujos de trabajo complejos. Una decisión de diseño necesaria con Airflow es determinar cómo dividir el flujo de trabajo en tareas de Airflow. Si se crea demasiadas, se aumenta la sobrecarga de programación y ejecución (por ejemplo, mover muchos datos), si se crea muy pocas, se tienen tareas monolíticas que pueden tardar mucho en ejecutarse, pero probablemente sean más eficientes de ejecutar. El compromiso aquí es la complejidad del DAG de Airflow versus la complejidad del código dentro de cada tarea. Esto hace que la depuración y el razonamiento sobre el flujo de trabajo sean más difíciles, especialmente si no se ha sido el autor del DAG de Airflow inicial. Más a menudo que no, la estructura de tareas inicial del DAG de Airflow se vuelve fija, ¡porque refactorizar el código de las tareas se vuelve prohibitivo!

Aunque los DAGs más simples como A->B->C son deseables, hay una tensión inherente entre la simplicidad de la estructura y la cantidad de código por tarea. Cuanto más código por tarea, más difícil es identificar los puntos de falla, a costa de posibles eficiencias computacionales, pero en caso de fallas, los reintentos aumentan en costo con el “tamaño” de la tarea.

Opciones de estructura DAG de Airflow: ¿cuántas tareas? ¿cuánto código por tarea? Imagen del autor.

En cambio, ¿qué pasaría si pudieras manejar simultáneamente la complejidad dentro de una tarea de Airflow, sin importar el tamaño del código dentro de ella, y obtener la flexibilidad de cambiar fácilmente la forma del DAG de Airflow con un esfuerzo mínimo? Ahí es donde entra en juego Hamilton.

Con Hamilton, puedes reemplazar el código dentro de cada tarea de Airflow con un DAG de Hamilton, donde Hamilton maneja la “micro” orquestación del código dentro de la tarea. Nota: Hamilton en realidad te permite modelar lógicamente todo lo que desees que un DAG de Airflow haga. Más sobre eso a continuación.

Para usar Hamilton, cargas un módulo de Python que contiene tus funciones de Hamilton, instancias un controlador de Hamilton y ejecutas un DAG de Hamilton dentro de una tarea de Airflow en unas pocas líneas de código. Al usar Hamilton, puedes escribir tu transformación de datos con una granularidad arbitraria, lo que te permite inspeccionar en detalle qué hace cada tarea de Airflow.

Específicamente, los pasos del código son:

  1. Importa tus módulos de funciones
  2. Pásalos al controlador de Hamilton para construir el DAG.
  3. Luego, llama a Driver.execute() con las salidas que deseas ejecutar del DAG que has definido.

Echemos un vistazo a un código que crea un DAG de Airflow de un solo nodo pero utiliza Hamilton para entrenar y evaluar un modelo de ML:

Ahora, no mostramos el código de Hamilton aquí, pero los beneficios de este enfoque son:

  1. Pruebas unitarias e de integración. Hamilton, a través de sus requisitos de nombres y anotaciones de tipo, impulsa a los desarrolladores a escribir código Python modular. Esto resulta en módulos de Python adecuados para pruebas unitarias. Una vez que tu código Python ha pasado las pruebas unitarias, puedes desarrollar pruebas de integración para asegurarte de que se comporte correctamente en tus tareas de Airflow. En contraste, probar el código contenido en una tarea de Airflow es menos trivial, especialmente en entornos de CI/CD, ya que requiere tener acceso a un entorno de Airflow.
  2. Reutilización de transformaciones de datos. Este enfoque mantiene el código de transformación de datos en módulos de Python, separados del archivo DAG de Airflow. ¡Esto significa que este código también se puede ejecutar fuera de Airflow! Si vienes del mundo de la analítica, debería ser similar a desarrollar y probar consultas SQL en un archivo externo .sql, y luego cargarlo en tus operadores de Postgres en Airflow.
  3. Reorganiza tu DAG de Airflow fácilmente. El esfuerzo requerido para cambiar tu DAG de Airflow ahora es mucho menor. Si modelas lógicamente todo en Hamilton, por ejemplo, un pipeline de aprendizaje automático de principio a fin, solo es cuestión de determinar cuánto de este DAG de Hamilton debe calcularse en cada tarea de Airflow. Por ejemplo, puedes cambiar el número de tareas de una tarea monolítica de Airflow a unas pocas o a muchas; todo lo que necesitarías cambiar es lo que solicitas a Hamilton, ya que tu DAG de Hamilton no necesita cambiar en absoluto.

Desarrollo iterativo con Hamilton y Airflow

En la mayoría de los proyectos de ciencia de datos, sería imposible escribir el DAG del sistema final desde el primer día, ya que los requisitos cambiarán. Por ejemplo, el equipo de ciencia de datos podría querer probar diferentes conjuntos de características para su modelo. Hasta que la lista esté establecida y finalizada, probablemente no sea deseable tener el conjunto de características en tu código fuente y bajo control de versiones; sería preferible utilizar archivos de configuración.

Airflow admite configuraciones de DAG predeterminadas y en tiempo de ejecución y registrará estos ajustes para que cada ejecución del DAG sea reproducible. Sin embargo, agregar comportamientos configurables requerirá agregar declaraciones condicionales y complejidad al código de tu tarea de Airflow. Este código podría volverse obsoleto durante el proyecto o solo ser útil en escenarios particulares, lo que finalmente disminuye la legibilidad de tus DAG.

En cambio, Hamilton puede utilizar la configuración en tiempo de ejecución de Airflow para ejecutar diferentes transformaciones de datos del grafo de funciones sobre la marcha. Este enfoque en capas puede aumentar en gran medida la expresividad de los DAG de Airflow al tiempo que mantiene la simplicidad estructural. Alternativamente, Airflow puede generar dinámicamente nuevos DAGs a partir de configuraciones, pero esto podría disminuir la observabilidad y algunas de estas características siguen siendo experimentales.

Interfaz de usuario de Airflow para la configuración de ejecución del DAG. Imagen del autor.

Si trabajas en un modelo de entrega, este enfoque promueve una separación de responsabilidades entre los ingenieros de datos responsables del sistema de producción de Airflow y los científicos de datos encargados de desarrollar soluciones empresariales escribiendo código Hamilton. Esta separación también puede mejorar la consistencia de los datos y reducir la duplicación de código. Por ejemplo, se puede reutilizar un solo DAG de Airflow con diferentes módulos Hamilton para crear diferentes modelos. De manera similar, las mismas transformaciones de datos de Hamilton se pueden reutilizar en diferentes DAG de Airflow para alimentar paneles de control, API, aplicaciones, etc.

A continuación se muestran dos imágenes. La primera ilustra el DAG de alto nivel de Airflow que contiene dos nodos. La segunda muestra el DAG de Hamilton de bajo nivel del módulo Python evaluate_model importado en la tarea de Airflow train_and_evaluate_model.

1. Interfaz de usuario de Airflow: DAG de Airflow de Ausentismo
2. Visualización del controlador de Hamilton: gráfico de funciones para evaluate_model.py

Manejo de artefactos de datos

Los proyectos de ciencia de datos producen una gran cantidad de artefactos de datos, como conjuntos de datos, evaluaciones de rendimiento, figuras, modelos entrenados, etc. Los artefactos necesarios cambiarán a lo largo del ciclo de vida del proyecto (exploración de datos, optimización de modelos, depuración en producción, etc.). Esto es un problema para Airflow, ya que eliminar una tarea de un DAG eliminará su historial de metadatos y romperá la jerarquía de artefactos. En ciertos escenarios, producir artefactos de datos innecesarios o redundantes puede incurrir en costos significativos de computación y almacenamiento.

Hamilton puede proporcionar la flexibilidad necesaria para la generación de artefactos de datos a través de su API de guardado de datos. Las funciones decoradas con @save_to.* añaden la posibilidad de almacenar su salida, solo es necesario solicitar esta funcionalidad a través de Driver.execute(). En el código a continuación, llamar a validation_predictions_table devolverá la tabla, mientras que llamar al valor output_name_ de save_validation_predictions devolverá la tabla y la guardará en .csv

Esta flexibilidad adicional permite a los usuarios alternar fácilmente los artefactos generados y se puede hacer directamente a través de la configuración en tiempo de ejecución de Airflow, sin editar el DAG de Airflow o los módulos de Hamilton.

Además, el gráfico de funciones de Hamilton de granularidad fina permite una línea de datos y procedencia precisa. Las funciones de utilidad what_is_downstream_of() y what_is_upstream_of() ayudan a visualizar y explorar programáticamente las dependencias de datos. Recomendamos a los lectores interesados buscar más detalles aquí.

Para terminar y un ejemplo para comenzar

Esperamos haberle impresionado hasta ahora que combinar Hamilton con Airflow le ayudará con los desafíos de creación y mantenimiento de DAG de Airflow. Dado que este es un post corto, para concluir, pasemos al código que tenemos en el repositorio de Hamilton para usted.

Para ayudarlo a comenzar, tenemos un ejemplo de cómo usar Hamilton con Airflow. Debería cubrir todos los conceptos básicos que necesita para empezar. En el README se explica cómo configurar Airflow con Docker, para que no tenga que preocuparse por instalar dependencias solo para jugar con el ejemplo.

En cuanto al código del ejemplo, contiene dos DAG de Airflow, uno que muestra un “cómo hacer” básico de Hamilton para crear “características” para entrenar un modelo, y otro que es un ejemplo de proyecto de aprendizaje automático más completo, que realiza una canalización de extremo a extremo completa de creación de características y luego ajuste y evaluación de un modelo. Para ambos ejemplos, encontrará el código de Hamilton en la carpeta de complementos.

Qué se espera ver en el ejemplo de Airflow. Imagen del autor.

Si tiene preguntas o necesita ayuda, únase a nuestro Slack. De lo contrario, para obtener más información sobre las características y funcionalidades de Hamilton, le recomendamos consultar la documentación de Hamilton.

Referencias y Lecturas Adicionales

Gracias por echar un vistazo a esta publicación. Si quieres profundizar o aprender más sobre Hamilton, tenemos los siguientes enlaces para que los explores:

  • Ejemplo de código de Hamilton + Airflow
  • Documentación de Hamilton
  • tryhamilton.dev: una forma interactiva de aprender más sobre Hamilton.
  • Para otro sistema de orquestación que se integra con Hamilton, puedes consultar Hamilton + Metaflow.
  • Comunidad de Hamilton en Slack
  • Lineage + Hamilton en 10 minutos
  • Presentando Hamilton (historia y presentación)
  • Hamilton + Pandas en 5 minutos
  • Cómo usar Hamilton en un entorno de Notebook

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Desbloqueando la transparencia de la IA Cómo el agrupamiento de características de Anthropic mejora la interpretabilidad de las redes neuronales

En un reciente artículo, “Hacia la monosemanticidad: descomposición de modelos de lenguaje con aprendizaje de d...

Noticias de Inteligencia Artificial

Fármaco diseñado por inteligencia artificial listo para ensayos en humanos.

Una empresa biotecnológica, Insilico Medicine, respaldada por el conglomerado chino Fosun Group y el gigante de capit...

Inteligencia Artificial

Microsoft Research lanza el 'Cuarteto de Heavy Metal' de los compiladores de IA Rammer, Roller, Welder y Grinder

La evolución de los modelos de inteligencia artificial (IA) y los aceleradores de hardware ha traído desafíos únicos ...

Inteligencia Artificial

Innovaciones autónomas en un mundo incierto

Jonathan How y su equipo en el Laboratorio de Controles Aeroespaciales desarrollan algoritmos de planificación que pe...

Inteligencia Artificial

Investigadores de NTU Singapur proponen OtterHD-8B un innovador modelo de IA multimodal evolucionado a partir de Fuyu-8B

Investigadores de S-Lab, Universidad Tecnológica de Nanyang, Singapur, presentan OtterHD-8B, un innovador modelo mult...