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