Skip to content

Aula 02: Acessando o Cluster Franky

Na Atividade 2, você irá executar as implementações que foram testadas na Atividade 1, mas agora no ambiente de um cluster HPC usando SLURM. O objetivo é observar como o ambiente de cluster, com suas diferentes arquiteturas de hardware, pode impactar o desempenho das operações computacionalmente intensivas que você já explorou.

Parte 0: Configurando seu acesso ao Cluster Franky

Para ter acesso ao Cluster Franky você precisa configurar suas credenciais de acesso e realizar acesso remoto via SSH.

As chaves foram enviadas para o seu email Insper, Faça o download da pasta completa, que contém os arquivos id_rsa (chave privada) e id_rsa.pub (chave pública). Dependendo do sistema operacional que você utiliza, siga as instruções abaixo para configurar corretamente seu acesso ao cluster.

Para Macbook ou Linux:

Abra o terminal, navegue até a pasta onde a chave privada (id_rsa) foi baixada, mova a chave para o diretório .ssh em sua home:

mv id_rsa ~/.ssh/

Garanta que apenas você possa ler o arquivo:

chmod 400 ~/.ssh/id_rsa

Conecte-se ao cluster utilizando o comando SSH:

O login é o seu "usuario Insper", o endereço de IP foi fornecido durante a aula.

ssh -i ~/.ssh/id_rsa login@ip_do_cluster
ou

ssh login@ip_do_cluster

Para Windows:

Usando OpenSSH :

Abra o PowerShell ou Windows Terminal. Navegue até a pasta onde a chave privada (id_rsa) foi baixada, mova a chave para a pasta .ssh em seu diretório de usuário:

mkdir $env:USERPROFILE\.ssh
mv id_rsa $env:USERPROFILE\.ssh\

Certifique-se de que as permissões estão corretas:

icacls $env:USERPROFILE\.ssh\id_rsa /inheritance:r /grant:r "$($env:USERNAME):(R)"
Conecte-se ao cluster usando o comando:
ssh -i $env:USERPROFILE\.ssh\id_rsa login@ip_do_cluster

Configurar o VS Code para Acesso Remoto ao Cluster

Instale a Extensão Remote - SSH:

Abra o VS Code, vá para a aba de extensões (ícone de quadrado no lado esquerdo). Pesquise por "Remote - SSH" e instale a extensão oficial da Microsoft.

Configurar o Acesso Remoto:

Pressione Ctrl+Shift+P (ou Cmd+Shift+P no Mac) para abrir o painel de comandos.

Digite Remote-SSH: Add New SSH Host... e selecione a opção.

Insira o comando SSH que você utilizou anteriormente:

ssh -i ~/.ssh/id_rsa login@ip_do_cluster
Escolha o arquivo de configuração padrão (~/.ssh/config para Mac/Linux ou C:\Users\seu_usuario\.ssh\config para Windows).

Pressione Ctrl+Shift+P (ou Cmd+Shift+P no Mac) novamente e digite Remote-SSH: Connect to Host.... Selecione o host configurado.

O VS Code abrirá uma nova janela conectada ao ambiente remoto do cluster.

ssh

Gerenciar Projetos Remotamente:

Após a conexão, você pode abrir pastas e arquivos no cluster diretamente pelo VS Code.

Utilize os recursos do VS Code, como o terminal integrado e o debug para trabalhar no cluster Franky.

Executando a Atividade no Cluster Franky usando SLURM

Um arquivo .slurm é usado para "lançar jobs" no sistema SLURM, especificando os recursos necessários para a execução, como memória, número de máquinas e núcleos. Nesse arquivo, também definimos como desejamos o output do executável e onde o sistema pode encontrar o arquivo a ser executado. Como a equipe que gerencia o Cluster definiu que os jobs sejam lançados apenas da pasta SCRATCH, podemos omitir o caminho do arquivo nos nossos arquivos .slurm.

Warning

As instruções #SBATCH são tecnicamente consideradas "comentários" pelo interpretador de comandos do shell (bash), mas não são realmente ignoradas. Quando você escreve um script para ser executado pelo SLURM, o bash interpreta as linhas #SBATCH como comentários normais, enquanto o gerenciador de jobs SLURM interpreta essas mesmas linhas como diretivas que definem como o job deve ser executado.

Tip

Não é necessário neste momento, mas se você quiser transferir arquivos da sua máquina para o cluster e vice versa, você pode usar o comando scp mais detalhes aqui

