Executar um comando no SLURM que usa argumentos de linha de comando

Oct 28 2020

Eu sou completamente novo no uso de HPCs e SLURM, então eu realmente gostaria de receber alguma orientação aqui.

Eu preciso executar iterativamente um comando parecido com este

kallisto quant -i '/home/myName/genomes/hSapien.idx' \
               -o "output-SRR3225412"                 \
                         "SRR3225412_1.fastq.gz"       \
                         "SRR3225412_2.fastq.gz"

onde a SRR3225412parte será diferente em cada interação

O problema é que, como descobri, não posso simplesmente anexar isso ao final de um sbatchcomando

sbatch --nodes=1          \
       --ntasks-per-node=1 \
       --cpus-per-task=1    \
         kallisto quant -i '/home/myName/genomes/hSapien.idx' \
                        -o "output-SRR3225412"                 \
                                  "SRR3225412_1.fastq.gz"       \
                                  "SRR3225412_2.fastq.gz"

Este comando não funciona. Eu entendi o erro

sbatch: error: This does not look like a batch script.  The first
sbatch: error: line must start with #! followed by the path to an interpreter.
sbatch: error: For instance: #!/bin/sh

Eu queria perguntar como executo o sbatchcomando, especificando seus parâmetros de execução e também adicionando os argumentos de linha de comando para o kallistoprograma que estou tentando usar? No final, gostaria de ter algo como

#!/bin/bash

for sample in ...
do
    sbatch --nodes=1          \
           --ntasks-per-node=1 \
           --cpus-per-task=1    \
             kallistoCommandOnSample --arg1 a1 \
                                     --arg2 a2 arg3 a3
done

Respostas

2 damienfrancois Oct 30 2020 at 14:40

O erro sbatch: error: This does not look like a batch script.é porque sbatchespera um script de envio . É um script em lote, normalmente um script Bash, no qual os comentários que começam com #SBATCHsão interpretados por Slurm como opções.

Portanto, a maneira típica de enviar um trabalho é criar um arquivo, vamos chamá-lo submit.sh:

#! /bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1

kallisto quant -i '/home/myName/genomes/hSapien.idx' \
               -o "output-SRR3225412"                 \
                         "SRR3225412_1.fastq.gz"       \
                         "SRR3225412_2.fastq.gz"

e, em seguida, envie-o com

sbatch submit.sh

Se você tiver vários trabalhos semelhantes para enviar, é benéfico por vários motivos usar uma matriz de trabalho . O loop que você deseja criar pode ser substituído por um único script de envio parecido com

#! /bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --array=1-10 # Replace here with the number of iterations in the loop

SAMPLES=(...) # here put what you would loop over
CURRSAMPLE=${SAMPLE[$SLURM_ARRAY_TASK_ID]}
kallisto quant -i '/home/myName/genomes/hSapien.idx' \
               -o "output-${CURRSAMPLE}" \ "${CURRSAMPLE}_1.fastq.gz"    \
                         "${CURRSAMPLE}_2.fastq.gz"

Como apontado por @Carles Fenoy, se você não quiser usar um script de envio, pode usar o --wrapparâmetro de sbatch:

sbatch --nodes=1          \
       --ntasks-per-node=1 \
       --cpus-per-task=1    \
       --wrap "kallisto quant -i '/home/myName/genomes/hSapien.idx' \
                              -o 'output-SRR3225412'                 \
                                        'SRR3225412_1.fastq.gz'       \
                                        'SRR3225412_2.fastq.gz'"