在 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 脚本(最新版本)。
如果您想知道如何 运行 千种不同设置的作业,我通常会这样做:
- 确保您的
.py
脚本可以接受带配置参数的命令行参数,或者它可以从某个文件获取配置;不要依靠手动修改脚本来更改某些设置。
创建一个 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
创建一个单独的 bash-脚本,其中包含一个循环,为元变量插入不同的值(例如,将 NAME_OF_THE_DATASET
替换为 myDataset1.csv
,... , myDatasetN.csv
using sed
), 然后通过bsub
.
提交修改后的模板
它可能不是最简单的解决方案(可能可以使用 bsub
本身的功能使用更简单的编号方案),但我发现它非常灵活,因为它同样适用于多个元变量和各种标志和设置,它还允许您将不同的预处理脚本插入到 bsub
模板中。
我被授予访问某些高性能计算系统的权限,以进行一些机器学习实验。
此系统安装了 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 脚本(最新版本)。
如果您想知道如何 运行 千种不同设置的作业,我通常会这样做:
- 确保您的
.py
脚本可以接受带配置参数的命令行参数,或者它可以从某个文件获取配置;不要依靠手动修改脚本来更改某些设置。 创建一个 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
创建一个单独的 bash-脚本,其中包含一个循环,为元变量插入不同的值(例如,将
NAME_OF_THE_DATASET
替换为myDataset1.csv
,... ,myDatasetN.csv
usingsed
), 然后通过bsub
. 提交修改后的模板
它可能不是最简单的解决方案(可能可以使用 bsub
本身的功能使用更简单的编号方案),但我发现它非常灵活,因为它同样适用于多个元变量和各种标志和设置,它还允许您将不同的预处理脚本插入到 bsub
模板中。