Cómo usar Github Actions para Data Science

En este post te voy a explicar qué es Github Actions y cómo usar Github Actions para Data Science. ¡Vamos con ello!

Qué es Github Actions

Github Actions es un servicio ofrecido por Github que pone a nuestra disposición distintos tipos de máquinas virtuales (Linux, Windows, MacOs, etc.) con las que poder hacer automatizaciones.

En un principio, Github Actions está pensado para realizar automatizaciones dentro de Github para así poder facilitar ciertas tareas a los desarrolladores.

Sin embargo, como científicos de datos, Github Actions nos abre una puerta muy interesante para realizar automatizaciones de cara a cuestiones como extracción de datos o reentrenamiento de modelos, entre otros, ya sea que trabajamos con Python, R o cualquier otro lenguaje.

Además, como no podía ser de otra manera, Github Actions se integra a la perfección con Github, que es una de las herramientas más utilizadas por los data scientist como repositorio de código.

Por otro lado, en lo que a precios respecta, Github Actions cuenta con dos grandes grupos según el tipo de repositorio que del que se trate:

  • Repositorios públicos: el servicio es gratuito.
  • Repositorios privados: tanto el almacenamiento como los tiempos de ejecución dependerá del tipo de repositorio que tengas, tal como aparecen en este enlace.

Hasta aquí seguro que te suena bien. Pero, ¿qué casos de uso le podemos dar a Github Actions para Data Science? ¡Veámoslo!

Casos de uso de Github Actions para DataScience

A continuación te listo alguno de los casos de uso que le puedes dar a Github Actions para Data Science:

  • Automatizar procesos ETL sencillos. En mi caso, por ejemplo, he automatizado la extracción de datos de una API en tiempo real que no guarda histórico (enlace). Además, también se puede realizar automatizaciones para crear dashboards que interesan a la comunidad, como ha hecho Rami Krispin con su dashboard sobre la electricidad (enlace).
  • Puesta en producción de algoritmos mediante MLOps: con Github Actions podemos automatizar el reentrenamiento de los modelos de una forma sencilla.
  • Creación de sistemas de alertas a herramientas como Slack.
  • Ejecución de tests de código o de comparación de modelos.
  • Automatizar el merge de un pull request.
  • Automatizar el build y el push de imágenes de Docker.

Como ves, no son pocos los usos que puede tener esta herramienta. Y sí, en el fondo varios de estos puntos se podrían sustituir por automatizaciones en Cloud, pero si tu proyecto es open source o si siendo un proyecto privado no tienes cosas en la nube o la automatización no supondrá grandes recursos económicos, en mi opinión, Github Actions te servirá perfectamente.

Dicho esto, sigamos con el tutorial de Github Actions viendo cómo funciona. ¡Vamos a ello!

Cómo funciona Github Actions

Cómo crear un workflow en Github Actions

Para crear un workflow en Github Actions debemos crear un fichero con la terminación .yaml dentro de la subcarpeta .github/workflows. Este fichero es el que dará a Github la siguiente información:

  • Dar un nombre a nuestro workflow.
  • Cómo o cuándo se debe ejecutar este automatismo.
  • El tipo de máquina virtual a utilizar.
  • Paso a paso, qué comandos debe ejecutar Github.

Si subimos a Github un fichero en este directorio, automáticamente sin que nosotros hagamos nada Github lo entederá como un workflow y ejecutará lo que nosotros hayamos indicado exactamente cuando lo hemos indicado.

Ahora que entiendes cómo crear, a grandes rasgos, un workflow de Github Actions, veamos paso a paso todos los componentes que tiene.

Cómo definir el trigger de un workflow de Github Actions

La primera parte del fichero .yaml nos sirve para definir cuándo queremos que se ejecute nuestro workflow.

En este sentido, vamos a ver los principales triggers que se suelen utilizar cuando usamos Github Actions para data science.

Si quieres ver todos los triggers que ofrece Github Actions, puedes encontrarlos todos aquí.

Asimismo, es importante resaltar que, aunque en cada ejemplo vemoa cada trigger por separado, un workflow puede tener uno o más triggers.

