SDumont - FAQ de Utilização


  1. Shell do script de submissão

  2. Informações sobre acesso

  3. Transferencia de dados

  4. Erro de Alocação de memória - Jobs utilizando IntelMPI

  5. Executando múltiplas tarefas seriais em um único job


1. Shell do script de submissão (ksh)

Se for necessário utilizar o ksh como shell do script de submissão, é necessário incluir a linha abaixo no script de submissão antes de carregar os módulos:

. /opt/modules/default/Modules/init/ksh

Topo


2. Erro de segmentação - segmentation fault

Caso ocorra erro parecido com o descrito abaixo:

forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
APP.............. 0000000001409B95 Unknown Unknown Unknown
APP.............. 00000000014077B7 Unknown Unknown Unknown
APP.............. 00000000013B8E74 Unknown Unknown Unknown
APP.............. 00000000013B8C86 Unknown Unknown Unknown
APP.............. 0000000001357E76 Unknown Unknown Unknown
APP.............. 000000000135DF30 Unknown Unknown Unknown
....


Adicionar as linhas abaixo no script de submissão, antes de iniciar a execução da aplicação:

ulimit -c unlimited
ulimit -s unlimited

Topo


3. Transferencia de dados

O sistema de VPN não suporta grandes taxas de transmissão de dados, prejudicando a transferência.

Estamos projetando a implementação de um servidor dedicado para poder realizar o upload/download dos dados de forma mais prática e eficiente, porém ainda sem data para entrar em produção.

A solução adotada por enquanto é a de realizar a cópia dos dados a partir do nó de login do SDumont para algum host acessível através da Internet, utiliza comandos como o scp (enviar e receber dados) ou wget (receber dados). Dessa forma, a comunicação de saída não passa pela VPN, possibilitando alcançar melhores taxas de transferência.

Topo


4. Erro de Alocação de memória - Jobs utilizando IntelMPI

Caso ocorra erro parecido com o descrito abaixo:

DAPL ERR reg_mr Cannot allocate memory

Adicionar a linha abaixo no script de submissão, antes de iniciar a execução da aplicação:

export I_MPI_FABRICS=shm:ofa

Essa variável de ambiente configura a fabric a ser utilizada na comunicação dos processos MPI ao utilizar o Intel MPI. A primeira (shm) define a comunicação internamente no nó e a segunda (ofa) entre os nós.

Dessa forma a configuração para os requisitos de alocação de memória é realizada automaticamente.

Maiores informações: Selecting Fabrics | Intel® MPI Library for Linux

Topo


5. Executando múltiplas tarefas seriais em um único job

Há algumas formas de realizar essa tarefa. As mais simples estão listadas abaixo.

5.1. Executando N vezes o mesmo binário (serial), sem passar parâmetros

Essa é a forma mais simples. Se a aplicação não necessita utilizar parâmetros de entrada e é executada diretamente, é necessário apenas configurar o ambiente do SLURM corretamente.

O exemplo abaixo executará 48 vezes a mesma aplicação, sendo 24 em cada nó.

Script de submissão exemplo_1_simples.srm

#!/bin/bash
#SBATCH --nodes=2            #Numero de Nós
#SBATCH --ntasks-per-node=24 #Numero de tarefas por Nó
#SBATCH --ntasks=48          #Numero total de tarefas MPI
#SBATCH -p cpu_small         #Fila (partition) a ser utilizada
#SBATCH -J exemplo_1         #Nome job
#SBATCH --exclusive          #Utilização exclusiva dos nós durante a execução do job

#Exibe os nós alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST

cd $SLURM_SUBMIT_DIR

#Configura o executavel
EXEC=/scratch/app/NPB3.3.1-MZ/bin/cg.C.x

#exibe informações sobre o executável
/usr/bin/ldd $EXEC

srun --resv-ports  --nodes 1 --ntasks=24  $EXEC > $PWD/log1.txt &
srun --resv-ports  --nodes 1 --ntasks=24  $EXEC > $PWD/log2.txt &
wait

