Visão geral do cluster

A visão geral do cluster pode ser entendido pelos conceitos básicos de como funciona cada componente. Essa página se destina apenas introduzir os conceitos, que serão aprofundados em outras páginas.

Fluxo de trabalho do HPC

O primeiro passo é entender como o cluster e executar programas em computadores de alto desempenho funciona.

Diagrama de funcionamento de computação de alto desempenho.

O uso de HPC para realizar processamento paralelo e de alto desempenho consiste em:

  1. Copiar o experimento para o HPC.

  2. Acessar o nodo de acesso, representado na figura pelo quadrado azul.

  3. Submeter o experimento para o gerenciador de trabalho do HPC, no caso o slurm. Representado na figura pelo retângulo verde.

  4. O gerenciador de trabalho do HPC colocará o trabalho na fila e assim que tiver recursos disponíveis o gerenciador executará o job Representado na figura losango laranja.

  5. A execução do seu experimento será feito em algum nodo de processamento computing node, o nodo escolhido será conforme as especificações do seu experimento. Os nodos de processamentos são representados pelo quadrado vermelhos.

Conceitos fundamentais

Jobs

Quando submete um programa para executar em um computador de processamento chamamos de jobs. Um jobs pode ter os seguintes estados:

  • PENDING: está na fila para ser executado.

  • RUNNING: está sendo executado

Partições

Partições partitions podem serem vistas como filas de trabalho do cluster. Um cluster pode ter várias partições, normalmente as partições representam uma divisão de recursos físicos ou lógicos. Por exemplo, uma partição contém somente servidoras com placas de vídeos.
Para visualizar as partições utilize o comando sinfo.

Exemplo de sinfo: Visualizando partições:

odair@c3hpc:~$ sinfo
PARTITION        AVAIL  TIMELIMIT  NODES  STATE NODELIST
1d                  up 1-00:00:00      9   idle node[2-7],proc[1-2],pti
7d                  up 7-00:00:00      2  alloc vti[1-2]
7d                  up 7-00:00:00      9   idle node[2-7],proc[1-2],pti
...                    ...            ...            ...
cpu                 up 7-00:00:00      9   idle node[2-7],proc[1-2],pti
cpu-long            up 30-00:00:0      9   idle node[2-7],proc[1-2],pti
maratona-testing    up      15:00      9   idle node[2-7],proc[1-2],pti
maratona            up 1-00:00:00      9   idle node[2-7],proc[1-2],pti
odair@c3hpc:~$

Filas

As filas mostram os trabalhos que estão em execução, aguardando recursos serem liberados para executar e trabalhos com falhas. O comando para visualizar as filas é:
squeue

Exemplo de squeue

odair@c3hpc:~$ squeue -l
Mon Sep 26 23:47:07 2022
   JOBID PARTITION     NAME     USER    STATE       TIME TIME_LIMI  NODES NODELIST(REASON)
   12139       gpu     exp2    odair  RUNNING       3:01 7-00:00:00      1 pti
   12142       gpu     exp2    odair  RUNNING       3:01 7-00:00:00      1 pti
   12138       gpu     exp2    odair  RUNNING       3:04 7-00:00:00      1 pti
   12150  maratona     exp4    odair  PENDING       0:00 1-00:00:00      1 (Resources)
   12151  maratona     exp4    odair  PENDING       0:00 1-00:00:00      1 (Priority)
   12149  maratona     exp4    odair  RUNNING       1:57 1-00:00:00      4 node[6-7],proc[1-2]
   12148  maratona     exp4    odair  RUNNING       2:12 1-00:00:00      4 node[4-7]
   12147  maratona     exp4    odair  RUNNING       2:15 1-00:00:00      3 node[3-5]
   12144  maratona     exp3    odair  RUNNING       2:47 1-00:00:00      1 node3
   12143  maratona     exp3    odair  RUNNING       2:50 1-00:00:00      1 node3
odair@c3hpc:~$

No exemplo mostra trabalhos que estão sendo executados e os que não estão, além do motivo para não estar em execução. O comando squeue -l mostra de forma longa a saída.

Dica

Recomenda adicionar o seguinte alias no seu .bashrc ou .zshrc:
alias sq="squeue -u ${USER}"
Esse, aliás faz com que só mostre jobs do seu usuário e não mostra de outros usuários.

Módulos

O cluster possui diversos softwares com diversas versões, para lidar com vários softwares com muitas versões se utiliza um mecanismo de módulo, onde o usuário carrega um software na versão X apenas para a sessão dele.
Utilize o comando module avail para mostrar todos os módulos disponíveis. A saída será algo do gênero:

Em alguns casos algumas bibliotecas só funcionam em versões especifica do python ou do cuda. Para o exemplo veremos qual a versão padrão do python3 e mudara para versão 3.8.4.

Mostrando módulos

Para mostrar todos os módulos disponíveis no cluster utilize o comando:
module avail
A saída deve ser algo semelhante ao exemplo abaixo:
odair@c3hpc:~$ module avail
----------------------- /usr/local/Modules/modulefiles --------------
applications/bazel/0.11.1          libraries/gdrcopy/gcc-6.4.0
applications/cmake/3.11.0          libraries/gdrcopy/gcc-7.3.0
       ...                                 ...
interpreters/python/3.6.8          libraries/openblas/0.2.20-gcc-6.4.0
interpreters/python/3.8.14         libraries/openblas/0.2.20-gcc-7.3.0
libraries/boost/1.66.0-gcc-6.4.0   libraries/openmpi/4.0.0-gcc-6.4.0
      ...                                  ...
libraries/cuda/10.1                tools/nvtop/1.0.0-cuda9.0
libraries/cuda/11.0                use.own

Key:
loaded  modulepath
odair@c3hpc:~$

Carregando módulos

Para carregar um módulo utilize o comando:
module load <modulo>
Onde: <module> é o nome do módulo a ser carregado.
Exemplo carregando python3 versão 3.8.14

Para demostrar como funciona verificaremos a versão padrão do python3 e carregar a versão 3.8.14

testem@c3hpc:~$ python3 --version # verifica versão do login node
Python 3.9.2
testem@c3hpc:~$ srun python3 --version # verifica versão de um computer node
Python 3.9.2
testem@c3hpc:~$ module load interpreters/python/3.8.14 # carrega python3 versão 3.8.14
testem@c3hpc:~$ python3 --version # verifica versão do login node
Python 3.8.14
testem@c3hpc:~$ srun python3 --version # verifica versão de um computer node
Python 3.8.14
testem@c3hpc:~$
Vejam que após executar o comando:
module load interpreters/python/3.8.14
A versão do python3 muda. Módulos são uteis principalmente quando se deseja utilizar diferentes versões de cuda e python.

Descarregando módulo

Para fazer o unload de um determinado módulo execute o comando:
module unload <modulo> Onde modulo é o nome do módulo.

Requisitando módulos e softwares

Para requisitar módulos, novas versões de softwares ou até mesmo a instalação de novas aplicações envie e-mail para c3hpc@c3sl.ufpr.br.