.. _melhorando_o_script_de_submissao: ================================ Melhorando o Script de Submissão ================================ .. contents:: Nesta seção: :local: :depth: 2 Esta seção detalha a construção de scripts de submissão robustos e eficientes, incorporando as melhores práticas e todos os recursos disponíveis no GridUnesp. Opções do SBATCH ================ O SLURM oferece dezenas de diretivas para controlar a execução dos jobs. Abaixo as mais importantes: .. list-table:: Principais diretivas SBATCH :header-rows: 1 :widths: 25 15 60 * - Diretiva - Abrev. - Descrição * - ``--time`` - ``-t`` - Tempo máximo de execução (formato: ``min``, ``min:seg``, ``horas:min:seg``, ``dias-horas``, ``dias-horas:min:seg``) * - ``--cpus-per-task`` - ``-c`` - Número de CPUs por processo (para threads/OpenMP) * - ``--ntasks`` - ``-n`` - Número total de processos (para MPI) * - ``--nodes`` - ``-N`` - Número mínimo de nós * - ``--mem`` - - Memória por nó (ex: ``16G``, ``32768M``) * - ``--mem-per-cpu`` - - Memória por CPU (ex: ``4G``) * - ``--output`` - ``-o`` - Arquivo para saída padrão (stdout) * - ``--error`` - ``-e`` - Arquivo para saída de erros (stderr) * - ``--job-name`` - ``-J`` - Nome do job (aparece no ``squeue``) * - ``--partition`` - ``-p`` - Partição (``short``, ``medium``, ``long``, ``gpu``) * - ``--gres`` - - Recursos genéricos, como GPUs (``--gres=gpu:1``) * - ``--mail-type`` - - Quando enviar e-mail (``BEGIN``, ``END``, ``FAIL``, ``ALL``) * - ``--mail-user`` - - Endereço de e-mail para notificações **Exemplos:** .. code-block:: bash #SBATCH -t 24:00:00 -c 4 #SBATCH --mem=16G #SBATCH --output=job_%j.out #SBATCH --mail-type=END,FAIL #SBATCH --mail-user=joao@unesp.br .. tip:: Use ``%j`` no nome do arquivo para incluir o Job ID automaticamente. .. _script_job_nanny: Script job-nanny ================ O **job-nanny** é um script essencial do GridUnesp que gerencia a transferência de dados entre o ``/home/`` e as áreas de trabalho temporárias. Por que usar job-nanny? ------------------------ 1. **Evita sobrecarga no /home/** - Acesso direto ao /home/ durante a execução degrada o desempenho 2. **Otimiza performance** - Usa discos locais (``/tmp/`` ou ``/store/``) que são muito mais rápidos 3. **Garante persistência** - Copia resultados de volta ao final 4. **Checkpoints automáticos** - Salva progresso periodicamente .. warning:: O script ``job-nanny`` é reconhecido ao carregar o módulo **gridunesp**. Quando o usuário faz login no cluster, esse módulo é carregado automaticamente. Caso tenha usado o comando ``module purge``, é preciso fazer .. code-block:: bash module load gridunesp para que o ``job-nanny`` esteja disponível. Variáveis Obrigatórias ---------------------- O job-nanny **exige** a definição de duas variáveis: .. code-block:: bash export INPUT="arquivo1.dat arquivo2.dat diretorio_entrada/" export OUTPUT="resultado.dat saida/" - **INPUT:** Arquivos/diretórios que serão copiados para a área de trabalho temporária - **OUTPUT:** Arquivos/diretórios que serão copiados de volta ao ``/home/`` ao final Variáveis Opcionais ------------------- .. list-table:: Variáveis do job-nanny :header-rows: 1 :widths: 25 25 50 * - Variável - Padrão - Descrição * - ``CHECKPOINT`` - ``$OUTPUT`` - Local para salvar checkpoints * - ``WAIT_CHECKPOINT`` - 10800 (3h) - Intervalo entre checkpoints (segundos) * - ``VERBOSE`` - 0 - Ativa modo verboso (1) para debug * - ``SHARED_FS`` - "false" - Se "false", usa ``/tmp/``; se "true", força uso do ``/store/`` * - ``LARGE_FILES`` - "false" - Se "true", força uso do ``/store/`` (para arquivos grandes) Exemplos de Uso do job-nanny ---------------------------- **Exemplo 1: Job serial simples** .. code-block:: bash :caption: job_simples.sh #!/bin/bash #SBATCH -J teste #SBATCH -n 1 #SBATCH -t 01:00:00 export INPUT="entrada.dat" export OUTPUT="resultado.dat" module load python/3.9 job-nanny python script.py entrada.dat > resultado.dat **Exemplo 2: Job com múltiplos arquivos** .. code-block:: bash :caption: job_multiplo.sh #!/bin/bash #SBATCH -J simulacao #SBATCH -c 4 #SBATCH -t 24:00:00 export INPUT="parametros.in dados/ biblioteca.so" export OUTPUT="saida.dat logs/" module load gcc/10.2.0 job-nanny ./programa -i parametros.in -o saida.dat **Exemplo 3: Job com arquivos grandes** .. code-block:: bash :caption: job_grande.sh #!/bin/bash #SBATCH -J big_data #SBATCH -n 1 #SBATCH -t 12:00:00 export INPUT="dataset_grande.bin" export OUTPUT="resultados/" export LARGE_FILES="true" # Força uso do /store/ job-nanny ./processador dataset_grande.bin **Exemplo 4: Job com checkpoints frequentes** .. code-block:: bash :caption: job_longo.sh #!/bin/bash #SBATCH -J long_job #SBATCH -n 8 #SBATCH -t 20-00:00:00 # 20 dias export INPUT="entrada.dat" export OUTPUT="resultado_final.dat" export CHECKPOINT="checkpoints/" export WAIT_CHECKPOINT=3600 # Checkpoint a cada 1 hora module load meu_software job-nanny simular --restart checkpoints/ .. _parametros_do_job_nanny: Escolha Entre /tmp/ e /store/ ============================= O job-nanny decide automaticamente onde executar: **Usa /tmp/ (rápido, local) quando:** - Job usa **apenas 1 nó** (``-N 1``) - ``SHARED_FS`` não está definido ou é ``"false"`` - ``LARGE_FILES`` não está definido ou é ``"false"`` **Usa /store/ (compartilhado) quando:** - Job usa **múltiplos nós** (``-N > 1``) - ``SHARED_FS="true"`` - ``LARGE_FILES="true"`` .. tip:: Para jobs de 1 nó com arquivos muito grandes (>100 GB), use ``LARGE_FILES="true"`` para forçar o uso do ``/store/``, que tem mais espaço disponível do que o ``/tmp/`` do nó de processamento. .. _sistema_de_filas_detalhado: Sistema de Filas (Detalhado) ============================ O tempo especificado determina automaticamente a partição: .. list-table:: Relação tempo x partição :header-rows: 1 :widths: 35 20 45 * - Tempo solicitado - Partição - Prazo máximo de processamento * - Até 24 horas - short - 24 horas * - Até 24 horas (especificando ``-p gpu``) - gpu - 24 horas (executado no servidor de GPU) * - Entre 24h e 7 dias - medium - 7 dias * - Entre 7 e 30 dias - long - 30 dias * - Acima de 30 dias - (inválido) - Job não será aceito .. important:: Sempre especifique o tempo mais preciso possível. Jobs com tempo menor: - Têm **prioridade maior** na fila - Podem "encaixar" em janelas de recursos ociosos - Aumentam a eficiência do cluster para todos Exemplos de Configuração de Tempo: .. code-block:: bash # 30 minutos #SBATCH -t 30:00 # 12 horas e 30 minutos #SBATCH -t 12:30:00 # 2 dias e 6 horas #SBATCH -t 2-06:00:00 # 30 dias (máximo permitido) #SBATCH -t 30-00:00:00 .. _informacao_sobre_o_storage: Informações sobre o Storage (Detalhado) ======================================= O GridUnesp possui três áreas principais de armazenamento, cada uma com características específicas: .. list-table:: Comparação das partições :header-rows: 1 :widths: 15 20 20 25 20 * - Partição - Capacidade - Velocidade - Persistência - Uso recomendado * - ``/home/`` - 120 TB - Média - Permanente - Scripts, código, dados pequenos * - ``/tmp/`` - ~180 GB/nó - Muito rápida - Temporária (apenas durante o job) - I/O intensivo, arquivos temporários * - ``/store/`` - 7 TB - Média-baixa - Temporária - Arquivos grandes, dados compartilhados .. _particao_tmp_basico: Partição /tmp/ -------------- O ``/tmp/`` é um diretório local em cada nó de processamento. Suas principais características: - **Velocidade:** Altíssima (disco local SSD/HD) - **Espaço:** Limitado (~180 GB por nó) - **Escopo:** Visível apenas no nó onde o job está executando - **Persistência:** **TEMPORÁRIA** - arquivos são removidos ao final do job .. raw:: html **Quando usar /tmp/:** - Jobs que fazem muita leitura/escrita em disco - Dados temporários que podem ser recriados - Processamento que cabe no espaço disponível - Jobs de **um único nó** (padrão) **Exemplo de uso explícito do /tmp/ (já é o padrão):** .. code-block:: bash #!/bin/bash #SBATCH -J tmp_job #SBATCH -N 1 #SBATCH -n 28 #SBATCH -t 24:00:00 export INPUT="dados_entrada/" export OUTPUT="resultados/" # job-nanny usará /tmp/ automaticamente (1 nó, sem flags) job-nanny ./programa .. _particao_store_basico: Partição /store/ ---------------- O ``/store/`` é um sistema de arquivos compartilhado entre todos os nós: - **Velocidade:** Média - **Espaço:** Grande (7 TB) - **Escopo:** Visível em todos os nós - **Persistência:** **TEMPORÁRIA** (dados apagados após o término do job) .. raw:: html **Quando usar /store/:** - Jobs com **múltiplos nós** (MPI) - Arquivos de entrada/saída muito grandes (>100 GB) - Dados que precisam ser acessados por vários nós simultaneamente **Exemplo de job multi-nó (usa /store/ automaticamente):** .. code-block:: bash #!/bin/bash #SBATCH -J mpi_job #SBATCH -N 4 #SBATCH -n 112 #SBATCH -t 72:00:00 export INPUT="dados_grandes/" export OUTPUT="resultados_mpi/" module load openmpi/4.1.5 job-nanny mpirun -n 112 ./programa_mpi **Exemplo forçando uso do /store/ em job de 1 nó:** .. code-block:: bash #!/bin/bash #SBATCH -J big_job #SBATCH -N 1 #SBATCH -n 28 #SBATCH -t 48:00:00 export INPUT="dataset_500GB/" export OUTPUT="resultados/" export LARGE_FILES="true" # Força uso do /store/ job-nanny ./processador Considerações Importantes ========================= 1. **Nunca** processe jobs diretamente no servidor access 2. **Sempre** defina INPUT e OUTPUT ao usar job-nanny 3. **Estime** corretamente o tempo necessário (jobs mais curtos têm prioridade) 4. **Monitore** seus jobs com ``squeue`` e ``scontrol`` 5. **Limpe** arquivos temporários após a conclusão .. seealso:: - :ref:`processando_simulacoes` - Conceitos básicos - :ref:`monitorando_simulacoes` - Monitoramento avançado - :ref:`guia_armazenamento` - Guia completo de storage - :ref:`boas_praticas` - Recomendações gerais