3. PBSPro¶
Conteúdo
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¶
Comando |
Descrição |
Exemplo |
---|---|---|
|
Submite um job |
|
|
Mostra o status dos jobs |
|
|
Delete um job |
|
|
Suspende um job |
|
|
Libera o job em hold |
|
|
Termina a execução e submete novamente o job |
|
|
Imprime informações de log do job |
|
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:
|
Identificador do job. Fornecido pelo PBS quando um job é submetido. |
|
Nome do job fornecido pelo usuário. Criado na execução. |
|
Nome do arquivo contendo uma lista dos vnodes atribuídos ao trabalho. |
|
Valor no PATH do ambiente de submissão |
|
PATH absoluto para o diretório onde o comando |
|
Diretório temporário do job. |
|
Número de threads padrão do vnode. |
|
Número de threads padrão do vnode. |
|
Identificador do job array. |
|
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
|
Linha |
Descrição |
---|---|
1 |
Shell utilizado para os comandos do job |
2 |
|
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 |
13 |
Execução do programa |
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 executadoQ
: está na fila esperando recurso para ser executadoH
: job em holdS
: job suspensoE
: 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:
Especificar a ordem em que os jobs devem ser executados
Solicitar a execução de um trabalho apenas se ocorrer um erro em outro trabalho
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.