Executar um comando no SLURM que usa argumentos de linha de comando
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
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'"