Dicho esto, veamos cuáles son los principales triggers de Github Actions para data science:

Lanzar workflow de Github Actions de forma periódica

permite realizar la ejecución de forma automatizada en un momento concreto, ya sea cada hora, el primer día de la semana o cada 5 días, por ejemplo.

La ejecución la indicaremos usando usando syntaxis cron, igual que ocurre en la automatización de ficheros de Python en Cloud.

Por si no sabes en qué consiste la sintáxis Cron, simplemente tenemos 5 dígitos seguidos y cada uno hace referencia a un momento determinado:

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of the week (0 - 6)
│ │ │ │ │                                   
│ │ │ │ │
│ │ │ │ │

Por ejemplo, si usamos un cron 0 * * * *, el fichero se ejecutará cada vez que el minuto llegue a 0, es decir, cada hora.

Si quieres hacer pruebas para entender bien cómo funciona Cron, te recomiendo que revises Crontab.guru

Dicho esto, un workflow automatizado mediante schedule empieza de la siguiente manera:

on:
  schedule:
    - cron: '0 * * * *' #Every hour 

Cómo lanzar un workflow de Github Actions de forma manual

Para lanzar un workflow de Github Actions de forma manual, debemos usar el trigger workflow_dispatch.

De esta forma, cuando seleccionemos nuestro worflow dentro de la pestaña Actions de Github, nos aparecerá la opción Run workflow. Como se muestra en la siguiente imagen:

Manual Trigger en Github Actions

Al hacer clic en el botón verde Run workflow, el workflow se ejecutará.

Generalmente los workflows suelen ejecutarse de forma automatizada. Sin embargo, es interesante añadir un trigger manual para cuando se quiere demostrar el funcionamiento del automatismo a terceras personas.

Por otro lado, declarar la ejecución manual del workflow a nivel de código es bastante sencillo:

on:
  workflow_dispatch: 

Lanzar un workflow mediante una petición HTTP

En muchas ocasiones, cuando usamos Github Actions para Data Science queremos que un workflow se ejecute cuando nosotros digamos.

Por ejemeplo, supongamos que vamos a usar Github Actions para crear un proceso de MLOps (este punto lo abordaré en un próximo post). En MLOps, tendremos un sistema que analice la capacidad predictiva de modelo. De esta forma, cuando la capacidad predictiva del modelo baje de un límite, deberá ejecutarse el reentrenamiento del modelo.

Bien, suponiendo que reentrenar el modelo es un workflow, este debería ejecutarse cuando se cumpla una condición. Así pues, la forma más sencilla de abordar esta cuestión es que el workflow de reentrenamiento tenga como trigger una request http.

Para ello, debemos fijar el trigger de nuestro workflow como repository_dispatch. Además, debemos incluir también un parámetro llamado types al cual le debemos dar un valor, tal como se muestra en el siguiente código:

on:
  repository_dispatch : 
    types: event_type

Siendo esto así, podemos ejecutar el workflow mediante un reques api. Para ello necesitaremos la siguiente información:

  • github_user: nombre del usuario de Github (viene en la URL de tu cuenta).
  • repo: nombre del repositorio donde reside el workflow (también viene en la URL de la repo).
  • GITHUB_TOKEN: token de tu cuenta de Github que puedes generar aquí. Este token debe tener permiso a tu repo y a los workflows.
  • event_type: valor que hayamos pasado al parámetro types.

En el siguiente fragmento te muestro cómo hacer la petición en Python:

    url = f'https://api.github.com/repos/{github_user}/{repo}/dispatches'

    # I make the request
    resp = requests.post(
        url,
        headers={'Authorization': f'token  {GITHUB_TOKEN}'},
        data = json.dumps({'event_type': event_type})
        )

Con esto ya sabemos cómo lanzar los workflows de Github Actions. Ahora, seguimos con el tutorial de Github Actions, viendo cómo elegir la máquina virtual donde correrá el workflow.

Cómo elegir el tipo de máquina virtual a utilizar en Github Actions