Conhecendo o Sistema

Antes de começar a fazer pedidos de recursos pro SLURM, vamos conhecer os diferentes hardwares que temos disponível no Franky. Vamos utilizar alguns comandos de sistema operacional para ler os recursos de CPU, memória e GPU disponíveis

Comandos utilizados

  • lscpu: mostra detalhes da CPU (núcleos, threads, memória cache...)
  • cat /proc/meminfo: mostra detalhes sobre a memória RAM
  • nvidia-smi: mostra detalhes de GPU, se disponível

Comando SRUN

srun --partition=normal --ntasks=1 --cpus-per-task=1 --mem=1G --time=00:05:00 \
     --pty bash -c "hostname && cat /proc/meminfo | grep -E 'MemTotal|MemFree|MemAvailable|Swap' && lscpu | grep -E 'Model name|Socket|Core|Thread|CPU\\(s\\)|cache'"
srun

É o comando do SLURM usado para executar uma tarefa interativamente em um nó do cluster.

--partition=normal

Indica em qual fila (partição) o job será executado. No seu caso, normal pode ser substituído por qualquer outra fila do sistema

--ntasks=1

Solicita 1 tarefa (processo). Se você estivesse rodando um código paralelo, faz sentido trocar esse valor.

--cpus-per-task=1

Cada tarefa receberá 1 CPU (core). Quando estiver usando paralelismo com várias threads , faz sentido aumentar esse valor.


--mem=1G

Aloca 1 gigabyte de memória RAM para essa tarefa. Se ultrapassar esse limite, o job será encerrado.

--time=00:05:00

Define um tempo máximo de execução de 5 minutos. Depois disso, o SLURM mata o processo automaticamente.

--pty bash

Solicita um terminal para o SLURM dentro do nó de computação. Interessante para fazer testes no código ou realizar debugs

bash -c "hostname && cat /proc/meminfo | grep -E 'MemTotal|MemFree|MemAvailable|Swap' && lscpu | grep -E 'Model name|Socket|Core|Thread|CPU\\(s\\)|cache'"

