This shows you the differences between two versions of the page.
cluster [2019/10/03 14:07] osotolongo [Hard batching] |
cluster [2020/08/04 10:58] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Como usar el cluster sin morir en el intento ====== | ||
- | |||
- | [[https:// | ||
- | |||
- | El cluster (//brick//) consta de cuatro nodos (//brick00, brick01, brick02 y brick03//). Lo que sigue describe la operativa básica para ejecutar tareas en estas maquinas de una manera ordenada | ||
- | |||
- | {{ :: | ||
- | |||
- | El directorio // /nas// de detritus se monta como // /home// en cada uno de los //bricks// por lo que todo lo que se modifique en // detritus:/ | ||
- | |||
- | La presentacion inicial (hecha con pinpoint y exportada a pdf) se puede bajar de aqui: http:// | ||
- | |||
- | ===== como hacer que los nodos no pidan password ===== | ||
- | [[https:// | ||
- | |||
- | ** Esto es básico para el funcionamiento correcto del resto de las herramientas ** | ||
- | |||
- | Empezamos creando una clave RSA en nuestro directorio de detritus y moviendo la clave publica a un archivo que podamos identificar facilmente | ||
- | |||
- | <code bash> | ||
- | $ ssh-keygen | ||
- | $ mv $HOME/ | ||
- | </ | ||
- | |||
- | Ahora añadimos esta clave a la lista de claves autorizadas en el HOME de los nodos. Como hasta ahora no hay ninguna se puede hacer con //cp//. En caso de haber alguna se podría hacer con //cat//. Y no podemos olvidarnos de dar los permisos correctos! | ||
- | |||
- | En mi caso: | ||
- | |||
- | <code bash> | ||
- | $ mkdir / | ||
- | $ chmod 700 / | ||
- | $ cp ~/ | ||
- | $ chmod 600 / | ||
- | </ | ||
- | |||
- | A partir de ahora, cuando se entra de // | ||
- | |||
- | ===== como ejecutar la misma orden en varios nodos del cluster (pssh y mpssh) ===== | ||
- | [[https:// | ||
- | |||
- | == pssh == | ||
- | |||
- | - primero crear un archivo con la lista de hosts: | ||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat host.pssh | ||
- | osotolongo@brick01 | ||
- | osotolongo@brick02 | ||
- | osotolongo@brick03 | ||
- | </ | ||
- | |||
- | - despues ejecutar un comando en todas las maquinas | ||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ pssh -h host.pssh 'ps ax | grep ssh' | ||
- | [1] 13:11:46 [SUCCESS] osotolongo@brick03 | ||
- | [2] 13:11:46 [SUCCESS] osotolongo@brick02 | ||
- | [3] 13:11:46 [SUCCESS] osotolongo@brick01 | ||
- | </ | ||
- | == mpssh == | ||
- | |||
- | - la syntaxis cambia ligeramente, | ||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ mpssh -f host.pssh 'ps ax | grep ssh' | ||
- | MPSSH - Mass Parallel Ssh Ver.1.3.3 | ||
- | (c)2005-2013 Nikolay Denev < | ||
- | |||
- | [*] read (3) hosts from the list | ||
- | [*] executing "ps ax | grep ssh" as user " | ||
- | [*] spawning 3 parallel ssh sessions | ||
- | |||
- | brick01 -> 1920 ? Ss 0:00 / | ||
- | brick01 -> 73087 ? Ss 0:00 sshd: osotolongo [priv] | ||
- | brick01 -> 73090 ? S 0:00 sshd: osotolongo@notty | ||
- | brick01 -> 73091 ? Ss 0:00 bash -c ps ax | grep ssh | ||
- | brick01 -> 73101 ? S 0:00 grep ssh | ||
- | brick02 -> 1887 ? Ss 0:00 / | ||
- | brick02 -> 21242 ? Ss 0:00 sshd: osotolongo [priv] | ||
- | brick02 -> 21245 ? S 0:00 sshd: osotolongo@notty | ||
- | brick02 -> 21246 ? Ss 0:00 bash -c ps ax | grep ssh | ||
- | brick02 -> 21256 ? S 0:00 grep ssh | ||
- | brick03 -> 1928 ? Ss 0:00 / | ||
- | brick03 -> 21270 ? Ss 0:00 sshd: osotolongo [priv] | ||
- | brick03 -> 21273 ? S 0:00 sshd: osotolongo@notty | ||
- | brick03 -> 21274 ? Ss 0:00 bash -c ps ax | grep ssh | ||
- | brick03 -> 21284 ? S 0:00 grep ssh | ||
- | |||
- | Done. 3 hosts processed. | ||
- | </ | ||
- | |||
- | ===== o como hacerlo mas interactivo (cluster-ssh) ===== | ||
- | [[https:// | ||
- | |||
- | Una imagen vale mas que mil palabras | ||
- | |||
- | < | ||
- | $ cssh brick | ||
- | </ | ||
- | |||
- | {{ :: | ||
- | |||
- | Esta herramienta permite, cuando se escribe en la ventana comun, escribir lo mismo en todas las terminales abiertas o en una sola si se selecciona expresamente. | ||
- | ===== Slurm ===== | ||
- | [[https:// | ||
- | |||
- | ** srun: ** | ||
- | |||
- | Este comando es capaz de lanzar un proceso en varios nodos del cluster al mismo tiempo | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ srun -N3 -l / | ||
- | 0: brick01 | ||
- | 2: brick03 | ||
- | 1: brick02 | ||
- | </ | ||
- | |||
- | ** sbatch: ** | ||
- | |||
- | Este comando lanza un script (tipicamente una lista de comandos //srun//) en el cluster. Es posible escoger el numero de procesos a lanzar e incluso los nodos en los cuales hacerlo | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat test_script.sh | ||
- | #!/bin/sh | ||
- | #SBATCH --time=1 | ||
- | / | ||
- | srun -l / | ||
- | srun -l /bin/pwd | ||
- | [osotolongo@detritus ~]$ sbatch -n6 -w " | ||
- | Submitted batch job 30 | ||
- | [osotolongo@detritus ~]$ cat / | ||
- | brick01 | ||
- | 1: brick01 | ||
- | 2: brick02 | ||
- | 4: brick03 | ||
- | 3: brick02 | ||
- | 5: brick03 | ||
- | 0: brick01 | ||
- | 0: / | ||
- | 5: / | ||
- | 3: / | ||
- | 1: / | ||
- | 4: / | ||
- | 2: / | ||
- | </ | ||
- | |||
- | ** squeue:** | ||
- | |||
- | Este comando permite ver los trabajos que se han lanzado e informacion sobre ellos | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat test_script.sh | ||
- | #!/bin/sh | ||
- | #SBATCH --time=1 | ||
- | / | ||
- | srun -l / | ||
- | sleep 20 | ||
- | srun -l /bin/pwd | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | [osotolongo@detritus ~]$ sbatch -n6 -w " | ||
- | Submitted batch job 35 | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | 35 debug test_scr osotolon | ||
- | </ | ||
- | |||
- | |||
- | ** scancel: ** | ||
- | |||
- | OK, y cuando la caguemos podemos usar //scancel// para parar los trabajos. El kill de toda la vida pero a traves de un workload manager | ||
- | |||
- | <code bash> | ||
- | [osotolongo@detritus ~]$ cat test_script.sh | ||
- | #!/bin/sh | ||
- | / | ||
- | srun -l / | ||
- | sleep 200 | ||
- | srun -l /bin/pwd | ||
- | [osotolongo@detritus ~]$ sbatch -n6 -w " | ||
- | Submitted batch job 36 | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | 36 debug test_scr osotolon | ||
- | [osotolongo@detritus ~]$ scancel 36 | ||
- | [osotolongo@detritus ~]$ squeue | ||
- | JOBID PARTITION | ||
- | </ | ||
- | |||
- | https:// | ||
- | |||
- | mas: https:// | ||
- | |||
- | |||
- | ---- | ||
- | |||
- | **Nota**: Todo lo que estaba hecho en Perl, usando HPC, ha dejado de funcionar. Los modulos dan error. NO obstante, los docs estan aqui: [[oldway_cluster|HPC:: | ||
- | |||
- | ---- | ||
- | |||
- | ==== The real life (--multi-prog) ==== | ||
- | |||
- | [[https:// | ||
- | |||
- | Vamos a intentar usar todo esto para algo util. Digamos que queremos ejecutar un programa con diferentes argumentos en los nodos del cluster. Para ello usamos **sbatch** | ||
- | |||
- | < | ||
- | $ sbatch test.sh | ||
- | </ | ||
- | |||
- | El script //test.sh// no es un programa real sino que es una orden de ejecucion de las tareas. | ||
- | |||
- | <code bash test.sh> | ||
- | #!/bin/bash | ||
- | #SBATCH --time=100 | ||
- | #SBATCH --ntasks-per-node=20 | ||
- | #SBATCH -n 50 | ||
- | #SBATCH --mail-type=ALL | ||
- | #SBATCH --mail-user=osotolongo | ||
- | srun --exclusive --multi-prog test.conf | ||
- | </ | ||
- | |||
- | Este script lo unico que hace es configurar minimamente **sbatch** y lanzar el comando **srun**. | ||
- | * La directiva //time// especifica cuantos minutos dejaremos correr el trabajo. Con // | ||
- | * Las directivas importantes aqui son // | ||
- | * Las directivas // | ||
- | * El comando **srun** lee el archivo // | ||
- | |||
- | El archivo // | ||
- | < | ||
- | 0 | ||
- | 1 | ||
- | 2 | ||
- | 3 | ||
- | 4 | ||
- | 5 | ||
- | . | ||
- | . | ||
- | . | ||
- | 45 test_runner.sh test/ | ||
- | 46 test_runner.sh test/ | ||
- | 47 test_runner.sh test/ | ||
- | 48 test_runner.sh test/ | ||
- | 49 test_runner.sh test/ | ||
- | </ | ||
- | |||
- | La primer columna debe numerar las tareas, comenzando en **0** y terminando en **n-1**.La segunda columna no es mas que la orden a ejecutar (en el ejemplo // | ||
- | |||
- | === Probando === | ||
- | |||
- | < | ||
- | [osotolongo@detritus cluster]$ sbatch test.sh | ||
- | Submitted batch job 842 | ||
- | [osotolongo@detritus cluster]$ squeue | ||
- | JOBID PARTITION | ||
- | | ||
- | </ | ||
- | |||
- | El programa a ejecutar es un script sencillo que recibe como argumento un nombre de archivo, | ||
- | |||
- | < | ||
- | [osotolongo@detritus cluster]$ cat test_runner.sh | ||
- | #!/bin/sh | ||
- | file=$1 | ||
- | count=0 | ||
- | while [ $count -le 10 ] | ||
- | do | ||
- | echo $count >> $file | ||
- | ((count++)) | ||
- | sleep 50 | ||
- | done | ||
- | echo Nice! >> $file | ||
- | </ | ||
- | |||
- | y tambien me he escrito un script para que me escriba el // | ||
- | |||
- | < | ||
- | [osotolongo@detritus cluster]$ cat test_generator.sh | ||
- | #!/bin/sh | ||
- | count=0 | ||
- | while [ $count -lt 50 ] | ||
- | do | ||
- | cn=$((count+1)) | ||
- | echo " | ||
- | ((count++)) | ||
- | done | ||
- | </ | ||
- | |||
- | Luego, corro primero, | ||
- | |||
- | < | ||
- | $ ./ | ||
- | </ | ||
- | |||
- | que me hace el // | ||
- | |||
- | < | ||
- | $ sbatch test.sh | ||
- | </ | ||
- | |||
- | Los archivos se generan correctamente, | ||
- | |||
- | < | ||
- | [osotolongo@detritus cluster]$ ls test | ||
- | blah10.txt | ||
- | blah11.txt | ||
- | blah12.txt | ||
- | blah13.txt | ||
- | blah14.txt | ||
- | </ | ||
- | |||
- | y el contenido es el que debe ser, | ||
- | |||
- | < | ||
- | [osotolongo@detritus cluster]$ cat test/ | ||
- | 0 | ||
- | 1 | ||
- | 2 | ||
- | 3 | ||
- | 4 | ||
- | 5 | ||
- | 6 | ||
- | 7 | ||
- | 8 | ||
- | 9 | ||
- | 10 | ||
- | Nice! | ||
- | </ | ||
- | |||
- | Los emails también se envian correctamente, | ||
- | |||
- | {{ :: | ||
- | |||
- | ==== Hard batching ==== | ||
- | |||
- | [[https:// | ||
- | |||
- | El procedimiento anterior funciona OK cuando se lanzan pocas tareas que consuman tiempo. Si hemos de lanzar muchas tareas rapidas lo mejor no es usar un solo //srun// con el switch // | ||
- | |||
- | Ahora el // | ||
- | <code bash test_generator2.sh> | ||
- | #!/bin/sh | ||
- | #Creo los batch a ejecutar | ||
- | count=0 | ||
- | while [ $count -lt 50 ] | ||
- | do | ||
- | cn=$((count+1)) | ||
- | echo "# | ||
- | echo "# | ||
- | echo "# | ||
- | echo "# | ||
- | echo "srun test_runner.sh test/ | ||
- | ((count++)) | ||
- | done | ||
- | #Creo un archivo que ejecute los batch | ||
- | count=0 | ||
- | echo "# | ||
- | while [ $count -lt 50 ] | ||
- | do | ||
- | cn=$((count+1)) | ||
- | echo " | ||
- | ((count++)) | ||
- | done | ||
- | # Creo un script de aviso | ||
- | echo "# | ||
- | echo "# | ||
- | echo "# | ||
- | echo "# | ||
- | echo "srun :" >> mailme.sh | ||
- | echo " | ||
- | chmod +x test.sh | ||
- | </ | ||
- | **Nota:** Cada proceso se ejecuta independientemente y solo envia emails en caso de fallo, para recibir un aviso cuando se termina la ejecucion es necesario crear y ejecutar un porceso que lo haga y que dependa especificamente de que todos los procesos previos terminen. La forma natural es ejecutarlo con el comando //sbatch --dependency=singleton//, | ||
- | Vamos a probarlo, | ||
- | <code bash> | ||
- | [osotolongo@detritus cluster]$ ./ | ||
- | [osotolongo@detritus cluster]$ ls | ||
- | mailme.sh | ||
- | test | ||
- | test.conf | ||
- | test_generator2.sh | ||
- | test_generator.sh | ||
- | [osotolongo@detritus cluster]$ cat test_run_1.sh | ||
- | #!/bin/bash | ||
- | #SBATCH -J test | ||
- | #SBATCH --mail-type=FAIL, | ||
- | #SBATCH --mail-user=osotolongo | ||
- | srun test_runner.sh test/ | ||
- | [osotolongo@detritus cluster]$ cat test.sh | ||
- | #!/bin/bash | ||
- | sbatch test_run_1.sh | ||
- | sbatch test_run_2.sh | ||
- | sbatch test_run_3.sh | ||
- | sbatch test_run_4.sh | ||
- | sbatch test_run_5.sh | ||
- | ................... | ||
- | sbatch test_run_50.sh | ||
- | sbatch --dependency=singleton mailme.sh | ||
- | |||
- | [osotolongo@detritus cluster]$ ./ | ||
- | Submitted batch job 15262 | ||
- | Submitted batch job 15263 | ||
- | Submitted batch job 15264 | ||
- | Submitted batch job 15265 | ||
- | Submitted batch job 15266 | ||
- | Submitted batch job 15267 | ||
- | Submitted batch job 15268 | ||
- | ............... | ||
- | |||
- | [osotolongo@detritus cluster]$ squeue | ||
- | JOBID PARTITION | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | .................... | ||
- | </ | ||
- | |||
- | {{:: | ||