Este projeto consiste em um conjunto automatizado de ferramentas Python e arquivos batch do slurm para a submissão de jobs, coleta de dados estatísticos, remoção de outliers, cálculos de métricas de desempenho e geração de relatórios visuais para ambientes de Computação de Alto Desempenho (HPC).
O fluxo principal foi projetado para rodar em clusters gerenciados via SLURM ou de forma Local, a forma local ainda está em testes, suportando execuções baseadas em MPI, OpenMP e OpenMP Offload (GPU), este ainda em testes.
Esta ferramenta foi usada para a execução e análise dos programas listados no repositório do livro Programacao Paralela e Distribuida.
O sistema é dividido em 4 scripts principais:
job_exec.py: Responsável por orquestrar a execução. Prepara um diretório no SCRATCH, copia dependências, repassa os parâmetros para o SLURM ou terminal local e invoca os scripts secundários quando as amostras são finalizadas.parse_data.py: Efetua o parsing e a limpeza dos resultados coletados. Remove anomalias estatísticas, ou seja atrasos sistêmicos, e calcula o Speedup, Eficiência, GFLOP/s, Intervalos de Confiança, além de processar dados de hardware advindos doperf.graficos.py: Usa a bibliotecamatplotlibpara gerar automaticamente gráficos que indicam as métricas escalares em função do número de threads/processos (como Tempo Médio, Speedup, Eficiência, GFLOP/s e métricas de cache/hardware).enviar_email.py: Agrupa os resultados (csv e gráficos em.png) e os envia por e-mail usando SMTP.
- Linguagem: Python 3.x
- Dependências:
numpy,scipy,matplotlib,listadas no requirements.txt - Ambiente de E-mail: O envio de e-mails exige que você exporte as credenciais no seu ambiente de terminal antes de executar o script:
export email="seu_email@gmail.com" export passwd="sua_senha_de_app" # utiliza senha de aplicativos do google, necessário configurar à parte
git clone https://github.com/0tuler/OESA.git
pip -r OESA/requirements.txt
mv OESA/* ./
rm -rf OESA
Talvez seja necessário configurar um ambiente conda, no testes executados no ambiente slurm do Supercomputador Santos Dumont do LNCC houve a necessidade de utilizar o ambiente conda.
O script job_exec.py é o ponto de entrada da ferramenta. Ele deve ser executado passando opções via linha de comando. Abaixo estão detalhadas todas as opções suportadas:
| Opção | Comando Longo | Descrição |
|---|---|---|
-n |
--name |
Nome da bateria de testes/projeto. Usado para criar arquivos de saída e diretórios. |
-p |
--path |
Caminho do arquivo executável que será avaliado. |
--header |
Define as colunas iniciais do arquivo CSV (ex: "N,Tempo,Métricas..."). |
|
--sequana |
Define uma configuração específica para o ambiente sequana do job. |
| Opção | Comando Longo | Descrição | Padrão |
|---|---|---|---|
-a |
--amostras |
Número total de execuções/amostras a serem coletadas. | 10 |
--passo |
Quantidade de repetições efetuadas a cada submissão (divide a amostragem em blocos menores). | 5 |
|
--tipo |
Onde os jobs vão executar: slurm (fila no cluster) ou local (máquina local). |
slurm |
|
--modo |
Define a API paralela. Suporta mpi, openmp ou openoff (para GPUs). |
openmp |
|
--nprocs |
Número de Processos/Threads a testar, passados entre aspas duplas e separados por espaço. | "1 2 4 8 16 24 32 48" |
|
--args |
Argumentos textuais que devem ser repassados diretamente ao binário em teste. | "" |
|
--preload |
Bibliotecas ou strings de pré-carregamento (ex: LD_PRELOAD=...) para o run. (WIP) |
"" |
| Opção | Comando Longo | Descrição |
|---|---|---|
--mem |
Quantidade de memória solicitada no SLURM (ex: 16G). |
|
--time |
Especifica o tempo máximo para o job, valor padrão 0-00:20:00 (dias-horas:minutos:segundos). |
|
--exclusive |
Ativa a execução exclusiva, no nodo sequana selecionado, atenção pois gasta mais recursos. | |
--batch_script |
Nome/Caminho de um script .sh customizado que sobrepõe o gerado automaticamente. |
|
--gpus |
(Obrigatório se --modo=openoff) Número de GPUs solicitadas. (WIP) |
|
--teams |
(Obrigatório se --modo=openoff) Configura o número de times na diretiva Offload. (WIP) |
|
--omp_procbind |
Define como as threads OpenMP devem estar ligadas no SO. (Padrão: close) |
|
--omp_places |
Determina em quais estruturas alocar (Padrão: cores). |
| Opção | Comando Longo | Descrição |
|---|---|---|
--extra_files |
Lista de arquivos (separados por espaço) que devem ser copiados junto com o executável para o diretório temporário (SCRATCH). | |
--info |
Texto adicional que será acrescentado ao final do assunto no e-mail de notificação. | |
--just_email |
Flag: Pula a geração de gráficos e filtragem de amostras, apenas enviando os dados puros extraídos para o e-mail cadastrado. |
Um exemplo de coleta de desempenho de um programa OpenMP no slurm, com 10 amostras, passando um arquivo extra (entrada.txt) usando de 1 até 16 threads:
# Setar variáveis
export email="eu@meuemail.com"
export passwd="senha"
# Executar
python job_exec.py \
-n teste_openmp\
-p ./matriz_mult\
--header "N,Tempo" \
--sequana sequana_cpu_dev \
-a 10\
--passo 5\
--tipo slurm\
--modo openmp \
--nprocs "1 2 4 8 16"\
--extra_files entrada.txt
Toda essa execução pode ser mantida em um arquivo sh, um exemplo prático pode ser encontrado em run.sh.