Как я могу использовать bsub для рассмотрения двух наборов входных данных для моего кода - PullRequest
1 голос
/ 11 октября 2019

Я использую следующий сценарий оболочки для отправки заданий на сервер:

#!/bin/bash
#BSUB -J randJobName_ul0vm[1-3]%22
#BSUB -oo <pathToLog>/log/randJobName_ul0vm.o.%J.%I    
#BSUB -q "server.q"
#BSUB -n 2
#BSUB -R "span[hosts=1]"

JOB_ID=$LSB_JOBID
SGE_TASK_ID=$LSB_JOBINDEX
JOB_NAME=$LSB_JOBNAME
Id=$((SGE_TASK_ID-1))
declare -a Input
Input[0]="input1 input2"
Input[1]="input3 input4"
Input[2]="input5 input6"

python pythoncode.py parameter1 ${Input[${Id}]}

Итак, он дает следующие входные данные для pthoncode.py:

parameter1 input1 input2
parameter1 input3 input4
parameter1 input5 input6

Как я могуизменить его так, чтобы он также давал следующие входные данные?

parameter2 input1 input2
parameter2 input3 input4
parameter2 input5 input6

Обратите внимание, что параметр1 здесь заменен параметром2.

Я использовал следующий код, но он говорит, что индекс вне диапазона. Я не понимаю, почему:

#!/bin/bash
#BSUB -J randJobName_ul0vm[1-6]%22
#BSUB -oo <pathToLog>/log/randJobName_ul0vm.o.%J.%I    
#BSUB -q "server.q"
#BSUB -n 2
#BSUB -R "span[hosts=1]"

JOB_ID=$LSB_JOBID
SGE_TASK_ID=$LSB_JOBINDEX
JOB_NAME=$LSB_JOBNAME
Id=$((SGE_TASK_ID-1))
declare -a Input
Input[0]="input1 input2"
Input[1]="input3 input4"
Input[2]="input5 input6"

python pythoncode.py parameter1 ${Input[${Id}]}
python pythoncode.py parameter2 ${Input[${Id}]}

1 Ответ

0 голосов
/ 11 октября 2019

Это ваша проблема:

#BSUB -J randJobName_ul0vm[1-6]%22

В первом скрипте вы используете массив из 3 элементов, поэтому Id находится в диапазоне от 0 до 2, для которых вы определили Input. Во втором сценарии вы используете массив из 6 элементов, поэтому Id колеблется от 0 до 5, и три экземпляра массива, использующие Id=3,4,5, завершатся неудачно с указанной ошибкой, поскольку Input не определено для этих индексов.

Вам нужно изменить вышеприведенную строку на

#BSUB -J randJobName_ul0vm[1-3]%22

, и в этом случае у вас будет 3 элемента массива, каждый из которых будет работать pythoncode.py с parameter1 и parameter2последовательно. Если вы хотите, чтобы они выполнялись параллельно (то есть одна задача массива к одному выполнению pythoncode.py и, таким образом, массиву из 6 подзадач), вам нужно изменить ваш скрипт на что-то вроде этого:

#!/bin/bash
#BSUB -J randJobName_ul0vm[1-6]%22
#BSUB -oo <pathToLog>/log/randJobName_ul0vm.o.%J.%I    
#BSUB -q "server.q"
#BSUB -n 2
#BSUB -R "span[hosts=1]"

JOB_ID=$LSB_JOBID
SGE_TASK_ID=$LSB_JOBINDEX
JOB_NAME=$LSB_JOBNAME

#### Squirrel changes begin #####

INDEX=$((SGE_TASK_ID-1))     # this ranges over 0,1,2,3,4,5 over the 6 tasks
InputIdx=$(( INDEX / 2 ))    # this ranges over 0,0,1,1,2,2
ParameterIdx=$(( INDEX / 3)) # this ranges over 0,0,0,1,1,1

declare -a Input
Input[0]="input1 input2"
Input[1]="input3 input4"
Input[2]="input5 input6"

declare -a Parameter
Parameter[0]="parameter1"
Parameter[1]="parameter2"

python pythoncode.py ${Parameter[${ParameterIdx}]} ${Input[${InputIdx}]}
...