【问题标题】:How can I use bsub to consider two sets of inputs for my code如何使用 bsub 为我的代码考虑两组输入
【发布时间】:2019-10-11 00:36:13
【问题描述】:

我使用以下 shell 脚本将作业发送到服务器:

#!/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

注意这里的parameter1被parameter2替换了。

我使用了以下代码,但它显示索引超出范围。我不明白为什么:

#!/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}]}

【问题讨论】:

  • 每次您将要使用它时打印${Input[${Id}]},以确保您的索引有效并且值符合您的预期。对于您的“索引超出范围”,哪一行返回?我们应该假设它是最后一个吗?

标签: linux bash shell unix lsf


【解决方案1】:

这是你的问题:

#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.pyparameter1parameter2。如果您希望这些并行执行(即一个数组任务到一个 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}]}

【讨论】:

  • 这是错误的。它只使用参数[0]。我们该如何解决这个问题?
  • 让我澄清一下。它使用参数[0] Input[0] 6 次。我们该如何解决这个问题?
【解决方案2】:

根据这个randJobName,你为什么不直接使用RANDOM?

parameter="parameter$((1+RANDOM%2))"

在输入中

input=${Input[$((RANDOM%2))]} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2021-06-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多