Ejecutando comandos con Snakemake
Última actualización: 2025-04-05 | Mejora esta página
Tiempo estimado: 60 minutos
Hoja de ruta
Preguntas
- “¿Cómo ejecuto un comando simple con Snakemake?”
Objetivos
- “Crea una receta de Snakemake (un Snakefile)”
¿Cuál es el flujo de trabajo que me interesa?
En esta lección haremos un experimento que toma una aplicación que corre en paralelo e investigará su escalabilidad. Para ello necesitaremos recopilar datos, en este caso eso significa ejecutar la aplicación varias veces con diferentes números de núcleos de CPU y registrar el tiempo de ejecución. Una vez hecho esto, tenemos que crear una visualización de los datos para ver cómo se compara con el caso ideal.
A partir de la visualización podemos decidir a qué escala tiene más sentido ejecutar la aplicación en producción para maximizar el uso de nuestra asignación de CPU en el sistema.
Podríamos hacer todo esto manualmente, pero existen herramientas útiles que nos ayudan a gestionar pipelines de análisis de datos como el que tenemos en nuestro experimento. Hoy vamos a aprender acerca de uno de ellos: Snakemake.
Con el fin de empezar con Snakemake, vamos a empezar por tomar un
comando simple y ver cómo podemos ejecutar que a través de Snakemake.
Elijamos el comando hostname
que imprime el nombre del host
donde se ejecuta el comando:
SALIDA
node1.int.jetstream2.hpc-carpentry.org
Eso imprime el resultado pero Snakemake se basa en archivos para conocer el estado de su flujo de trabajo, así que vamos a redirigir la salida a un archivo:
Creando un archivo Snakefile
Edita un nuevo archivo de texto llamado Snakefile
.
Contenido de Snakefile
:
PYTHON
rule hostname_login:
output: "hostname_login.txt"
input:
shell:
"hostname > hostname_login.txt"
Puntos clave sobre este archivo
- El archivo se llama
Snakefile
- con mayúsculaS
y sin extensión de archivo. - Algunas líneas tienen sangría. Las sangrías deben ser con caracteres de espacio, no tabuladores. Consulte la sección de configuración para saber cómo hacer que su editor de texto haga esto.
- La definición de la regla comienza con la palabra clave
rule
seguida por el nombre de la regla, luego dos puntos. - Llamamos a la regla
hostname_login
. Puede utilizar letras, números o guiones bajos, pero el nombre de la regla debe comenzar con una letra y no puede ser una palabra clave. - Las palabras clave
input
,output
, yshell
van todas seguidas de dos puntos (“:”). - Los nombres de los archivos y el comando shell están todos en
"quotes"
. - El nombre del archivo de salida se da antes del nombre del archivo de entrada. De hecho, a Snakemake no le importa en qué orden aparecen, pero en este curso daremos primero el de salida. Pronto veremos por qué.
- En este caso de uso no hay fichero de entrada para el comando por lo que lo dejamos en blanco.
De vuelta en el shell ejecutaremos nuestra nueva regla. En este punto, si faltaran comillas, sangrías incorrectas, etc., podríamos ver un error.
bash: snakemake: command not found...
Si tu shell te dice que no puede encontrar el comando
snakemake
entonces tenemos que hacer que el software esté
disponible de alguna manera. En nuestro caso, esto significa buscar el
módulo que necesitamos cargar:
SALIDA
[ocaisa@node1 ~]$ module spider snakemake
--------------------------------------------------------------------------------------------------------
snakemake:
--------------------------------------------------------------------------------------------------------
Versions:
snakemake/8.2.1-foss-2023a
snakemake/8.2.1 (E)
Names marked by a trailing (E) are extensions provided by another module.
--------------------------------------------------------------------------------------------------------
For detailed information about a specific "snakemake" package (including how to load the modules) use the module's full name.
Note that names that have a trailing (E) are extensions provided by other modules.
For example:
$ module spider snakemake/8.2.1
--------------------------------------------------------------------------------------------------------
Ahora queremos el módulo, así que vamos a cargarlo para que el paquete esté disponible
y luego asegúrate de que tenemos el comando snakemake
disponible
SALIDA
/cvmfs/software.eessi.io/host_injections/2023.06/software/linux/x86_64/amd/zen3/software/snakemake/8.2.1-foss-2023a/bin/snakemake
Ejecutando Snakemake
Ejecute snakemake --help | less
para ver la ayuda de
todas las opciones disponibles. ¿Qué hace la opción -p
en
el comando snakemake
anterior?
- Protege los archivos de salida existentes
- Imprime en el terminal los comandos shell que se están ejecutando
- Le dice a Snakemake que sólo ejecute un proceso a la vez
- Solicita al usuario el fichero de entrada correcto
Puedes buscar en el texto pulsando /, y salir de nuevo al shell con q.
- Imprime en el terminal los comandos shell que se están ejecutando
¡Esto es tan útil que no sabemos por qué no está por defecto! La
opción -j1
es lo que le dice a Snakemake que sólo ejecute
un proceso a la vez, y nos quedaremos con esto por ahora ya que hace las
cosas más simples. La respuesta 4 es totalmente falsa, ya que Snakemake
nunca solicita interactivamente la entrada del usuario.
Puntos Clave
- “Antes de ejecutar Snakemake necesitas escribir un Snakefile”
- “Un Snakefile es un archivo de texto que define una lista de reglas”
- “Las reglas tienen entradas, salidas y comandos de shell a ejecutar”
- “Le dices a Snakemake qué archivo hacer y ejecutará el comando shell definido en la regla apropiada”