我被授予使用某些高性能计算系统的权限,可以进行一些有关机器学习的实验。
此系统已安装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呢?
这两个都一样吗?
答案 0 :(得分:2)
是的,它将。提交作业时,bsub
仅查看从#BSUB
开始的前几行,以确定您的作业需要哪些资源以及在哪个节点上运行最佳。
脚本的所有其他部分(不是以#BSUB
开头)只有在脚本停止pending
并开始running
时才被解释。在特定的一行中,bash
将遇到命令python train.py
,加载当前版本的train.py
,然后执行它。
也就是说,bsub
不会以任何方式“冻结”环境;作业开始运行时,它将运行最新版本的train.py
。如果您提交的两个作业都引用相同的.py
文件,则它们都将运行相同的python脚本(最新版本)。
如果您想知道如何使用上千种不同的设置运行上千个作业,这是我通常要做的:
.py
脚本可以接受带有配置参数的命令行参数,或者可以从某个文件获取配置;不要依靠手动修改脚本来更改某些设置。创建一个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
使用循环创建单独的bash脚本,该循环插入不同的元变量值(例如,使用{使用NAME_OF_THE_DATASET
,...,myDataset1.csv
替换myDatasetN.csv
{1}}),然后通过sed
提交修改后的模板。
这可能不是最简单的解决方案(可能可以使用bsub
本身的设施来使用更简单的编号方案),但是我发现它非常灵活,因为它与多个meta-变量以及各种标记和设置,还可以让您将不同的预处理脚本插入bsub
模板中。