Ajuda ao Usuário

 

Tutorial LabCC

 

[TOC]
* [Online Updation](#online-updation)
	* [Summary](#summary)
	* [Questions](#questions)
	* [Logical Picture](#logical-picture)
	* [Tables](#tables)

Introdução

Esta página contém uma documentação sobre o uso das máquinas remotas do Laboratório de Computação Científica (LabCC) localizado no Centro Tecnológico de Joinville da UFSC. Atualmente o LabCC conta com duas workstations e um cluster computacional.

A leitura deste documento é quisito necessário antes de utilizar as máquinas remotas. Este tutorial, assume que você tem alguma experiência no uso da linha de comando do sistema operacional LINUX e que você já possua um usuário configurado nas Workstation/Clusters.

Se você necessite de uma introdução ao uso da linha de comando em linux, os vídeos abaixo foram criados para um curso do software OpenFOAM e aborda o básico da linha de comando para navegar e entender o sistema de arquivos do LInux. Existe também uma série de bons tutoriais e cursos na internet que podem auxiliá-lo.

Parte 1 – Estrutura de Arquvos
Parte 2 – Comandos Básicos
Parte 3 – Comandos Básicos (Continuação)

Caso você não tenha ainda um usuário ou encontre alguma dúvida na execução dos processos favor contatar o coordenador do laboratório que atualmente é:

E-mail: labcc.ctj@contato.ufsc.br

Regras gerais para o uso dos equipamentos

  1. Ao utilizar os equipamentos, sempre execute processos utilizando o gerenciador de fila (slurm). Este assegurará que os recursos sejam utilizados de maneira otimizada e organizada;
  2. É permitido que os usuários executem pequenos testes sem usar o gerenciador de filas, cuja execução dure poucos segundos e não demandem uma quantidade muito grande de memoria RAM;
  3. O usuário é de uso individual é não pode sob nenhuma hipótese ser tranferido para o uso de outrem;
  4. A utilização de softwares comerciais só podem ser realizada mediante a correta configuração de uma licença válida;
  5. O usuário é responsável pelos seus dados, tanto pelos dados que o mesmo coloca em sua pasta de arquivos, quanto também por fazer o backup dos dados sensíveis;
  6. O uso das máquinas remotas está restrito ao escopo descrito na solicitação e autorizado pelo supervisor do laboratório, estando sempre . Seu ligado as atividades fins da unversidade que são ensino, pesquisa e extensão.

Lista de Máquinas disponíveis

Na tabela baixo você encontrará uma lista dos endereços e tipos (Workstations/Clusters) dos equipamentos atualmente disponíveis no laboratório.

Nome Ip Endereço Tipo
thebrain 150.162.217.65 thebrain.grad.research.ufsc.br Workstation
multivac 150.162.217.13 multivac.grad-research.ufsc.br Workstation
hal 150.162.217.102 hal.grad-research.ufsc.br Cluster

thebrain (workstation)

Este equipamento é uma workstation montada pela empresa Desk Tecnologia e possui a seguinte configuração:

  • Número de Processadores: 1
  • Modelo do Processador: Intel® Xeon® CPU E5-2630 v3 @ 2.40GHz
  • Número de Cores por Processador: 8
  • Total de Cores: 8
  • Memória RAM: 4 x 8192 MB = 32 GB
  • Armazenamento: 1 (SSD) x 480GB = 480 GB
  • Número de GPUs: 1
  • Modelos das GPUs: Nvidia Quadro K620
  • ** Sistema Operacional**: Debian 8.4 (Linux)

multivac (workstation)

Este equipamento é uma workstation montada pela empresa Desk Tecnologia e possui a seguinte configuração:

  • Número de Processadores: 2
  • Modelo do Processador: Intel® Xeon® CPU E5-2650 0 @ 2.00GHz
  • Número de Cores por Processador: 8
  • Total de Cores: 16
  • Memória RAM: 12 x 16384 MB = 192 GB2
  • Armazenamento: 2 (HDD) x 2 TB = 4 TB
  • Número de GPUs: 2
  • Modelos das GPUs: Nvidia Quadro 6000 + Nvidia Tesla C2050
  • Sistema Operacional: Debian 8.4 (Linux)

hal (workstation)

O cluster hal é contém nós computacinais da SuperMicro adquiridos com recursos de projetos de pesquisa com a Petrobrás, Agência Espacial Brasileira e BMW.

Atualmente o cluster possui 23 nós, sendo que um deles, denominado de hal, é utilizado como nós master (head node). Ele gerencia o uso dos outros nós, habilita o acesso externo (internet) e armazena os dados dos usuários (storage). Os outros 22 nós são denominados nós computacionais, ou seja, são os que efetivamente são utilizado para o processamento de alto desempenho. Estes nós são separados em dois grupos um somente com processadores/CPUs (node001 até node020) e nós que contam também com GPUS (node021 e node022).

Abaixo você econtrará uma descrição mais detalhada dos recursos disponíveis em cada um dos nós computacionais;

  • node[001-020]
    Número de Processadores por Nó: 2
    Modelo do Processador: Intel® Xeon® CPU E5-2640 v4
    Frequência do Processador: 2.40GHz
    Número de Cores por Processador: 10
    Memória RAM por Nó: 128 GB*
    Armazenamento: 1 TB

*Os nós 001 e 002 possuem somente 64GB de RAM.

  • node[021]
    Número de Processadores por Nó: 2
    Modelo do Processador: Intel® Xeon® CPU E5-2660 v4
    Frequência do Processador: 2.00GHz
    Número de Cores por Processador: 14
    Memória RAM: 256 GB
    Armazenamento: 1 TB
    Número de GPUs: 4
    Modelos das GPUs: Nvidia Tesla K40m
  • node[022]
    Número de Processadores por Nó: 2
    Modelo do Processador: Intel® Xeon® CPU E5-2660 v2
    Frequência do Processador: 2.20GHz
    Número de Cores por Processador: 10
    Memória RAM: 128 GB
    Armazenamento: 1 TB
    Número de GPUs: 4
    Modelos das GPUs: Nvidia Tesla K40m

O discos rígidos dos nós computacionais são utilizados para armazenar o sistema operacional. Os dados do usuários ficam todos armazenados no head node (hal) e são compartilhados via rede utilizando o sistema NTFS. Logo, quando um processo que está rodando nos nós computacionais lê/escreve em arquivos, o dado é transmitido via rede que é então gravado/lido nos discos presentes no head node.

Configurando seu acesso ao cluster

Esta seção aborda a configuração inicial do computador local, permitindo o acesso das Workstations/Clusters de forma fácil e rápida.

Obs 1 : Para que seja possível executar os comandos dessa seção você já deve possuir um usuário na máquina desejada. Quando um novo usuário é solicitado ao administrador, este cria o mesmo em todas as máquinas listadas na seção anterior.

O acesso aos servidores descritos na seção anterior são realizados através do protocolo de rede ssh. A maioria das distribuições linux possui a versão cliente deste protocolo já instalada. Caso você utilize windows é necessário instalar o cliente ssh.

Usuários Linux

Para usuários Linux (distribuições Debian, Ubuntu e Mint) criei um script que faz toda a configuração. Você pode baixar e executar o script em único comando:

wget -O - https://bitbucket.org/diogosiebert/myscripts/raw/latest/labcc_config.sh | bash

Outra alternativa é baixar o script pelo browser e executar com o comando:

bash labcc_config.sh

Caso você opte por executar a operação manualmente, um passo a passo pode ser encontrado no link.

Após a configuração você poderá acessar o cluster pelo executando o seguinte comando na seu computador (local)

ssh nome_da_maquina_remota

Para acessar o cluster (hal), por exemplo

ssh hal

Obs : Utilizar a configuração contida no script (ou no passo a passo) não é mandatória para a utilização das máquinas, porém esta torna o uso bem mais prático e produtivo. Sem a configuração, para acessar o cluster, por exemplo, é necessário o comando “ssh usuario@endereco_da_maquina” e então a digitação da senha.

O script configura também a montagem das máquinas remotas. Ou seja, você poderá visualizar e interagir com o sistema de arquivos da máquina remota como se estes fossem uma pasta local. Para montar a pasta remota, execute o seguinte comando no seu computador (local):

mount ~/remote/nome_da_maquina_remota

Após este comando arquivos podem ser copiados para o cluster através da pasta ~/remote/nome_da_maquina_remota, usando o comando cp ou mesmo através de gerenciador de arquivos

Obs : Sem a configuração do script (ou do passo a passo) será necessário copiar os arquivos usando o comando scp. Para maiores informações sobre este comando podem ser encontradas em https://linuxize.com/post/how-to-use-scp-command-to-securely-transfer-files/

Checando os recursos disponíveis no cluster

Ao criar a sua conta no cluster, seu usuário recebe acesso a um conjunto de nós computacionais e também a uma cota de armazenamento

Os nós computacionais são agrupados em partições, para chegar qual partições você tem acesso, execute o seguinte comando na máquina remota

sinfo -s

Um exemplo de saída do seguinte comando é mostrado abaixo:

PARTITION AVAIL  TIMELIMIT   NODES(A/I/O/T) NODELIST 
open_cpu*    up 30-00:00:0          6/0/0/6 node[001-006] 
close_cpu    up   infinite        10/4/0/14 node[007-020] 

Assim o sistema informa acesso a duas partições a open_cpu, que dá acesso, aos nós 001 até 006 e a partição close_cpu que dá acesso aos nós 007 até 020. A propriedade TIMELIMIT é o tempo máximo que um processo pode demorar na referida partição. Sendo atigindo este tempo o gerenciador de filas terminará (matará) o processo. Um tempo menor ao TIMELIMIT da partição pode ser definido ao submeter o trabalho para o gerenciador de filas.

Os valores (A/I/O/T) se referem,respectivamente, a quantidade de nós naquela fila ques estão alocados, disponível, outro estado (bloqueado, desligado) e o total de nós.

Quando um trabalho for submetido é preciso informar a partição onde este será alocado. Caso nenhuma participação seja informada, o gerenciador usuará a partição padrão, que aquela que contém um * ao lado do nome.

Além das particões disponíveis é importante chegar o tamanho da cota de armazenamento que o usuário possuí na máquina remota, executando o comando:

quota -us

Um exemplo de resultado desse comando é mostrado abaixo:

Disk quotas for user XXXXXX (uid 1039): 
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1    332M    150G    200G             707       0       0        

O valor space indica o valor atualmente ocupado por dados do usuário. Já o valor na seção quota, é denominado de soft limit. Após os dados do usuário ultrapassarem o soft limit o sistema mostrará mensagens de erro quando novos arquivos forem criados, porém o sistema não impedirá sua gravação. O valor na seção limit é denominado de hard limit e quando este é atingido, o sistema bloqueia a escrita em disco. É importante que o usuário fique atento a este valores, pois ocupação total da cota pode impedir a gravação de resultados de trabalho em execução.

Usando o sistema de módulos

Como em sistemas de computação de alto desempenho a demanda quanto a compiladores e bibliotecas difere bastante de usuário para usuário. Muitas vezes usuários requerem diferentes versões do mesmo software ou biblioteca. Para gerenciar um sistema com multiplas versões ou variações do mesmo pacote utiliza-se um sistema conhecido Environment Modules (módulos de ambiente).

Variáveis de ambiente são utilizadas pelo sistema operacional para configurar o sistema. A variável PATH, por exemplo, é utilizada para armazenar as pastas onde o sistema deve procurar pelos binários/executáveis. Do mesmo modo existe uma variável para configura as pastas onde estão armazenadas as bibliotecas e outra para configurar a localição de pacotes do python.

Na prática, as aplicações em um cluster são instaladas em uma pasta separada do sistema, que a priori não estão nessas variáveis de ambiente e por este motivo o sistema não as encontrará. O que os módulo de ambiente fazem é alterar as variáveis de ambiente para que o binário de uma determinada versão do programa (ou a biblioteca) seja então encontrada. Quando a aplicação não é mais necessária, é possível descarregar o módulo, o que retirará das variáveis de ambiente a localização do programa/biblioteca.

Para listar os módulos atualmente disponíveis no cluster utilize o comando:

module avail

Abaixo segue um exemplo do resultado desse comando.

--------------- /opt/ohpc/admin/spack/0.15.0/share/spack/lmod/linux-centos8-x86_64/Core ----------------
   adios2/2.6.0                  libsodium/1.0.18            paraview/5.6.0
   c-blosc/1.17.0                libzmq/4.3.2                paraview/5.8.0               (D)
   cantera/2.4.0-openblas        lz4/1.9.2                   parmetis/4.0.3
   cgal/4.13                     metis/5.1.0                 py-tensorflow/2.2.0-openblas
   cuda/10.2.89                  mpfr/4.0.2                  python/3.7.7
   fftw/3.3.8                    openfoam-org/5.0            snappy/1.1.7
   gcc/7.2.0                     openfoam-org/6              su2/7.0.3
   gcc/8.2.0              (D)    openfoam-org/7       (D)    sundials/2.7.0
   gmp/6.1.2                     openfoam/1706               sz/2.0.2.0
   hdf5/1.10.6                   openfoam/1912_200506 (D)    zfp/0.5.5
   jdk/1.8.0_241-b07             openmpi/2.1.6               zstd/1.4.5
   libfabric/1.9.1               openmpi/4.0.4        (D)

-------------------------------------- /opt/ohpc/pub/modulefiles ---------------------------------------
   EasyBuild/4.3.0      cmake/3.16.2           libfabric/1.10.1 (D)    prun/2.0
   OpenFOAM/5.x         compilers/gcc-7.2.0    os                      singularity/3.4.2
   autotools            gnu9/9.3.0             papi/5.7.0              ucx/1.8.0
   charliecloud/0.15    hwloc/2.1.0            pmix/3.1.4              valgrind/3.15.0

Utilizando o programa openfoam como exemplo, se tentarmos executar algum binário (executável) do openfoam, sem carregar o módulo o sistema retornará arquivo não encontrado.

[diogo@hal home]$ icoFoam --help
-bash: icoFoam: command not found

Para carregar o módulo openfoam-org/7, por exemplo, utilizamos o comando

module load openfoam-org/7

Carregando o módulo, o sistema passará a encontrar o executável quando o comando icoFoam –help for executado novamente.

Para listar os módulos atualmente carregados

module list

E para descarregar o módulo é só utilizar o comando

module unload  openfoam-org/7

Caso um módulo seja utilizado constantemente pode-se configurá-lo para que este seja carregado no início da seção.

module initadd openfoam-org/7

Assim, a próxima vez que o usuário logar na máquina, o modulo será automáticamente carregado.

E para remover o pacote da lista de carregamento automático;

module initrm openfoam-org/7

Caso o cluster não possua um determinado compilador/programa/biblioteca ou a versão que seja necessário , favor contatar o administrador para verificar viabilidade da instalação desse pacote.

O cluster conta atualmente com o software spack que baixa o código fonte, compila e configura um módulo para uma variedade de pacotes/software em diferentes versões. Caso o pacote/versão que sua aplicação necessita esteja no spack. a instalação da mesma pelos administradores do cluster é muito mais ágil. Para conferir a lista de pacotes disponíveis através do spack consulte o link

https://spack.readthedocs.io/en/v0.15.0/package_list.html

Clicando em cima do nome da aplicação/biblioteca é possível visualizar também as versões disponíveis.

Usando o Geranciador de Filas

Esta seção trata da submissão de processos simples, ou seja, que utilizam um único nó. Como nó entende-se uma unidade computacional que tem uma memória comum. Neste caso cada workstations contém um único nó. Já o cluster contém vários nós.

Para utilização do cluster para a submissão de processos que usam vários nós computacionais e várias GPUs recomenda-se a leitura do manual do usuário do cluster.

Atualmente tanto o cluster quanto a workstation utilizam o gerenciador de filas chamado SLURM. O SLURM é responsável por receber a submissão de trabalho, verificar se há recursos disponíveis (principalemente núcleos e memória) e enviar informações ao usuário caso o estado do trabalho mude.

Para obter uma informação detalhada sobre os nós utilizar o comando

scontrol show node

Na figura baixo você poderá o resultado do comando no cluster hal (quando o mesmo só tinha 3 nós).

Note que Sockets representa o número de processadores presentes neste nó e CoresPerSocket o número de núcleos/cores em cada processador. A quantidade total de memória ram consta no parâmetro RealMemory.

Submetendo um trabalho

Para submeter um trabalho para o slurm é necessário escrever um pequeno script. Abaixo são apresentados dois exemplos de script, um para código que utiliza multiplos cores de um mesmo nó (openMP) e outro para códigos MPI. Ambos os scripts podem ser escontrados no cluster(hal) na pasta /cm/shared/examples. Para submeter seu código utilize o comando:

sbatch script.sh

Obs: Não remova as carácteres de comentário # na frente da palavra chave SBATCH. As diretrizes para o SLURM são passadas por comentários. Desse modo o arquivo criado é um script na linguagem bash. Caso ele seja executado sem utilizar o SLURM, as opções são ignoradas uma vez que elas são comentário. Caso você execute o script usando o SLURM, o mesmo varrerá os comentários e interpretará as opções escolhidas.

Script de exemplo run_openmp_slurm.sh

#!/bin/bash
#
# Script de exemplo para submeter trabalho que não use MPI 
#
#SBATCH --job-name=nomeDoTrabalho          # Nome do trabalho a ser executado (para melhor identificação)
#SBATCH --partition=nomeDaFila             # Em qual fila o trabalho será executado (ver filas disponíveis com o comando sinfo)
#SBATCH --nodes 1                          # Número de nós (computadores) que serão utilizados (1 para códigos openMP)
#SBATCH --cpus-per-task=4                  # Número de cores que será utilizado
#SBATCH --mem 1000                         # Quanto de memória em MB por nó (computador) o programa necessitará. 
#SBATCH --time=00:00:00                    # Tempo máximo de simulação (D-HH:MM). O tempo 00:00:00 corresponde a sem limite.
#SBATCH -o slurm.%N.%j.out                 # Nome do arquivo onde a saída (stdout) será gravada %N = Máquina , %j = Número do trabalho. 
#SBATCH -e slurm.%N.%j.err                 # Nome do arquivo para qual a saída de erros  (stderr) será redirecionada.
#SBATCH --mail-user=diogo.siebert@ufsc.br  # Email para enviar notificações sobre alteração no estados do trabalho
#SBATCH --mail-type=BEGIN                  # Envia email quando o trabalho for iniciado
#SBATCH --mail-type=END                    # Envia email quando o trabalho finalizar
#SBATCH --mail-type=FAIL                   # Envia email caso o trabalho apresentar uma mensagem de erro.

# Repassa ao OpenMP quantos cores serão utilizados 
if [ -n "$SLURM_CPUS_PER_TASK" ]; then
	omp_threads=$SLURM_CPUS_PER_TASK
else
	omp_threads=1
fi
export OMP_NUM_THREADS=$omp_threads

# Comando a ser executado. Caso o código necessite o uso de um módulo durante a execução (como o uso de bibliotecas dinâmicas) que não seja carregado automaticamente, incluir o carregamento do mesmo.

# Exemplo de carregamento de um módulo. 
module load boost

./grad-lbm

Exemplo de script para executar código que usa MPI.

#!/bin/bash
#
# Script de exemplo para submeter trabalho que use MPI
#
#SBATCH --job-name=nomeDoTrabalho          # Nome do trabalho a ser executado (para melhor identificação)
#SBATCH --partition=nomeDaFila             # Em qual fila o trabalho será executado (ver filas disponíveis com o comando sinfo)
#SBATCH --nodes 4                          # Número de nós (computadores) que serão utilizados (1 para códigos openMP)
#SBATCH --ntasks=80                        # Número total de cores que será utilizado
#SBATCH --mem 1000                         # Quanto de memória em MB por nó (computador) o programa necessitará. 
#SBATCH --time=00:00:00                    # Tempo máximo de simulação (D-HH:MM). O tempo 00:00:00 corresponde a sem limite.
#SBATCH -o slurm.%N.%j.out                 # Nome do arquivo onde a saída (stdout) será gravada %N = Máquina , %j = Número do trabalho. 
#SBATCH -e slurm.%N.%j.err                 # Nome do arquivo para qual a saída de erros  (stderr) será redirecionada.
#SBATCH --mail-user=diogo.siebert@ufsc.br  # Email para enviar notificações sobre alteração no estados do trabalho
#SBATCH --mail-type=BEGIN                  # Envia email quando o trabalho for iniciado
#SBATCH --mail-type=END                    # Envia email quando o trabalho finalizar
#SBATCH --mail-type=FAIL                   # Envia email caso o trabalho apresentar uma mensagem de erro.

# Comando a ser executado. Caso o código necessite o uso de um módulo durante a execução (como o uso de bibliotecas dinâmicas)
# que não seja carregado automaticamente, incluir o carregamento do mesmo. No caso de código MPI deve ser carregado pelo menos
# uma implementação da interface MPI.

# Exemplo de carregamento de um módilo
module load openmpi/mlnx/gcc/64/2.0.2a1

# Trabalho a ser executado.
mpiexec ./grad-lbm

Acompanhando o trabalho submetido

Para verificar os trabalhos que estão na fila da workstation/cluster basta utilizar o comando

squeue

Lembre que o slurm redirecionará a saída do programa para o arquivo especificado na seguinte linha do script:

#SBATCH -o slurm.%N.%j.out

Logo para visualizar o que o programa imprimiria na tela e necessário vero conteúdo do referido arquivo.

Cancelando o trabalho submetido

Para cancelar a execução de um programa utilize o comando

scancel jobid

Onde jobid é o número de tralbalho que é informado após executar o comando sbatch. O número do trabalho pode também ser verificado usando o comando squeue.