Quando o “srun” é executado utilizando um binário serial, ele disparará a execução do número de vezes que foi definido pelo “--ntasks”.

No exemplo acima, executará 24 vezes o benchmark cg do NPB em cada um dos nós nós.


5.2. Executando N vezes o mesmo binário (serial) através de um script, sem passar parâmetros

No exemplo anterior o job colocará a saída das execuções em um arquivo para cada execução do srun, agregando assim a saída de 24 execuções em um único arquivo de log, o que pode ficar confuso.

Uma forma de contornar isso é utilizar um script intermediário.

No exemplo abaixo, a linha do srun executará um script, que por sua vez executará as 24 instâncias da aplicação, direcionando a saída para arquivos diferentes.

Script de submissão exemplo_2_simples_com_script.srm

#!/bin/bash
#SBATCH --nodes=2            #Numero de Nós
#SBATCH --ntasks-per-node=24 #Numero de tarefas por Nó
#SBATCH --ntasks=48          #Numero total de tarefas MPI
#SBATCH -p cpu_small         #Fila (partition) a ser utilizada
#SBATCH -J exemplo_2         #Nome job
#SBATCH --exclusive          #Utilização exclusiva dos nós durante a execução do job

#Exibe os nós alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST

cd $SLURM_SUBMIT_DIR

#Configura o script intermediario
SCRIPT=${PWD}/script_intermediario_2.sh

srun --resv-ports  --nodes 1 --ntasks=1  $SCRIPT log_run_node1 &
srun --resv-ports  --nodes 1 --ntasks=1  $SCRIPT log_run_node2 &
wait


script_intermediario_2.sh - *DEVE SER EXECUTÁVEL

#!/bin/bash

#Configura o executavel
EXEC=/scratch/app/NPB3.3.1-MZ/bin/cg.C.x

#Configura a variavel do log - passada por parametro pela execucao do srun
RUN_LOG=${1}

#Exibe informações sobre o executável
/usr/bin/ldd $EXEC

#Inicia as execucoes
$EXEC > ${PWD}/${RUN_LOG}_1_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_2_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_3_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_4_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_5_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_6_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_7_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_8_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_9_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_10_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_11_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_12_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_13_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_14_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_15_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_16_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_17_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_18_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_19_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_20_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_21_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_22_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_23_log.txt &
$EXEC > ${PWD}/${RUN_LOG}_24_log.txt &
wait

5.3. Executando N vezes o mesmo binário (serial) através de um script, passando parâmetros

A utilização de parâmetros por parte do executável vai depender de cada caso. Se ele lê um arquivo de entrada, é possível criar um arquivo para cada execução independente.

Script de submissão exemplo_3_com_parametros_em_arquivo.srm

#!/bin/bash
#SBATCH --nodes=2            #Numero de Nós
#SBATCH --ntasks-per-node=24 #Numero de tarefas por Nó
#SBATCH --ntasks=48          #Numero total de tarefas MPI
#SBATCH -p cpu_small         #Fila (partition) a ser utilizada
#SBATCH -J exemplo_3         #Nome job
#SBATCH --exclusive          #Utilização exclusiva dos nós durante a execução do job

#Exibe os nós alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST

cd $SLURM_SUBMIT_DIR

#Configura o script intermediario
SCRIPT=${PWD}/script_intermediario_3.sh

srun --resv-ports  --nodes 1 --ntasks=1  $SCRIPT run_node1 &
srun --resv-ports  --nodes 1 --ntasks=1  $SCRIPT run_node2 &
wait


script_intermediario_3.sh - *DEVE SER EXECUTÁVEL

#!/bin/bash

#Configura o executavel
EXEC=/scratch/app/NPB3.3.1-MZ/bin/cg.C.x

#Configura a variavel da execucao - passada por parametro pela execucao do srun
RUN=${1}

#Exibe informações sobre o executável
/usr/bin/ldd $EXEC

