User Tools

Site Tools


cluster

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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://youtu.be/q5SG7U76tls | Get it started ]] 
- 
-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 
- 
-{{ ::topologia.png?direct&300 |}} 
- 
-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:/nas/user// cambiara automaticamente en // brick0X:/home/user// 
- 
-La presentacion inicial (hecha con pinpoint y exportada a pdf) se puede bajar de aqui: http://detritus.fundacioace.com/files/cluster.pdf 
- 
-===== como hacer que los nodos no pidan password ===== 
-[[https://www.youtube.com/watch?v=3AtDnEC4zak | We don't talk anymore]] 
- 
-** 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/.ssh/id_rsa.pub $HOME/.ssh/detritus.pub 
-</code> 
- 
-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 /nas/osotolongo/.ssh 
-$ chmod 700 /nas/osotolongo/.ssh 
-$ cp ~/.ssh/detritus.pub /nas/osotolongo/.ssh/authorized_keys 
-$ chmod 600 /nas/osotolongo/.ssh/authorized_keys 
-</code> 
- 
-A partir de ahora, cuando se entra de //detritus// a cualquiera de los nodos no deberia ser necesario introducir ningun password.  
- 
-===== como ejecutar la misma orden en varios nodos del cluster (pssh y mpssh) ===== 
-[[https://www.youtube.com/watch?v=KUmrNavXsd0 | Nobody Wants To Be Lonely]] 
- 
-== pssh == 
- 
- - primero crear un archivo con la lista de hosts: 
-<code bash> 
-[osotolongo@detritus ~]$ cat host.pssh 
-osotolongo@brick01 
-osotolongo@brick02 
-osotolongo@brick03 
-</code> 
- 
- - 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 
-</code> 
-== mpssh == 
- 
- - la syntaxis cambia ligeramente, y la salida tambien 
-<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 <ndenev@gmail.com> 
- 
-  [*] read (3) hosts from the list 
-  [*] executing "ps ax | grep ssh" as user "osotolongo" 
-  [*] spawning 3 parallel ssh sessions 
- 
-brick01 ->   1920 ?        Ss     0:00 /usr/sbin/sshd -D 
-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 /usr/sbin/sshd -D 
-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 /usr/sbin/sshd -D 
-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. 
-</code> 
- 
-===== o como hacerlo mas interactivo (cluster-ssh) ===== 
-[[https://www.youtube.com/watch?v=bjgFH01k0gU | Dance again]] 
- 
-Una imagen vale mas que mil palabras 
- 
-<code> 
-$ cssh brick 
-</code> 
- 
-{{ ::screenshot_from_2016-11-16_13-15-14.png?direct&200 |}} 
- 
-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://www.youtube.com/watch?v=kOkQ4T5WO9E | This is what you came for]] 
- 
-** srun: ** 
- 
-Este comando es capaz de lanzar un proceso en varios nodos del cluster al mismo tiempo 
- 
-<code bash> 
-[osotolongo@detritus ~]$ srun -N3 -l /bin/hostname 
-0: brick01 
-2: brick03 
-1: brick02 
-</code> 
- 
-**  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 
-/bin/hostname 
-srun -l /bin/hostname 
-srun -l /bin/pwd 
-[osotolongo@detritus ~]$ sbatch -n6 -w "brick0[1-3]" -o test_stdout test_script.sh  
-Submitted batch job 30 
-[osotolongo@detritus ~]$ cat /nas/osotolongo/test_stdout 
-brick01 
-1: brick01 
-2: brick02 
-4: brick03 
-3: brick02 
-5: brick03 
-0: brick01 
-0: /home/osotolongo 
-5: /home/osotolongo 
-3: /home/osotolongo 
-1: /home/osotolongo 
-4: /home/osotolongo 
-2: /home/osotolongo 
-</code> 
- 
-** 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 
-/bin/hostname 
-srun -l /bin/hostname 
-sleep 20 
-srun -l /bin/pwd 
-[osotolongo@detritus ~]$ squeue 
-             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) 
-[osotolongo@detritus ~]$ sbatch -n6 -w "brick0[1-3]" -o test_stdout test_script.sh  
-Submitted batch job 35 
-[osotolongo@detritus ~]$ squeue 
-             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) 
-                35     debug test_scr osotolon  R       0:01      3 brick[01-03] 
-</code> 
- 
- 
-** 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 
-/bin/hostname 
-srun -l /bin/hostname 
-sleep 200 
-srun -l /bin/pwd 
-[osotolongo@detritus ~]$ sbatch -n6 -w "brick0[1-3]" -o test_stdout test_script.sh  
-Submitted batch job 36 
-[osotolongo@detritus ~]$ squeue 
-             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) 
-                36     debug test_scr osotolon  R       0:03      3 brick[01-03] 
-[osotolongo@detritus ~]$ scancel 36 
-[osotolongo@detritus ~]$ squeue 
-             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) 
-</code> 
- 
-https://slurm.schedmd.com/quickstart.html 
- 
-mas: https://wiki.fysik.dtu.dk/niflheim/SLURM#configure-slurm 
- 
- 
----- 
- 
-**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::Runner::Slurm (AKA the hat trick)]] 
- 
----- 
- 
-==== The real life (--multi-prog) ==== 
- 
-[[https://www.youtube.com/watch?v=PstrAfoMKlc|Fighter]] 
- 
-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** 
- 
-<code> 
-$ sbatch test.sh 
-</code> 
- 
-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 
-</code> 
- 
-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 //--time=0// no se aplica límite de tiempo.  
-  * Las directivas importantes aqui son //--ntasks-per-node=20// y //-n 50//. La primera dice a **sbatch** que lance 20 tareas en cada nodo, la segunda que hay un total de 50 tareas. para que todo vaya bien n/ntask-per-node < 3. Por ejemplo si ponemos //--ntasks-per-node=10//, entonces dara error porque 50/10=5. //Esto se puede quitar pero si lanzamos 50 tareas las metera todas en brick01 y el ejemplo no servira de nada//. 
-  * Las directivas //--mail-type=ALL// y //--mail-user=osotolongo// dicen que envie por email todo lo que ocurra al usuario //osotolongo//. Si el usuario de cada uno esta bien configurado, esto deberia funcionar para cada uno con solo cambiar el nombre. 
-  * El comando **srun** lee el archivo //test.conf// y ejecuta las ordenes que hay dentro de este archivo. 
- 
-El archivo //test.conf// tiene la siguiente estructura 
-<code> 
-0       test_runner.sh test/blah1.txt 
-1       test_runner.sh test/blah2.txt 
-2       test_runner.sh test/blah3.txt 
-3       test_runner.sh test/blah4.txt 
-4       test_runner.sh test/blah5.txt 
-5       test_runner.sh test/blah6.txt 
-. 
-. 
-. 
-45      test_runner.sh test/blah46.txt 
-46      test_runner.sh test/blah47.txt 
-47      test_runner.sh test/blah48.txt 
-48      test_runner.sh test/blah49.txt 
-49      test_runner.sh test/blah50.txt 
-</code> 
- 
-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 //test_runner.sh//),con todos los argumentos correspondientes (en este caso un nombre de archivo). 
- 
-=== Probando === 
- 
-<code> 
-[osotolongo@detritus cluster]$ sbatch test.sh  
-Submitted batch job 842 
-[osotolongo@detritus cluster]$ squeue 
-             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON) 
-               842     debug  test.sh osotolon  R       0:03      3 brick[01-03] 
-</code> 
- 
-El programa a ejecutar es un script sencillo que recibe como argumento un nombre de archivo, 
- 
-<code> 
-[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 
-</code> 
- 
-y tambien me he escrito un script para que me escriba el //test.conf//, 
- 
-<code> 
-[osotolongo@detritus cluster]$ cat test_generator.sh  
-#!/bin/sh 
-count=0 
-while [ $count -lt 50 ] 
-do 
-        cn=$((count+1)) 
-        echo "$count    test_runner.sh test/blah${cn}.txt" >> test.conf 
-        ((count++)) 
-done 
-</code> 
- 
-Luego, corro primero, 
- 
-<code> 
-$ ./test_generator.sh 
-</code> 
- 
-que me hace el //test.conf// y luego, 
- 
-<code> 
-$ sbatch test.sh 
-</code> 
- 
-Los archivos se generan correctamente, 
- 
-<code> 
-[osotolongo@detritus cluster]$ ls test 
-blah10.txt  blah15.txt  blah1.txt   blah24.txt  blah29.txt  blah33.txt  blah38.txt  blah42.txt  blah47.txt  blah5.txt 
-blah11.txt  blah16.txt  blah20.txt  blah25.txt  blah2.txt   blah34.txt  blah39.txt  blah43.txt  blah48.txt  blah6.txt 
-blah12.txt  blah17.txt  blah21.txt  blah26.txt  blah30.txt  blah35.txt  blah3.txt   blah44.txt  blah49.txt  blah7.txt 
-blah13.txt  blah18.txt  blah22.txt  blah27.txt  blah31.txt  blah36.txt  blah40.txt  blah45.txt  blah4.txt   blah8.txt 
-blah14.txt  blah19.txt  blah23.txt  blah28.txt  blah32.txt  blah37.txt  blah41.txt  blah46.txt  blah50.txt  blah9.txt 
-</code> 
- 
-y el contenido es el que debe ser, 
- 
-<code> 
-[osotolongo@detritus cluster]$ cat test/blah1.txt 
-0 
-1 
-2 
-3 
-4 
-5 
-6 
-7 
-8 
-9 
-10 
-Nice! 
-</code> 
- 
-Los emails también se envian correctamente, 
- 
-{{ ::screenshot_from_2018-09-20_11-45-17.png?nolink |}} 
- 
-==== Hard batching ==== 
- 
-[[https://www.youtube.com/watch?v=86URGgqONvA|Run to the hills]] 
- 
-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 //--multi-prog// sino lanzar un //sbatch// para cada proceso. 
- 
-Ahora el //test_generator// es distinto, cada proceso se ejecutara con un sbatch, que hay que construir en un bucle. Luego basta con hacer un ejecutable que lance los //sbatch// consecutivamente, 
-<code bash test_generator2.sh> 
-#!/bin/sh 
-#Creo los batch a ejecutar 
-count=0 
-while [ $count -lt 50 ] 
-do 
-        cn=$((count+1)) 
-        echo "#!/bin/bash" > test_run_${cn}.sh 
-        echo "#SBATCH -J test" >> test_run_${cn}.sh 
-        echo "#SBATCH --mail-type=FAIL,TIME_LIMIT,STAGE_OUT" >> test_run_${cn}.sh 
-        echo "#SBATCH --mail-user=`whoami`" >> test_run_${cn}.sh 
-        echo "srun test_runner.sh test/blah${cn}.txt" >> test_run_${cn}.sh 
-        ((count++)) 
-done 
-#Creo un archivo que ejecute los batch 
-count=0 
-echo "#!/bin/bash" > test.sh 
-while [ $count -lt 50 ] 
-do 
-        cn=$((count+1)) 
-        echo "sbatch test_run_${cn}.sh" >> test.sh 
-        ((count++)) 
-done 
-# Creo un script de aviso 
-echo "#!/bin/bash" > mailme.sh 
-echo "#SBATCH -J test" >> mailme.sh 
-echo "#SBATCH --mail-type=END" >> mailme.sh 
-echo "#SBATCH --mail-user=`whoami`" >> mailme.sh 
-echo "srun :" >> mailme.sh 
-echo "sbatch --dependency=singleton mailme.sh" >> test.sh 
-chmod +x test.sh 
-</code> 
-**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//, pero ojo que esto se ejecutara cuando todos los procesos con elmismo nombre y bajo el mismo usuario hayan terminado, asi que ha de asignarse a cada proceso el mismo nombre (//swarm//). Si hay que lanzar dos //swarm// diferentes hay que hacerlo con un nombre distinto y correr porque seras condenado a la guillotina por el administrador del cluster. Ojo, que este proceso (que aparece como Dependency bajo //squeue//) en realidad no hace nada, solo manda un email cuando se ejecuta. 
-Vamos a probarlo, 
-<code bash> 
-[osotolongo@detritus cluster]$ ./test_generator2.sh  
-[osotolongo@detritus cluster]$ ls 
-mailme.sh     test_run_10.sh  test_run_15.sh  test_run_1.sh   test_run_24.sh  test_run_29.sh  test_run_33.sh  test_run_38.sh  test_run_42.sh  test_run_47.sh  test_run_5.sh  test_runner.sh 
-test     test_run_11.sh  test_run_16.sh  test_run_20.sh  test_run_25.sh  test_run_2.sh   test_run_34.sh  test_run_39.sh  test_run_43.sh  test_run_48.sh  test_run_6.sh  test.sh 
-test.conf     test_run_12.sh  test_run_17.sh  test_run_21.sh  test_run_26.sh  test_run_30.sh  test_run_35.sh  test_run_3.sh   test_run_44.sh  test_run_49.sh  test_run_7.sh 
-test_generator2.sh  test_run_13.sh  test_run_18.sh  test_run_22.sh  test_run_27.sh  test_run_31.sh  test_run_36.sh  test_run_40.sh  test_run_45.sh  test_run_4.sh   test_run_8.sh 
-test_generator.sh   test_run_14.sh  test_run_19.sh  test_run_23.sh  test_run_28.sh  test_run_32.sh  test_run_37.sh  test_run_41.sh  test_run_46.sh  test_run_50.sh  test_run_9.sh 
-[osotolongo@detritus cluster]$ cat test_run_1.sh 
-#!/bin/bash 
-#SBATCH -J test 
-#SBATCH --mail-type=FAIL,TIME_LIMIT,STAGE_OUT 
-#SBATCH --mail-user=osotolongo 
-srun test_runner.sh test/blah1.txt 
-[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]$ ./test.sh  
-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     NAME     USER ST       TIME  NODES NODELIST(REASON) 
-             15312     devel     test osotolon PD       0:00      1 (Dependency) 
-             15262     devel     test osotolon  R       0:03      1 brick01 
-             15263     devel     test osotolon  R       0:03      1 brick01 
-             15264     devel     test osotolon  R       0:03      1 brick01 
-             15265     devel     test osotolon  R       0:00      1 brick01 
-             15266     devel     test osotolon  R       0:00      1 brick01 
-.................... 
-</code> 
- 
-{{::email_done.png|}} 
  
cluster.txt · Last modified: 2020/08/04 10:58 (external edit)