3. PBSPro

3.1. Introdução

O PBS Pro é um job scheduler open-source baseado no original PBS code desenvolvido pela NASA. Agora a Altair Engineering possui e mantém o PBS Pro Scheduler.

3.2. PBS Comandos

Comandos básicos

Comando

Descrição

Exemplo

qsub

Submite um job

qsub myjob

qstat

Mostra o status dos jobs

qstat -u user1

qdel

Delete um job

qdel 212345

qhold

Suspende um job

qhold 200123

qrls

Libera o job em hold

qrls -h u 200123

qrerun

Termina a execução e submete novamente o job

qrerun 200012

tracejob

Imprime informações de log do job

tracejob 201012

3.2.1. Environment variables

O job scheduler cria automaticamente variáveis de ambiente que estão disponíveis para serem utilizadas nos scripts de trabalho quando estão sendo executados em nós de computação de cluster, junto com variáveis Linux padrão. As variáveis são:

Environment variables

PBS_JOBID

Identificador do job. Fornecido pelo PBS quando um job é submetido.

PBS_JOBNAME

Nome do job fornecido pelo usuário. Criado na execução.

PBS_NODEFILE

Nome do arquivo contendo uma lista dos vnodes atribuídos ao trabalho.

PBS_O_PATH

Valor no PATH do ambiente de submissão

PBS_O_WORKDIR

PATH absoluto para o diretório onde o comando qsub foi executado.

TMPDIR

Diretório temporário do job.

NCPUS

Número de threads padrão do vnode.

OMP_NUM_THREADS

Número de threads padrão do vnode.

PBS_ARRAY_ID

Identificador do job array.

PBS_ARRAY_INDEX

Número do índice de subtrabalho na matriz de trabalhos.

3.3. Exemplos de scripts

Os exemplos dos scripts para o PBS estão disponiveis no servidor de login no diretório /sw/share/doc. Conforme descrito em Introdução, cada nó de processamento possui 24 cores/48 threads.

3.3.1. Script Básico

O script abaixo pode ser usado como base para qualquer tipo de aplicação.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
#PBS -l select=1:ncpus=48
#PBS -l walltime=01:00:00
#PBS -j oe
#PBS -V
#PBS -N <jobname>

# load modules
module load module1 [module2] [...]
# change directory
cd ${PBS_O_WORKDIR}

./prog
Descrição detalhada do job

Linha

Descrição

1

Shell utilizado para os comandos do job

2

select=1 aloca 1 node. ncpus=48 aloca todos os 48 threads disponíveis no node

3

Total do tempo de processamento (walltime) do job

4

Os arquivos de saída e erro são direcionados para um único arquivo

5

(Opcional) As variáveis de ambiente do servidor de submissão são enviadas para o job

6

Define o nome do job

9

Módulos necessários para a execução do programa

11

Muda para o mesmo diretório em que o comando qsub foi executado

13

Execução do programa prog

Nota

Caso seja de interesse pode-se incluir duas linhas com os parâmetros #PBS -m ae e #PBS -M sua_conta@seu_dominio.com.br, logo após a linha 6, caso queiram receber um e-mail com informações de quando o job terminar ou for abortado. Caso use esta opção, por favor, verifique se o seu e-mail foi preenchido corretamente.

3.3.2. OpenMP

#!/bin/bash
#PBS -l select=1:ncpus=48:ompthreads=24
#PBS -l walltime=01:00:00
#PBS -j oe
#PBS -V
#PBS -N OpenMP

# load modules
module load intel/2019.4
# change directory
cd ${PBS_O_WORKDIR}
# environment (if necessary)
#export OMP_NUM_THREADS=24
# run
./prog

Repare nas linhas em destaque. A quantidade de threads de um job pode ser definida pelo PBS incluindo o parâmetro :ompthreads=24 ou descomentando a linha do comando export OMP_NUM_THREADS=24.

3.3.3. MPI

#!/bin/bash
#PBS -l select=2:ncpus=48:mpiprocs=24
#PBS -l walltime=01:00:00
#PBS -j oe
#PBS -V
#PBS -N mpi-intel

# load modules
module load intel/2019.4
# change directory
cd ${PBS_O_WORKDIR}
# run
mpirun ./prog