En la siguiente tabla indico las opciones de entornos que ofrece Github para cada máquina virtual, así como la etiqueta YAML que debemos usar para elegir dicha máquina virtual.

EntornoEtiqueta YAML
Ubuntu 20.04ubuntu-latest
Ubuntu 18.04ubuntu-18.04
macOS 11macos-11
macOS 10.15macos-latest or macos-10.15
Windows Server 2022windows-2022
Windows Server 2019windows-latest or windows-2019
Windows Server 2016windows-2016

Si quieres estar al día de las máquinas virtuales disponibles, puedes verlo en este enlace.

Asimismo, a nivel de código, la elección de la máquina virtual es muy sencilla, tal como se muestra en el siguiente fragmento de código:

jobs:
  build:
    runs-on: ubuntu-latest

Ahora que sabes cómo elegir la máquina virtual, seguimos con nuestro tutorial de Github Actions viendo cómo indicar a Github Actions qué debe ejecutar. ¡Vamos a ello!

Cómo indicar a Github Actions qué comandos debe ejecutar Github

Cuando hablamos de los steps que debe ejecutar Github Actions, lo primero de todo debemos distinguir dos tipos de steps: los predefinidos y los custom. Explico cada uno de ellos por separado.

Steps predefinidos en Github Actions

Los steps predefinidos son aquellas cuestiones que son muy utilzadas por todos los usuarios y que, por ello, desde Github han paquetizado para que a los usuarios nos sea más fácil definir todo el proceso. Para que te hagas una idea, sería similar a las imágenes de Docker que incluyen ya ciertas cuestiones, como Python, FastAPI, etc. (si quieres aprender más sobre Docker, te recomiendo que mires este post).

En este sentido, los pasos predefinidos más utilizados al usar Github Actions para Data Science son dos:

  1. Instalar el lenguaje de programación que vayamos a usar. Hay steps predefinidos para instalar python, java, go, node, .NET etc.
  2. Dar acceso a la máquina donde se ejecuta el Github Actions a nuestro repositorio.

Puedes encontrar todos los steps predefinidos en la repo oficial de Actions podéis encontrar todos los steps predefinidos.

Os pongo un ejemplo de como sería un YAML que contenga los dos pasos anteriormente mencionados y que corre sobre Ubuntu:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

      - name: Check out repo
        uses: actions/checkout@v2 

      - name: Configure Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.9.7' 

Como ves, en unas pocas lineas hemos creado una máquina virtual Ubuntu, que tiene acceso a nuestra repo y que además tiene Python instalado en la versión que le indicamos.

Vistos los steps predefinidos, ahora veamos cómo funcionan los steps custom en Github Actions

Steps custom en Github Actions

En lo que a steps custom se refiere, simplemente debemos definir dos cuestiones, con un tercer paso opcional:

  1. El nombre que le vamos a dar al paso. Todos los pasos (incluyendo los estándar), deben recibir un nombre, que es el que nos permite saber qué está ejecutando Github.
  2. El comando de consola que debe ejecutar, teniendo en cuenta que el código dependerá del tipo de máquina que hayamos elegido.
  3. Parámetros de la ejecución (opcional). Si el repositorio incluye parámetros, podemos establecer esos parámetros como variables de entorno de ejecución y bien pasárselos a nuestro código o que el propio código lo lea del entorno.

En el siguiente fragmento veréis cómo funcionan los step custom en Github Actions:

      ...

      - name: Install libraries
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Set env variable & exectue script
        env: 
          URI: ${{ secrets.URI }}
        run: python update_data.py

Conclusión de usar Github Actions para Data Science

Como ves, Github Actions es una herramienta muy sencilla pero a la vez muy potente y, en ocasiones, gratuita. Personalmente, siendo Github una herramienta muy usada en Data Science, creo que merece la pena conocer esta herramienta, ya que puede ayudarnos mucho en el día a día.

Como siempre, espero que este tutorial sobre Github Actions te haya gustado. Si es así y quieres estar al tanto de nuevos posts te animo a que te suscribas. ¡Nos vemos en el siguiente!