在 IBM Load Sharing Facility (LSF) 中训练神经网络

Training neural network in IBM Load Sharing Facility (LSF)

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

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

我使用 Python+Keras+Tensorflow 来完成我的任务。

我的典型工作流程如下。我在 python 脚本中定义神经网络架构和训练参数,train.py,将其提交到 git 存储库,然后 运行。 然后我在 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。

虽然它不是 运行ning,但在等待下一个空闲节点,我对 train.py 进行了一些更改以创建一个新变体并以类似的方式再次提交:bsub < batch_submit

设新任务ID为12345692,任务12345678还在等待中

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

脚本呢train.py?

他们两个会一样吗?

是的,会的。当您提交作业时,bsub 将仅查看以 #BSUB 开头的前几行,以确定您的作业需要哪些资源,以及 [=59= 在哪个节点上】 最好。

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

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

如果您想知道如何 运行 千种不同设置的作业,我通常会这样做:

  1. 确保您的 .py 脚本可以接受带配置参数的命令行参数,或者它可以从某个文件获取配置;不要依靠手动修改脚本来更改某些设置。
  2. 创建一个 bsub-template 文件,它看起来与上面的 bash 脚本大致相似,但至少留下一个元变量,它可以指定实验的参数。 "meta-variable" 我的意思是一个独特的字符串,它不会与您的 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 using sed), 然后通过bsub.

  4. 提交修改后的模板

它可能不是最简单的解决方案(可能可以使用 bsub 本身的功能使用更简单的编号方案),但我发现它非常灵活,因为它同样适用于多个元变量和各种标志和设置,它还允许您将不同的预处理脚本插入到 bsub 模板中。