我被允许访问一些高性能的计算机系统来进行一些机器学习的实验。你知道吗
这个系统安装了IBM的LSF10.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仍在等待。你知道吗
现在我有两份工作在等他们的节点。你知道吗
剧本呢训练吗?你知道吗
他们两个都一样吗?你知道吗
是的,会的。提交作业时,
bsub
将只查看以#BSUB
开头的前几行,以确定作业需要哪些资源,以及在哪个节点上最好地运行作业。你知道吗脚本的所有其他部分都不是以
#BSUB
开头的,只有在脚本停止pending
并开始running
时才被解释。在一个特定的行中,bash
将遇到命令python train.py
,加载当前版本的train.py
,并执行它。你知道吗也就是说,
bsub
不会以任何方式“冻结”环境;当作业开始运行时,它将运行最新版本的train.py
。如果提交的两个作业都引用相同的.py
-文件,那么它们都将运行相同的python脚本(最新版本)。你知道吗如果您想知道如何使用上千种不同的设置运行上千个作业,我通常会这样做:
.py
脚本可以接受带有配置参数的命令行参数,或者可以从某个文件获取配置;不要依靠手动修改脚本来更改某些设置。你知道吗创建一个类似于上面bash脚本的bsub模板文件,但至少留下一个可以指定实验参数的元变量。我所说的“元变量”是指一个唯一的字符串,它不会与bash脚本中的任何其他内容发生冲突,例如
NAME_OF_THE_DATASET
:使用插入元变量不同值的循环创建一个单独的bash脚本(例如,将
NAME_OF_THE_DATASET
替换为myDataset1.csv
。。。,myDatasetN.csv
使用sed
),然后通过bsub
提交修改后的模板。它可能不是最简单的解决方案(使用
bsub
本身的功能,可以使用更简单的编号方案),但我发现它非常灵活,因为它同样适用于多个元变量和各种标志和设置,它还允许您将不同的预处理脚本插入到bsub
模板中。你知道吗相关问题 更多 >
编程相关推荐