Escolar Documentos
Profissional Documentos
Cultura Documentos
Sumário
1. Instruções para leitura
2. Acesso aos clusters
3. Estrutura de diretórios
4. Quotas de usuários
5. Carregando as variáveis de ambiente
6. Submetendo jobs no cluster
7. Pinagem de cores reais
$ ssh USUARIO@10.3.16.17
cluster 3:
$ ssh USUARIO@10.3.16.3
cluster 3:
cluster 3:
cluster 3:
cluster 3:
cluster 3:
Estrutura de diretórios
Em ambos os clusters existem diretórios específicos na home do seu usuário que no qual é montado o storage de cada cluster.
Assim é recomendável que você salve os resultados de cada job submetido em cada cluster no diretório dos respectivos
storages, caso contrário, seus jobs poderão sofrer um grande impacto de performance devido a forma como tais storages estão
interconectados ou até mesmo não conseguirem rodar.
Caso o user_a queira submeter um job para o mesmo teste, porém no cluster navier, ele deverá copiar a pasta do teste dele
(my_test) do diretório st_cluster3 para o diretório st_navier no seu home, ou seja:
$ cd /home/USUARIO/st_navier/my_test
$ qsub my_pbs_script.pbs
Ou caso não queria copiar a pasta do diretório st_cluster3, o usuário deverá informar ao PBS onde deseja salvar a saida do seu
job, redirecionando a saida do programa para o lugar correto no diretório st_navier ou então alterando no seu código para não
abrir o arquivo do diretório corrente e sim de um caminho específico.
Caso utilize windows, pode acessar os clusters utilizando um programa chamado Putty, ou algum outro cliente ssh.
Quotas de usuários
No cluster existe um sistema de quotas para cada usuário. A principio todos os usuários tem uma parcela igual de espaço em
disco para usufruir. O espaço foi calculado com base no número de usuários cadastrados e que utilizam os clusters.
Soft limits (você está acima da quota, porém este limite é aceitável temporariamente):
permite que você ainda utilize os recursos do disco por um determinado tempo (período de carência) mesmo
tendo excedido a sua quota;
desta forma, proporciona uma certa flexibilidade a todos os usuários e processos, que precisam
ocasionalmente, ultrapassar o limite de spaço em disco;
Hard limits (previne que usuários acima do limite permitido continuem a utilizar espaço em disco):
qualquer tentativa de alocar mais espaço em disco, seja por um processo do usuário ou pelo próprio usuário,
irá falhar, pois o usuário atingiu o limite máximo de quota permitido a ele;
o usuário deve remover alguns arquivos existentes (ficando novamente abaixo da quota) para que assim
consiga criar novos arquivos/diretórios;
soft 850 gb 2 tb 50 gb
hard 2 tb 4 tb 100 gb
total 19 tb 66 tb 6 tb
Caso necessite de uma quota de espaço em disco maior que o soft limit, é necessário me enviar um email
(johnatas@nibblelab.com ou mflab@nibblelab.com), com a tag [navier] ou [cluster3] no campo do assunto, e justificar o porque
da necessidade, bem como a quantidade que gostaria que fosse reservada, para que esta seja analisada.
Os módulos disponíveis em cada cluster são diferentes e podem ser verificados com o comando:
$ module avail
Esse comando irá listar todos os modulos (softwares) instalados, como por exemplo abaixo:
$ module avail
----------------------------------------------------------------
/opt/modulefiles/Core
boost/1.57 gcc/4.8.2 intel/12.1.0.032
metis/4.0.3 python/2.7.12 scons/2.3.3 szip/2.1
cmake/2.8.11 gcc/4.9.1 (D) intel/13.0.0.028 (D)
open64/4.5.2.1 python/3.4 (D) scons/2.4.1 (D)
xflow/90.0
cuda/6.0 glib/2.28.3 libnuma/2.0.9
parmetis/3.2.0 scalapack/0.96 starccm/7.6.12
zlib/1.2.6
gcc/4.3.4 hwloc/1.6.1 lis/1.2.53
python/2.7.5 scons/1.0.1 starccm/9.4.11 (D)
---------------------------------------------------------
/opt/sw/lmod/lmod/modulefiles/Core
lmod/5.8.1 settarg/5.8.1
Ou pelo comando:
$ module spider
-----------------------------------------------------------------
The following is a list of the modules currently available:
-----------------------------------------------------------------
gnu: gnu/5.4.0
GNU Compiler Family (C/C++/Fortran for x86_64)
hdf5: hdf5/1.8.17
A general purpose library and file format for storing scientific data
imb: imb/4.1
Intel MPI Benchmarks (IMB)
mpiP: mpiP/3.4.1
mpiP: a lightweight profiling library for MPI applications.
mpich: mpich/3.2
MPICH MPI implementation
mvapich2: mvapich2/2.2
OSU MVAPICH2 MPI implementation
openmpi: openmpi/1.10.4
A powerful implementation of MPI
papi: papi/5.4.3
Performance Application Programming Interface
pdtoolkit: pdtoolkit/3.22
PDT is a framework for analyzing source code
phdf5: phdf5/1.8.17
A general purpose library and file format for storing scientific data
prun: prun/1.1
job launch utility for multiple MPI families
scalasca: scalasca/2.3.1
Toolset for performance analysis of large-scale parallel applications
scorep: scorep/3.0
Scalable Performance Measurement Infrastructure for Parallel Codes
sionlib: sionlib/1.7.0
Scalable Performance Measurement Infrastructure for Parallel Codes
tau: tau/2.26
Tuning and Analysis Utilities Profiling Package
valgrind: valgrind/3.11.0
Memory debugging utilities
Supondo que eu queira usar para desenvolver meu trabalho o compilador gcc, o openmpi compilado com esse compilador e o
hdf5, eu posso digitar o seguinte comando para carregar as bibliotecas que desejo:
A cada modulo carregado, novos podem ser mostrados no output com comando “module avail”, pois um módulo, pode
depender do outro, como pode ser observado na saída abaixo após carregar os três módulos acima:
$ module avail
----------------------------------------------------
/opt/modulefiles/MPI/gcc/4.9.1/openmpi/1.8.4
hdf5/1.8.14 petsc/3.5.2 petsc/3.7.5 (D) sundials/2.6.1
zoltan/3.81
---------------------------------------------------------
/opt/modulefiles/Compiler/gcc/4.9.1
cantera/2.2p glib/2.28.8 (D) lapack/3.6.0 openmpi/1.8.4
openmpi-fl/1.8.4 szip/2.1 (D) valgrind/3.9.0
----------------------------------------------------------------
/opt/modulefiles/Core
boost/1.57 gcc/4.8.2 intel/12.1.0.032
metis/4.0.3 python/2.7.12 scons/2.3.3 szip/2.1
cmake/2.8.11 gcc/4.9.1 (D) intel/13.0.0.028 (D)
open64/4.5.2.1 python/3.4 (D) scons/2.4.1 (D)
xflow/90.0
cuda/6.0 glib/2.28.3 libnuma/2.0.9
parmetis/3.2.0 scalapack/0.96 starccm/7.6.12
zlib/1.2.6
gcc/4.3.4 hwloc/1.6.1 lis/1.2.53
python/2.7.5 scons/1.0.1 starccm/9.4.11 (D)
---------------------------------------------------------
/opt/sw/lmod/lmod/modulefiles/Core
lmod/5.8.1 settarg/5.8.1
Caso não seja especificada a versão, como no “hdf5” acima, o lmod irá procurar pela versão default (marcada com um (D) ou a
maior instalada), que em geral é a mais atual do software instalado.
Para listar quais modulos estão carregados para o seu usuário basta digitar:
$ module list
Currently Loaded Modules:
1) gcc/4.9.1 2) hwloc/1.6.1 3) openmpi/1.8.4 4) szip/2.1 5)hdf5/1.8.14
$ module rm nome-do-modulo
ou
$ module rm gcc
caso tenha alguma dúvida com relação a sintaxe do comando module, você pode consultar a documentação aqui:
http://lmod.readthedocs.io/en/latest/ ou dentro do próprio cluster como abaixo pelo comando man, após carregar o modulo
modules:
$ man module
[Opicional]
Você também pode utilizar o Lmod para criar seus próprios módulos para softwares instalados na sua pasta HOME, por
exemplo. Para fazer isso basta seguir os passos abaixo:
Primeiro crie um diretório aonde ficaram salvos seus módulos (um módulo é um script escrito na linguagem tcl ou lua que
configura o ambiente atribuindo váriaveis do sistema que seram utilizadas pelo seu software durante a compilação e/ou
execução)
$ mkdir /home/USUARIO/privatemodules
Configure seu arquivo /home/USUARIO/.bashrc para carregar os seus módulos no momento do login
Dentro da pasta privatemodules organize seus módulos como preferir, por exemplo, supondo que eu tenha instalado no meu
HOME o software chamado TESTCOMPILER no seguinte ramo de diretórios:
/home/USUARIO/softwares/TESTCOMPILER/1.2.3 onde 1.2.3 seria a versão do meu software. Assim eu poderia criar a
seguinte organização de módulos:
$ mkdir /home/USUARIO/privatemodules/TESTCOMPILER
$ vim /home/USUARIO/privatemodules/TESTCOMPILER/1.2.3
############################################################
#%Module1.0#################################################
proc ModulesHelp {} {
global name version prefix man_path
puts stderr "\t [module-info name] - put here some help message"
}
$ module avail
Note que no meu script acima, eu setei a váriavel de ambiente PATH com o caminho “$prefix/bin” onde prefix é igual a:
“/home/USUARIO/softwares/TESTCOMPILER/1.2.3”, ou seja, estou acrescentando no meu PATH o caminho:
“/home/USUARIO/softwares/TESTCOMPILER/1.2.3/bin” o que significa que meus executáveis do programa TESTCOMPILER
devem estar nessa pasta para que eu consiga acessa-los de qualquer lugar do cluster.
Para submeter um job ao cluster, deve-se usar o comando qsub, como no exemplo abaixo:
2) Ou então deixando todos os parâmetros definidos no próprio script (SCRIPT_DE_SUBIMISSAO), como nos scripts de
exemplo de submissão que estão em anexo, mas posso lhe ajudar pessoalmente se tiver dificuldades para submeter seus jobs.
O walltime deve ser especificado no script de submissão do job, caso não seja, o seu job rodará por apenas 168 hrs, uma
semana.
Caso queira que seu job rode por mais de uma semana, você precisa especificar o walltime, pode faze-lo assim:
#PBS -l walltime=HH:MM:SS
substituindo HH:MM:SS pela quantidade de horas, minutos e segundos que deseja que seu job rode.
Configuração da filas:
nome da fila / default walltime / qtdade de nós / qtdade de cores(sem HyperThread habilitado) / Prioridade urgent / -- / 17 (todos
os nós) / 680 / 160* debug / 01:00:00 / 1 / 40 / 155 parallel_8 / 168:00:00 / 17 / 680 / 100 parallel_16 / 168:00:00 / 17 / 680 / 100
parallel_32 / 168:00:00 / 17 / 680 / 100 parallel_64 / 168:00:00 / 17 / 680 / 100 parallel_128 / 168:00:00 / 17 / 680 / 100
parallel_256 / 168:00:00 / 17 / 680 / 100 parallel_512 / 168:00:00 / 17 / 680 / 100
Para ter permissão para submeter jobs para a fila “urgent” é necessário enviar um email para johnatas@nibblelab.com (ou
mflab@nibblelab.com) com cópia para o prof. Aristeu ou prof. João Marcelo, justificando o porque da necessidade.
OBS.:
Depois de especificado o walltime, o job terá o walltime da fila na qual foi escalonado (que é 168 hrs por padrão) , tendo
portanto a mesma prioridade de qualquer outro e podendo ficar muito tempo na fila.
Na maioria das filas não existe limite para o walltime, você pode especificar o tempo que quiser, porem, quanto maior o
walltime, menos prioridade seu job terá, e consequentemente, poderá ficar mais tempo na fila ou até suspenso. Para
verificar o limite do walltime, quando existente, você pode utilizar o comando: $ qstat -q
Quanto menos recursos o job exigir, maior será a sua prioridade
Caso nenhuma fila seja especificada o PBS irá escolher uma que se aproxime das especificações feitas pelo usuário no script
de submissão do job.
Visualizando las
Para visualizarem as filas, podem usar o comando qstat com os parâmetros -q ou -Q. Por exemplo:
$ qstat -q
ou
$ qstat -Q
Submetendo jobs
Se você pretende usar OpenMP em conjunto com MPI, vai precisa especificar quantas threads quer, por exemplo:
#PBS -l select=4:ncpus=16:mpiprocs=1:mem=10gb:ompthreads=2
Este comando irá requisitar por: 4 nós, com 16 cores em cada, 10gb por nó, e 2 threads por core
Você pode ler mais a respeito na página 129, no capítulo “4.5 Hybrid MPI-OpenMP Jobs” do manual do usuário do PBSpro
(disponível aqui: ftp://mflab.mecanica.ufu.br/suporte/manuais/PBSPro-12.0/PBSProUserGuide12.pdf)
Após submeter o job, para verificar o status do seua job, basta rodar o comando:
$ qstat
O comando qstat possui vários argumentos utéis, e a descrição de todos eles e como usar, podem ser facilmente lidas
digitando:
$man qstat
$qdel ID_DO_JOB
A ID_DO_JOB é mostrada no momento da submissão e também listada pelo comando qstat, no exemplo abaixo submeto um
job serial cujo ID foi 458, depois visualizo o status dele como R(rodando) e mato o job com o comando qdel, passando o ID do
job, por ultimo vejo se ele sumiu realmente da lista de jobs:
Voce pode monitorar o status dos nós, e se estes estão vazios, pelos comandos abaixo:
# pbsnodes -a
$ qstat [ID_JOB]
$ tracejob ID_JOB
Fila de speedup
A fila speedup e urgent precisam de permissão para executar, pois elas possuem maior prioridade que as demais e podem
preemptar(remover) jobs com menores prioridades. Além disso o placement padrão da fila speedup é place=scatter:excl, ou
seja, caso não informado o place no script de submissão, o default já é deixar o nó exclusivo.
Ela possui maior prioridade que as demais filas, significa que no calculo das prioridades dos jobs (em fila - Q ou executando -
R), considerando walltime, número de processos e demais recursos, o valor de prioridade da fila speedup “converge” mais
rápido que o das demais filas, logo um job aguardando na fila speedup pode não entrar na hora que é submetido se o cluster
tiver muito cheio, mas com o tempo ele entrará mais rápido que outros jobs, além do mais, como o escalonador de jobs
recalcula a prioridade de todos os jobs rodando e na fila a certo intervalo de tempo, caso o o job que está na fila atinja um valor
de prioridade maior um outro em execução, o escalonador tira o job que ta rodando e coloca o da fila speedup/urgent.
Caso queira que seu job rode na fila speedup com um placement diferente de scatter:excl, ou seja, não se importa do seu job
dividir processamento com outros jobs, você deve alterar o placement do job. Para isso, dentre os possíveis parâmetros que
podem ser visto aqui na página 44 na tabela 3-1 do manual(ftp://mflab.mecanica.ufu.br/suporte/manuais/PBSPro-
12.0/PBSProUserGuide12.pdf), os principais são:
free - Coloca seu job em qq nó onde há recurso disponível pack - Agrupa todos os processos em um mesmo nó, caso tenha
selecionado mais de um nó (select maior que 1) scatter - Cada nó especificado no select vai para um nó diferente, não
agrupando os processos em um único nó mesmo que caibam excl - Apenas o seu job executa no nó escolhido
Há outros parâmetros que você pode conferir no manual e eles podem ser agrupados usando o “:” como separador, por
exemplo: #PBS -l place=scatter:excl.
Caso queira apenas utilizar os cores reais, deve-se “pinar” o seu processo no determinado core. Para isso, recomendo que,
caso utilize o openmpi use o comando cpu-set e caso utilize o compilador da intel, use o comando dplace (que é uma
ferramenta da SGI), este ultimo funciona apenas para o mpi da intel.
Para utilizar o cpu-set com o openmpi você pode seguir o exemplo abaixo, em que são pinados 4 cores reais, os cores: 0,1,2 e
3
mpirun --cpu-set 0-3 --map-by core --bind-to core -n $CORES $PBS_O_WORKDIR/mpiteste > $PBS_O_WORKDIR/out
Para visualizar o mapa dos IDs dos cores em cada nó, você pode executar o comando: “numactl -H” no nó desejado.
Ele mostrará algo como abaixo em que, para o caso do Navier, como cada nó tem 2 processadores com 20 cores cada, os 10
primeiros cores de cada processador(socket) são os cores reais, logo os cores reais do nó r1i0n0 são 0 à 9 e 10 à 19
Assim, tanto no cpu-set como no dplace, para reservar todos os 20 cores reais o comando é passado por intervalo: --cpu-set 0-
19 ou dplace -c 0-19.
Caso queira dois cores específicos, basta separa-los por vírgula, por exemplo: --cpu-set 0,2,4,12,13,15
© Gitea Versão: e9b984e Página: 58ms Template: 1ms português do Brasil JavaScript licenses API Site Go1.11.1