#Inicia as execucoes
$EXEC -f ${PWD}/${RUN}_1_entrada > ${PWD}/${RUN}_1_log.txt &
$EXEC -f ${PWD}/${RUN}_2_entrada > ${PWD}/${RUN}_2_log.txt &
$EXEC -f ${PWD}/${RUN}_3_entrada > ${PWD}/${RUN}_3_log.txt &
$EXEC -f ${PWD}/${RUN}_4_entrada > ${PWD}/${RUN}_4_log.txt &
$EXEC -f ${PWD}/${RUN}_5_entrada > ${PWD}/${RUN}_5_log.txt &
$EXEC -f ${PWD}/${RUN}_6_entrada > ${PWD}/${RUN}_6_log.txt &
$EXEC -f ${PWD}/${RUN}_7_entrada > ${PWD}/${RUN}_7_log.txt &
$EXEC -f ${PWD}/${RUN}_8_entrada > ${PWD}/${RUN}_8_log.txt &
$EXEC -f ${PWD}/${RUN}_9_entrada > ${PWD}/${RUN}_9_log.txt &
$EXEC -f ${PWD}/${RUN}_10_entrada > ${PWD}/${RUN}_10_log.txt &
$EXEC -f ${PWD}/${RUN}_11_entrada > ${PWD}/${RUN}_10_log.txt &
$EXEC -f ${PWD}/${RUN}_12_entrada > ${PWD}/${RUN}_11_log.txt &
$EXEC -f ${PWD}/${RUN}_13_entrada > ${PWD}/${RUN}_12_log.txt &
$EXEC -f ${PWD}/${RUN}_14_entrada > ${PWD}/${RUN}_13_log.txt &
$EXEC -f ${PWD}/${RUN}_15_entrada > ${PWD}/${RUN}_14_log.txt &
$EXEC -f ${PWD}/${RUN}_16_entrada > ${PWD}/${RUN}_15_log.txt &
$EXEC -f ${PWD}/${RUN}_17_entrada > ${PWD}/${RUN}_16_log.txt &
$EXEC -f ${PWD}/${RUN}_18_entrada > ${PWD}/${RUN}_17_log.txt &
$EXEC -f ${PWD}/${RUN}_19_entrada > ${PWD}/${RUN}_18_log.txt &
$EXEC -f ${PWD}/${RUN}_20_entrada > ${PWD}/${RUN}_19_log.txt &
$EXEC -f ${PWD}/${RUN}_21_entrada > ${PWD}/${RUN}_20_log.txt &
$EXEC -f ${PWD}/${RUN}_22_entrada > ${PWD}/${RUN}_21_log.txt &
$EXEC -f ${PWD}/${RUN}_23_entrada > ${PWD}/${RUN}_22_log.txt &
$EXEC -f ${PWD}/${RUN}_24_entrada > ${PWD}/${RUN}_23_log.txt &

wait


* Importante observar que nesse caso é necessário gerar previamente um arquivo de entrada diferente para cada execução.


5.3.1. Passando parâmetros diretamente

É possível também passar diferentes parâmetros diretamente para o script.

Script de submissão exemplo_3.1_com_parametros_direto.srm

#!/bin/bash
#SBATCH --nodes=2            #Numero de Nós
#SBATCH --ntasks-per-node=24 #Numero de tarefas por Nó
#SBATCH --ntasks=48          #Numero total de tarefas MPI
#SBATCH -p cpu_small         #Fila (partition) a ser utilizada
#SBATCH -J exemplo_3.1       #Nome job
#SBATCH --exclusive          #Utilização exclusiva dos nós durante a execução do job

#Exibe os nós alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST

cd $SLURM_SUBMIT_DIR

#Configura o script intermediario
SCRIPT=${PWD}/script_intermediario_3.1.sh

