Submetendo trabalhos no cluster complex

Segue um script básico para o pessoal submeter seus programas no cluster.

#!/bin/sh
#
#This is an example script example.sh
#
#These commands set up the Grid Environment for your job:
#PBS -N NOME_DO_PROGRAMA
#PBS -l nice=16,walltime=36:00:00
#PBS -M SEU_E-MAIL@if.uff.br
#PBS -m abe
cd $PBS_O_WORKDIR
 
./caminho/do/seu/executável

O nome de sua tarefa é dada na linha #PBS -N, mude NOME_DO_PROGRAMA para o nome de sua escolha. Deve ser especificado um tempo de execução máximo no campo walltime=hh:mm:ss, para que não existam procesos esquecidos, lembrem-se que o gerenciador matará o processo que exceder esse tempo.

Finalmente no terminal faça:

qsub nomedoscript

E aguarde o término, para verificar o andamento faça qstat no terminal. Dúvidas perguntem ao Ângelo.

  • Use sempre a merlot pra iniciar os processos;
  • Os processos morrem se excederem o tempo definido em walltime=hh:mm:ss!

Submetendo diversos trabalhos no mesmo script / Array Jobs

Código exemplo:

#!/bin/sh
#
#This is an example script example.sh
#
#These commands set up the Grid Environment for your job:
#PBS -N opsw1
#PBS -l nice=16,walltime=36:00:00
#PBS -M seuemail@if.uff.br
#PBS -m abe
#PBS -d /fiscomp/orahcio/pesquisa/caos_sw/analise
#PBS -t 0-5
 
#Inicio do script
case "$PBS_ARRAYID" in 
	0)
	echo "L=1e6"
	date
	./opsw 1000000 10 89763287 0.1 -6 0.1 0.49 1 0.001 0.01 5 5000 2500
	date
	;;
 
	1)
	date
	./opsw 1000000 10 89763287 0.1 -6 0.1 0.49 1 0.3 1 5 5000 2500
	date
	;;
 
	2)
	echo "L=1e5"
	date
	./opsw 100000 10 89763287 0.1 -6 0.1 0.49 1 0.001 0.01 5 5000 2500
	date
	;;
 
	3)
	date
	./opsw 100000 10 89763287 0.1 -6 0.1 0.49 1 0.3 1 5 5000 2500
	date
	;;
 
	4)
	echo "L=1e4"
	date
	./opsw 10000 10 89763287 0.1 -6 0.1 0.49 1 0.001 0.01 5 5000 2500
	date
	;;
 
	5)
	date
	./opsw 10000 10 89763287 0.1 -6 0.1 0.49 1 0.3 1 5 5000 2500
	date
	;;
esac

Cada linha abaixo do comentário Inicio do script será executada no intervalo de núcleos especificados em #PBS -t 0-5, diga adeus ao nice 16 pois esse script já faz suas tarefas serem executadas com essa prioridade. O comentário #PBS -d especifica o diretório de trabalho para cada núcleo adentrar antes de executar o processo.

O uso do case no bash é interessante se quisermos rodar parâmetros diferentes, devemos usar a variável de ambiente PBS_ARRAYID para usarmos os comandos a serem executados de acordo com o núcleo escolhido pelo gerenciador, os valores dela variam segundo o array que que definimos em #PBS -t.

Array Jobs 2

Segue um script mais eficaz, que demorou um mês mais ou menos pra a coisa toda funcionar, nesse script usa-se a opção -t porém cria-se um array adicional no script bash para mudar o parâmetro conforme o ID do núcleo que irá rodar o programa.

#!/bin/bash
#
#This is an example script example.sh
#
#These commands set up the Grid Environment for your job:
#PBS -N L1e4_p
#PBS -l nice=16,walltime=36:00:00
#PBS -M seuemail@if.uff.br
#PBS -m abe
#PBS -t 0-29
 
# Gerando sementes (só se você quiser gerar sementes)
a=$RANDOM
if [ $(($a%2)) -eq 0 ]
then
    a=$(($a+1))
fi
# Fim do gerador de sementes
 
#p=( 0 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 )
p=( 0.5166667 0.5333333 0.5500000 0.5666667 0.5833333 0.6000000 0.6166667 0.6333333 0.6500000 0.6666667 0.6833333 0.7000000 0.7166667 0.7333333 0.7500000 0.7666667 0.7833333 0.8000000 0.8166667 0.8333333 0.8500000 0.8666667 0.8833333 0.9000000 0.9166667 0.9333333 0.9500000 0.9666667 0.9833333 1.0000000 )
 
cd $PBS_O_WORKDIR
./opsw 10000 10 ${p[$PBS_ARRAYID]} $a 0.1 -6 0.1 0.49 100 5000 2500

Veja que o parâmetro que estou variando pertence ao vetor p, cada núcleo executará o mesmo script porém vai assumir o parâmetro de posição ditada pela variável de ambiente $PBS_ARRAYID.

Fica um gerador de números aleatórios, ímpares, escrito em bash. Claro que uso a variável de ambiente $RANDOM para isso.

O terminal deve ser bash e não sh como nos demais exemplos, alguma sintaxe desse script não funciona num terminal sh.

Array Jobs 3

Uma forma mais limpa de fazer o script acima é usar:

#!/bin/bash
#
#This is an example script example.sh
#
#These commands set up the Grid Environment for your job:
#PBS -N trinta_ps_com_1e4_sitios
#PBS -l nice=16,walltime=36:00:00
#PBS -M orahcio@gmail.com
#PBS -m abe
#PBS -t 0-25
 
# Gerando sementes
a=$RANDOM
if [ $(($a%2)) -eq 0 ]
then
    a=$(($a+1))
fi
 
p=$(echo "scale=10; $PBS_ARRAYID*1/25" | bc)
 
cd $PBS_O_WORKDIR
./opsw 100000 10 $p $a 0.1 -6 0.1 0.49 100 5000 2500

Dessa forma cada núcleo terá 25 pontos do seu valor de parâmetro no intervalo [0,1].

Open MPI / Torque

Um script para Open MPI seria

 
#!/bin/sh
#PBS -N Nome_do_Programa
#PBS -M SEU_E-EMAIL@if.uff.br
#PBS -m bae
#PBS -l nice=16,nodes=5:ppn=4,walltime=168:00:00 
 
export NPROCS=`wc -l $PBS_NODEFILE |gawk '//{print $1}'`
mpirun -machinefile $PBS_NODEFILE -np $NPROCS /CAMINHO/DO/SEU_PROG_MPI

Monitorando seus processos

Use o comando qstat para ver um resumo dos processos que estão sendo executados e qstat -nt para ver detalhadamente em quais máquinas cada tarefa está rodando. A saída é algo do tipo:

Job ID               Username Queue    Jobname          SessID NDS   TSK Memory Time  S Time
-------------------- -------- -------- ---------------- ------ ----- --- ------ ----- - -----
273[0].merlot.if     orahcio  batch    opsw-0           23786     1   1    --  36:00 R 00:15
   pinot/1
273[1].merlot.if     orahcio  batch    opsw-1           23786     1   1    --  36:00 R 00:15
   pinot/2
273[2].merlot.if     orahcio  batch    opsw-2           23786     1   1    --  36:00 R 00:15
   cabernet/1

Matando seus processos

Use o comando qdel #_do_processo, por exemplo 273[0] se eu for matar o processo que roda na pinot no tópico acima, se quiser matar todo mundo é só dizer qdel 273[].

pbs.txt · Última modificação: 2011/04/08 18:33 por orahcio
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0