在IBM负载共享设施(LSF)中训练神经网络

时间:2018-07-20 11:18:08

标签: python neural-network lsf

我被授予使用某些高性能计算系统的权限,可以进行一些有关机器学习的实验。

此系统已安装IBM的LSF 10.1。 指示我运行bsub命令将新的ML任务提交到队列。

我将Python + Keras + Tensorflow用于我的任务。

我的典型工作流程如下。我在python脚本train.py中定义了NN体系结构和训练参数,将其提交到git repo,然后运行它。 然后,我在train.py中进行一些更改,提交并再次运行。

我开发了以下bsub脚本

#!/bin/bash
# 
#BSUB -P "project"
#BSUB -q queue
#BSUB -n 1
#BSUB -o %J.log
#BSUB -e %J.err
#BSUB -cwd "/home/user/my_project/nntrain"

module load cuda9.0 cudnn_v7 nccl_2.1.15
source /home/user/my_python/bin/activate
export PYTHONPATH=/home/user/my_project/lib

python train.py 2>&1 | tee ${LSB_JOBID}_out.log 

现在是问题。

我已经定义了一个网络,然后运行了bsub < batch_submit。 将该作业放入队列中,并为其分配一些标识符,例如12345678。

当它没有运行时,等待下一个空闲节点,我对train.py进行了一些更改,以创建一个新的变体并以类似的方式再次提交它:bsub < batch_submit

让新作业ID为12345692。作业12345678仍在等待中。

现在我有两个工作,正在等待他们的节点。

那脚本train.py呢?

这两个都一样吗?

1 个答案:

答案 0 :(得分:2)

是的,它将。提交作业时,bsub仅查看从#BSUB开始的前几行,以确定您的作业需要哪些资源以及在哪个节点上运行最佳。

脚本的所有其他部分(不是以#BSUB开头)只有在脚本停止pending并开始running时才被解释。在特定的一行中,bash将遇到命令python train.py,加载当前版本的train.py,然后执行它。

也就是说,bsub不会以任何方式“冻结”环境;作业开始运行时,它将运行最新版本的train.py。如果您提交的两个作业都引用相同的.py文件,则它们都将运行相同的python脚本(最新版本)。

如果您想知道如何使用上千种不同的设置运行上千个作业,这是我通常要做的:

  1. 确保您的.py脚本可以接受带有配置参数的命令行参数,或者可以从某个文件获取配置;不要依靠手动修改脚本来更改某些设置。
  2. 创建一个bsub-template文件,该文件看起来类似于上面的bash脚本,但是至少保留一个可以指定实验参数的元变量。 “元变量”是指不与bash脚本中的其他任何内容冲突的唯一字符串,例如NAME_OF_THE_DATASET

    #!/bin/bash
    # 
    #BSUB -P "project"
    #BSUB -q queue
    #BSUB -n 1
    #BSUB -o %J.log
    #BSUB -e %J.err
    #BSUB -cwd "/home/user/project/nntrain"
    
    module load cuda9.0 cudnn_v7 nccl_2.1.15
    source /home/user/my_python/bin/activate
    export PYTHONPATH=/home/user/my_project/lib
    
    python train.py NAME_OF_THE_DATASET 2>&1 | tee ${LSB_JOBID}_out.log 
    
  3. 使用循环创建单独的bash脚本,该循环插入不同的元变量值(例如,使用{使用NAME_OF_THE_DATASET,...,myDataset1.csv替换myDatasetN.csv {1}}),然后通过sed提交修改后的模板。

这可能不是最简单的解决方案(可能可以使用bsub本身的设施来使用更简单的编号方案),但是我发现它非常灵活,因为它与多个meta-变量以及各种标记和设置,还可以让您将不同的预处理脚本插入bsub模板中。