Indica que o SLURM vai executar um conjunto de comandos bash, definidos entre aspas ("). Esses comandos serão executados dentro do nó alocado pela fila.


Comando O que faz
hostname Mostra o nome do nó que foi alocado pelo SLURM
cat /proc/meminfo \| grep -E 'MemTotal\|MemFree\|MemAvailable\|Swap' Exibe informações de RAM diretamente do kernel
lscpu \| grep -E 'Model name\|Socket\|Core\|Thread\|CPU\\(s\\)\|cache' Mostra Infos da CPU como modelo do processador, núcleos, threads e caches

Obs: barras invertidas (\) são necessárias para indicar caracteres especiais corretamente, como os parênteses, quando o comando é passado dentro de aspas no bash -c.

Você deve ver algo como:

fila normal

O comando abaixo faz exatamente a mesma coisa, mas eu coloquei ele dentro de um shell script para ter uma formatação melhor no display:

srun --partition=normal --ntasks=1 --pty bash -c \
"echo '=== HOSTNAME ==='; hostname; echo; \
 echo '=== MEMORIA (GB) ==='; \
 cat /proc/meminfo | grep -E 'MemTotal|MemFree|MemAvailable|Swap' | \
 awk '{printf \"%s %.2f GB\\n\", \$1, \$2 / 1048576}'; \
 echo; \
 echo '=== CPU INFO ==='; \
 lscpu | grep -E 'Model name|Socket|Core|Thread|CPU\\(s\\)|cache'"

fila normal formatada

O comando sinfo mostra quais são as filas e quais são os status dos nós

sinfo
O comando abaixo mostra detalhes sobre os recursos de cada fila

scontrol show partition

Recomendo que você mude o nome da fila (partition) no comando abaixo para se ambientar no Cluster Franky e desconrir quais são as diferenças entre as filas

srun --partition=normal --ntasks=1 --cpus-per-task=1 --mem=1G --time=00:05:00 \
     --pty bash -c "hostname && cat /proc/meminfo | grep -E 'MemTotal|MemFree|MemAvailable|Swap' && lscpu | grep -E 'Model name|Socket|Core|Thread|CPU\\(s\\)|cache'"

Atividade 02

Na aula passada nós vimos que a linguagem importa, além disso, existem recursos da linguagem que tem o poder de acelerar o nosso código, e mais ainda, podemos usar otimizações a nível de compilação para ir além e conseguir uma otimização ainda maior. Agora vamos executar os scripts da aula passada no Cluster Franky para verificar o quanto o hardware impacta nessa abordagem, como será que ficará o desempenho ao executar os códigos em diferentes arquiteturas de computadores?

Vamos utilizar o SLURM para pedir recursos computacionais do nosso Cluster, agora que você ja conhece o hardware que tem em cada fila, faça as suas escolhas de recursos e teste o seu código!

Script SLURM para o código em Python:

media_py.slurm

#!/bin/bash
#As instruções SBATCH não devem ser descomentadas

#SBATCH --job-name=OLHA_EU
# define o nome do job. Esse nome aparece nas listas de jobs e é útil para identificar o job.

#SBATCH --output=media_py.out
# Especifica o arquivo onde a saída padrão (stdout) do job será salva.

#SBATCH --ntasks=1
# Define o número de tarefas que o job executará. Neste caso, o job executa uma única tarefa.

#SBATCH --time=00:10:00
# Define o tempo máximo de execução para o job. Neste caso, o job tem um tempo limite de 10 minutos. Se o job exceder esse tempo, ele será automaticamente encerrado.

#SBATCH --partition=normal
# Especifica a partição (ou fila) onde o job será submetido. Aqui.

time python3 media_movel.py
#Executa o programa dentro do nó de computação.

Script SLURM para arquivos C++:

Como o C++ é uma linguagem que requer compilação, precisamos gerar o executável antes de preparar o arquivo .slurm.

Dentro da pasta SCRATCH, compile seu código .cpp para gerar o binário.

g++ media.cpp -o sem_otimizacao
g++ -O2 media.cpp -o otimizacao_O2
g++ -O3 media.cpp -o otimizacao_O3
g++ -Ofast media.cpp -o otimizacao_Ofast

media_cpp.slurm

#!/bin/bash
#SBATCH --job=OI_GALERA
# Define o nome do job. Esse nome aparece nas listas de jobs e é útil para identificar o job.

#SBATCH --output=media_cpp.out
# Especifica o arquivo onde a saída padrão (stdout) do job será salva.

#SBATCH --ntasks=1
# Define o número de tarefas que o job executará. Neste caso, o job executa uma única tarefa.

#SBATCH --time=00:10:00
# Define o tempo máximo de execução para o job. Neste caso, o job tem um tempo limite de 10 minutos. Se o job exceder esse tempo, ele será automaticamente encerrado.

#SBATCH --partition=normal
# Especifica a partição (ou fila) onde o job será submetido. Aqui, o job será submetido a fila "normal".


echo "========== SEM OTIMIZACAAAOOOO ========"
time ./sem_otimizacao

echo "========= OTIMIZACAO 02 ==============="
time ./otimizacao_O2

echo "======== OTIMIZACAO O3 ==============="
time ./otimizacao_O3

echo "=========== OFAST ESSA ==============="
time ./otimizacao_Ofast

# Executa os binários dentro do nó de computação.

Parte 2: Execução das Implementações no Cluster

Submissão dos Jobs:

Utilize o comando sbatch para submeter cada script SLURM ao cluster.

Exemplo:

sbatch media_py.slurm
sbatch media_cpp.slurm

Monitoramento dos Jobs:

Use o comando squeue para monitorar o status dos jobs.

Exemplo:

squeue 

Análise dos Resultados:

Após a execução dos jobs, os resultados estarão disponíveis nos arquivos .out especificados em cada script SLURM.

  • Compare os tempos de execução dos programas no cluster.

  • Troque a fila de submissão no arquivo .slurm e compare o desempenho dos programas novamente

  • Analise como as diferentes arquiteturas de hardware dentro do cluster impactam o desempenho do código, compare também com os seus resultados obtidos na atividade 1, executando na sua máquina local.

Tip

Se quiser explorar mais os comandos do SLURM, temos uma material aqui que pode te ajudar

Entrega Atividade 2 - Relatório de Desempenho:

  • Prepare um relatório detalhado, incluindo gráficos contendo o tempo de execução para cada implementação.

  • Discuta o impacto do ambiente HPC no desempenho das implementações, qual fila teve o melhor desempenho, porque?.

  • Submeta seu relatório até as 08h30 de segunda-feira 18/08, . pelo Classroom, link disponível no Blackboard.