Repare nas linhas em destaque. A quantidade de processos MPI por nó de processamento pode ser definida pelo PBS incluindo o parâmetro :mpiprocs=24. Desta maneira o parâmetro -np=48 do mpirun pode ser omitido, isto é, 2 nodes x 24 procs = 48. Isto é uma grande vantagem pois facilita a manutenção do job caso haja alguma modificação na quantidade de processos MPI. Bastando para isso modificar apenas a primeira linha do job.

Nota

As bibliotecas MPI do compilador Intel são carregadas automaticamente ao carregar o module do compilador Intel. Neste exemplo, module load intel/2019.4.

Dica

Se o seu programa usufrui das threads, os parâmetros mpiprocs e ompthreads podem ser omitidos ou modificados para :mpiprocs=48 ou :ompthreads=48, caso contrário mantenham eles como 24 que corresponde ao número de cores.

3.4. Submissão de job

Importante

O job scheduler dá prioridade aos jobs que solicitam menos recursos. É importante salientar que o preenchimento correto do parâmetro walltime pode acelerar a execução do seu job. Durante a operação do cluster, as vezes, é possível fazer alocações manuais e neste caso apenas jobs curtos são selecionados.

3.4.1. Submetendo um batch job

Usando como base um dos jobs scripts de exemplo, mostrados anteriormente no item Exemplos de scripts.

user1@service1:~/test> qsub mpi-intel.job
233180.service1

3.4.1.1. Acompanhando o status do job

user1@service1:~/test> qstat -u user1
service1:
                                                            Req'd  Req'd   Elap
Job ID          Username Queue    Jobname    SessID NDS TSK Memory Time  S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
233181.service1 user1    workq    mpi-intel     --    2  96    --  01:00 Q   --

Neste exemplo, o status do job é Q. O status de um job pode ser:

  • R: job sendo executado

  • Q: está na fila esperando recurso para ser executado

  • H: job em hold

  • S: job suspenso

  • E: job terminando

3.4.2. Submetendo um job interativo

Para submeter um job interativo deve usar o comando qsub -I. O job scheduler procurará um nó de computação disponível e fornecerá um shell de logon, se houver algum disponível. Neste exemplo, o node alocado foi o r2i2n9.

user1@service1:~> qsub -I
qsub: waiting for job 233174.service1 to start
qsub: job 233174.service1 ready

Directory: /home/users/user1
Thu Aug  6 14:27:18 UTC 2020
user1@r2i2n9:~>

Nota

Para executar aplicativos gráficos em uma sessão interativa, adicione no comando a opção -X, que permite o encaminhamento da interface gráfica. Por exemplo, qsub -I -X ou qsub -IX. Pode-se adicionar também as variáveis de ambiente do servidor incluindo a opção -V, obtendo o seguinte comando qsub -I -X -V ou qsub -IXV.

3.4.3. Dependência entre jobs

O PBS permite que você especifique dependências entre dois ou mais jobs. As dependências são úteis para uma variedade de tarefas, como:

  1. Especificar a ordem em que os jobs devem ser executados

  2. Solicitar a execução de um trabalho apenas se ocorrer um erro em outro trabalho

  3. Reter trabalhos até que um determinado trabalho inicie ou conclua a execução

A opção -W depend=dependency_list do qsub define a dependência entre vários trabalhos. As opções mais comuns são after:<jobid> e afterok:<jobid>, que correspondem respectivamente executar ao término do <jobid> e executar apenas se o <jobid> terminar com EXIT STATUS=0.

user1@service1:~/test> qsub mpi-intel.job
233545.service1

user1@service1:~/test> qsub -W depend=afterok:233545 report.job
233546.service1
user1@service1:~/test> qstat -u user1

service1:
                                                            Req'd  Req'd   Elap
Job ID          Username Queue    Jobname    SessID NDS TSK Memory Time  S Time
--------------- -------- -------- ---------- ------ --- --- ------ ----- - -----
233545.service1 user1    workq    mpi-intel   12345   2  96    --  01:00 R 00:01
233546.service1 user1    workq    test          --    1  48    --  01:00 H   --

Observe que o job ficará em HOLD até o job anterior terminar.

Maiores informações

Através do comando man ou do PBS Professional User’s Guide.