EXECUÇÃO DE PROGRAMAS COM O USO DO PBS
A execução de programas através de um sistema de filas pode ser feita diretamente através do comando qsub anterior ao comando de execução do programa. Abaixo segue um exemplo de execução do programa cg.W.4 em paralelo com o uso de 4 nós de processamento
[renato@adm]$ qsub mpirun –np 4 -machinefile $PBS_NODEFILE cg.W.4 > cg.W.4.log
No exemplo acima a alocação dos nós de processamento não se faz mais necessária pois os mesmos serão alocados dinamicamente pelo sistema de filas e passado para o comando mpirun através da variável de ambiente $PBS_NODEFILE
Embora a execução de um programa através de um sistema de filas possa ser feita diretamente como exemplificado acima, frequentemente esta execução é feita com o auxílio de scripts PBS que oferecem diversos recursos de controle de execução, como alocação de nós, arquivos de saída, tamanho de filas, etc... . A seguir é exibido um pequeno exemplo de script com comandos básicos e comumente utilizados para a execução de programas em paralelo com o uso do MPICH.
arquivo de exemplo pbs.job disponível para download aqui
#!/bin/sh # Nome do job (na ausência será adotado o nome do arquivo de script) #PBS -N nome_do_job # Colocar os arquivos de saida e de erro no mesmo arquivo #PBS -j oe # Alocando 8 nós com 2 processos por nó (ppn) #PBS -l nodes=8:ppn=2 # Limite de recursos: tempo maximo para execucao do job ([[h:]m:]s) #PBS -l walltime=40:00:00 # PBS_O_WORKDIR: diretorio de execução do comando qsub. cd $PBS_O_WORKDIR # Carrega o ambiente conforme definido no script mpich-1.2.5-nof90-vars.sh . /usr/local/bin/mpich-1.2.5-nof90-vars.sh # Disparando o programa meu_programa com o MPI mpirun -np 16 -machinefile $PBS_NODEFILE meu_programa
|
Com relação ao exemplo acima vale salientar os seguintes pontos:
- Nos scripts PBS as linhas iniciadas com #PBS - sem espaços entre o símbolo # e a sigla PBS) – são diretivas de configuração do PBS;
- Caso não seja especificado o tamanho da fila (linha: #PBS –l walltime=40:00:00) o PBS colocará o job em execução na fila default que normalmente é a menor fila. para verificar o tamanho das filas utilize o comando qstat –q;
- Nos casos em que o tempo alocado para o programa for insuficiente para sua execução, o mesmo será ABORTADO após o término do tempo estipulado pela fila;
- A linha #PBS –l nodes=np (onde np é o número de nós de processamento) deverá sempre ser preenchida MESMO QUE O PROGRAMA SEJA SERIAL. Nos programas seriais utilize somente 1 nó;
- No caso de haver um sistema de filas operante, NÃO TENTE SUBMETER UM PROGRAMA SEM UTILIZAR A FILA, pois o mesmo estará sendo executado na estação de administração do cluster e consequentemente concorrendo com a execução de programas de outros usuários;
ALGUNS COMANDOS ÚTEIS DE PBS:
qsub
O arquivo pbs.job descrito acima poderia ser submetido ao PBS através do comando qsub, ou seja
[renato@adm]$ qsub pbs.job
652.adm.cluster
O valor de retorno do comando qsub retorna um número de identificação do job que foi submetido, no caso acima 652. Esta identificação é importante como parâmetro para outros comandos que serão descritos a seguir.
O script (pbs.job) exemplificado acima e submetido com o comando qsub redirecionaria os arquivos de erro e de saída do programa meu_programa para um único arquivo que se chamaria nome_do_job.o652.
qstat –q
Retorna uma tabela com informações básicas das filas disponíveis, ou seja
[renato@adm]$ qstat -q
server: adm
Queue Memory CPU Time Walltime Node Run Que Lm State
---------------- ------ -------- -------- ---- --- --- -- -----
large -- -- 12:00:00 -- 0 0 -- E R
huge -- -- -- -- 1 0 -- E R
medium -- -- 02:00:00 -- 0 0 -- E R
small -- -- 00:30:00 -- 0 1 -- E R
default -- -- -- -- 0 0 -- E R
--- ---
1 1
qstat –Q
Semelhante ao comando anterior porém com o status de execução de cada fila
[renato@adm renato]$ qstat -Q
Queue Max Tot Ena Str Que Run Hld Wat Trn Ext Type
---------------- --- --- --- --- --- --- --- --- --- --- ----------
large 0 0 yes yes 0 0 0 0 0 0 Execution
huge 0 1 yes yes 0 1 0 0 0 0 Execution
medium 0 0 yes yes 0 0 0 0 0 0 Execution
small 0 1 yes yes 1 0 0 0 0 0 Execution
default 0 0 yes yes 0 0 0 0 0 0 Route
A tabela acima indica que existe um job sendo executado na fila huge e um job em espera na fila small
qstat –a
Lista todos os jobs que estão sendo executados;
[renato@adm renato]$ qstat -a
adm.cluster:
Req'd Req'd Elap
Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
651.adm.cluster renato huge xhpl 14044 8 -- -- 40:00 R 05:04
652.adm.cluster renato small linpackd -- -- -- -- 00:30 Q --
A tabela acima indica que estão sendo executados 2 programas, identificados na coluna Job ID, do usuário renato (coluna Username) sendo 1 na fila (coluna Queue) huge e outro na fila small. O programa (coluna Jobname) xhpl está sendo executado a 5 horas e 4 minutos (coluna Elap Time) em 8 nós (coluna NDS). O status de execução do programa xhpl (coluna S) é R (running) e do programa linpackd é Q (queued).
qstat –f 651
Retorna o status completo do job identificado por 651
[renato@adm renato]$ qstat -f 651
Job Id: 651.adm.cluster
Job_Name = xhpl
Job_Owner = renato@adm.cluster
resources_used.cput = 00:00:01
resources_used.mem = 2856kb
resources_used.vmem = 8092kb
resources_used.walltime = 05:31:14
job_state = R
queue = huge
server = adm.cluster
Checkpoint = u
ctime = Thu Mar 4 16:51:09 2004
Error_Path = adm.cluster:/shared/home/renato/hpl/bin/InfoServer/xhpl.e651
exec_host = node10/1+node10/0+node9/1+node9/0+node8/1+node8/0+node7/1+node7
/0+node6/1+node6/0+node5/1+node5/0+node4/1+node4/0+node1/1+node1/0
Hold_Types = n
Join_Path = oe
Keep_Files = n
Mail_Points = a
mtime = Thu Mar 4 16:51:13 2004
Output_Path = adm.cluster:/shared/home/renato/hpl/bin/InfoServer/xhpl.o651
Priority = 0
qtime = Thu Mar 4 16:51:09 2004
Rerunable = True
Resource_List.nodect = 8
Resource_List.nodes = 8:ppn=2
Resource_List.walltime = 40:00:00
session_id = 14044
Variable_List = PBS_O_HOME=/shared/home/renato,PBS_O_LANG=pt_BR,
PBS_O_LOGNAME=renato,
PBS_O_PATH=.:/shared/tools/intel/compiler60/ia32/bin:/shared/tools/int
el/compiler60/ia32/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr
/java/jdk/man:/shared/tools/mpich-tcp/bin:/shared/tools/pbs/bin:/scratc
h/CEI/bin:/shared/home/renato/bin,PBS_O_MAIL=/var/spool/mail/renato,
PBS_O_SHELL=/bin/bash,PBS_O_HOST=adm.cluster,
PBS_O_WORKDIR=/shared/home/renato/hpl/bin/InfoServer,
PBS_O_QUEUE=default
comment = Job started on Thu Mar 04 at 16:51
etime = Thu Mar 4 16:51:09 2004
Repare que este comando é bastante poderoso e retorna um relatório completo de execução de um job, tal como tempo de execução, memória utilizada, status de execução, localização dos arquivos de saída e de erros, caminho de buscas, horário de inicio de execução, etc... .
qdel 652
Aborta a execução do programa identificado por 652;
pbsnodes –a
Retorna o status de alocação e uso de todos os nós do cluster
[renato@adm renato]$ pbsnodes -a
node1
state = job-exclusive
np = 2
ntype = cluster
jobs = 0/651.adm.cluster, 1/651.adm.cluster
node2
state = offline
np = 2
ntype = cluster
node3
state = down
np = 2
ntype = cluster
...
...
...
node16
state = free
np = 2
ntype = cluster
No exemplo acima o nó 1 que possui 2 processadores (np=2) está rodando 2 processos identificados no campo jobs pelos valores 0/651.adm.cluster e 1/651.adm.cluster, ou seja, o processo 651 – disparado através da estação adm.cluster via PBS - está sendo executado nas CPU’s 0 e 1 do nó. O nó 2 está fora do ar (offline), o nó 3 inoperante (down) e o nó 16 livre (free) para ser utilizado. Os demais nós foram excluídos do exemplo por simplicidade.
Obviamente estes não são os únicos comandos existentes, portanto, para maiores informações consulte o manual de cada comando através do comando man