srun --resv-ports  --nodes 1 --ntasks=1  $SCRIPT parametro_1 parametro_2 parametro_3 parametro_4 parametro_5 parametro_6 parametro_7 parametro_8 parametro_9 parametro_10 parametro_11parametro_12 parametro_13 parametro_14 parametro_15 parametro_16 parametro_17 parametro_18 parametro_19 parametro_20 parametro_21 parametro_22 parametro_23 parametro_24 &
srun --resv-ports  --nodes 1 --ntasks=1  $SCRIPT parametro_25 parametro_26 parametro_27 parametro_28 parametro_29 parametro_30 parametro_31 parametro_32 parametro_33 parametro_34 parametro_35 parametro_36 parametro_37 parametro_38 parametro_39 parametro_40 parametro_41 parametro_42 parametro_43 parametro_44 parametro_45 parametro_46 parametro_47 parametro_48 &
wait


script_intermediario_3.1.sh - *DEVE SER EXECUTÁVEL

#!/bin/bash

#Configura o executavel
EXEC=/scratch/app/NPB3.3.1-MZ/bin/cg.C.x

#Exibe informações sobre o executável
/usr/bin/ldd $EXEC

#Inicia as execucoes
$EXEC ${1} &
$EXEC ${2} &
$EXEC ${3} &
$EXEC ${4} &
$EXEC ${5} &
$EXEC ${6} &
$EXEC ${7} &
$EXEC ${8} &
$EXEC ${9} &
$EXEC ${10} &
$EXEC ${11} &
$EXEC ${12} &
$EXEC ${13} &
$EXEC ${14} &
$EXEC ${15} &
$EXEC ${16} &
$EXEC ${17} &
$EXEC ${18} &
$EXEC ${19} &
$EXEC ${20} &
$EXEC ${21} &
$EXEC ${22} &
$EXEC ${23} &
$EXEC ${24} &

wait


* Nesse caso, a linha do srun passará 24 parâmetros diferentes para o script intermediário.
* O script intermediário pega os 24 diferentes parâmetros de entrada e os distribui para as 24 execuções.


5.4. Executando N vezes o mesmo binário (serial) através de um script completo

Uma outra forma seria criar diferentes scripts intermediários completos, cada um contando todos os parâmetros necessários, sem a necessidade de passar valores do script de submissão.

Script de submissão exemplo_4_com_scripts_completos.srm

#!/bin/bash
#SBATCH --nodes=2            #Numero de Nós
#SBATCH --ntasks-per-node=24 #Numero de tarefas por Nó
#SBATCH --ntasks=48          #Numero total de tarefas MPI
#SBATCH -p cpu_small         #Fila (partition) a ser utilizada
#SBATCH -J exemplo_4         #Nome job
#SBATCH --exclusive          #Utilização exclusiva dos nós durante a execução do job

#Exibe os nós alocados para o Job
echo $SLURM_JOB_NODELIST
nodeset -e $SLURM_JOB_NODELIST

cd $SLURM_SUBMIT_DIR

srun --resv-ports  --nodes 1 --ntasks=1  ${PWD}/script_intermediario_4_completo.1.sh  &
srun --resv-ports  --nodes 1 --ntasks=1  ${PWD}/script_intermediario_4_completo.2.sh  &
wait


script_intermediario_4_completo.1.sh - *DEVE SER EXECUTÁVEL

#!/bin/bash

#Configura o executavel
EXEC=/scratch/app/NPB3.3.1-MZ/bin/cg.C.x

#Exibe informações sobre o executável
/usr/bin/ldd $EXEC

#Inicia as execucoes
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
$EXEC parametro_1 parametro_2 .... parametro_N &
wait


script_intermediario_4_completo.2.sh - *DEVE SER EXECUTÁVEL

#!/bin/bash

#Configura o executavel
EXEC=/scratch/app/NPB3.3.1-MZ/bin/cg.C.x

#Exibe informações sobre o executável
/usr/bin/ldd $EXEC

#Inicia as execucoes
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &
$EXEC parametro_A parametro_B .... parametro_XZY &

wait


* Nesse caso é necessário um script específico para cada linha do srun.
* Esse script intermediário deverá conter todos os parâmetros necessários para a execução da aplicação, representados por “parametro_X.Y


Topo