运行 Slurm 集群上的 TensorFlow?
Running TensorFlow on a Slurm Cluster?
我可以访问一个计算集群,特别是一个具有两个 12 核 CPU 的节点,即 运行 Slurm Workload Manager。
我想 运行 TensorFlow 在该系统上,但遗憾的是我无法找到有关如何执行此操作或是否可能的任何信息。我对此很陌生,但据我了解,我必须通过创建 Slurm 作业来 运行 TensorFlow,并且不能通过 ssh 直接执行 python/tensorflow。
有人有关于这个主题的想法、教程或任何类型的资源吗?
比较简单
在您为每台主机请求一个进程的简化假设下,slurm 将为您提供环境变量中所需的所有信息,特别是 SLURM_PROCID、SLURM_NPROCS 和 SLURM_NODELIST。
例如,你可以初始化你的任务索引,任务数量和节点列表如下:
from hostlist import expand_hostlist
task_index = int( os.environ['SLURM_PROCID'] )
n_tasks = int( os.environ['SLURM_NPROCS'] )
tf_hostlist = [ ("%s:22222" % host) for host in
expand_hostlist( os.environ['SLURM_NODELIST']) ]
请注意,slurm 以其压缩格式(例如,"myhost[11-99]")为您提供主机列表,您需要对其进行扩展。我通过模块主机列表来做到这一点
Kent Engström,可在此处找到 https://pypi.python.org/pypi/python-hostlist
到那时,您可以直接使用您掌握的信息创建您的 TensorFlow 集群规范和服务器,例如:
cluster = tf.train.ClusterSpec( {"your_taskname" : tf_hostlist } )
server = tf.train.Server( cluster.as_cluster_def(),
job_name = "your_taskname",
task_index = task_index )
大功告成!您现在可以使用通常的语法在分配的特定主机上执行 TensorFlow 节点放置:
for idx in range(n_tasks):
with tf.device("/job:your_taskname/task:%d" % idx ):
...
上面报告的代码的一个缺陷是你所有的作业都会指示 Tensorflow 安装服务器监听固定端口 22222。如果多个这样的作业恰好被调度到同一个节点,第二个将无法监听22222.
更好的解决方案是让 slurm 为每个作业预留端口。您需要让您的 slurm 管理员参与并要求他配置 slurm,以便它允许您使用 --resv-ports 选项请求端口。实际上,这需要要求他们在 slurm.conf:
中添加如下一行
MpiParams=ports=15000-19999
在打扰您的 slurm 管理员之前,请检查已经配置了哪些选项,例如:
scontrol show config | grep MpiParams
如果您的站点已经在使用旧版本的 OpenMPI,那么可能已经有这样的选项。
然后,修改我的第一段代码如下:
from hostlist import expand_hostlist
task_index = int( os.environ['SLURM_PROCID'] )
n_tasks = int( os.environ['SLURM_NPROCS'] )
port = int( os.environ['SLURM_STEP_RESV_PORTS'].split('-')[0] )
tf_hostlist = [ ("%s:%s" % (host,port)) for host in
expand_hostlist( os.environ['SLURM_NODELIST']) ]
祝你好运!
您可以简单地使用 sbatch
命令将批处理脚本传递给 slurm
sbatch --partition=part start.sh
可以使用 sinfo
来列出可用分区。
start.sh(可能配置):
#!/bin/sh
#SBATCH -N 1 # nodes requested
#SBATCH -n 1 # tasks requested
#SBATCH -c 10 # cores requested
#SBATCH --mem=32000 # memory in Mb
#SBATCH -o outfile # send stdout to outfile
#SBATCH -e errfile # send stderr to errfile
python run.py
而 run.py 包含您希望使用 slurm 执行的脚本,即您的 tensorflow 代码。
您可以在这里查看详细信息:https://slurm.schedmd.com/sbatch.html
我可以访问一个计算集群,特别是一个具有两个 12 核 CPU 的节点,即 运行 Slurm Workload Manager。
我想 运行 TensorFlow 在该系统上,但遗憾的是我无法找到有关如何执行此操作或是否可能的任何信息。我对此很陌生,但据我了解,我必须通过创建 Slurm 作业来 运行 TensorFlow,并且不能通过 ssh 直接执行 python/tensorflow。
有人有关于这个主题的想法、教程或任何类型的资源吗?
比较简单
在您为每台主机请求一个进程的简化假设下,slurm 将为您提供环境变量中所需的所有信息,特别是 SLURM_PROCID、SLURM_NPROCS 和 SLURM_NODELIST。
例如,你可以初始化你的任务索引,任务数量和节点列表如下:
from hostlist import expand_hostlist
task_index = int( os.environ['SLURM_PROCID'] )
n_tasks = int( os.environ['SLURM_NPROCS'] )
tf_hostlist = [ ("%s:22222" % host) for host in
expand_hostlist( os.environ['SLURM_NODELIST']) ]
请注意,slurm 以其压缩格式(例如,"myhost[11-99]")为您提供主机列表,您需要对其进行扩展。我通过模块主机列表来做到这一点 Kent Engström,可在此处找到 https://pypi.python.org/pypi/python-hostlist
到那时,您可以直接使用您掌握的信息创建您的 TensorFlow 集群规范和服务器,例如:
cluster = tf.train.ClusterSpec( {"your_taskname" : tf_hostlist } )
server = tf.train.Server( cluster.as_cluster_def(),
job_name = "your_taskname",
task_index = task_index )
大功告成!您现在可以使用通常的语法在分配的特定主机上执行 TensorFlow 节点放置:
for idx in range(n_tasks):
with tf.device("/job:your_taskname/task:%d" % idx ):
...
上面报告的代码的一个缺陷是你所有的作业都会指示 Tensorflow 安装服务器监听固定端口 22222。如果多个这样的作业恰好被调度到同一个节点,第二个将无法监听22222.
更好的解决方案是让 slurm 为每个作业预留端口。您需要让您的 slurm 管理员参与并要求他配置 slurm,以便它允许您使用 --resv-ports 选项请求端口。实际上,这需要要求他们在 slurm.conf:
中添加如下一行MpiParams=ports=15000-19999
在打扰您的 slurm 管理员之前,请检查已经配置了哪些选项,例如:
scontrol show config | grep MpiParams
如果您的站点已经在使用旧版本的 OpenMPI,那么可能已经有这样的选项。
然后,修改我的第一段代码如下:
from hostlist import expand_hostlist
task_index = int( os.environ['SLURM_PROCID'] )
n_tasks = int( os.environ['SLURM_NPROCS'] )
port = int( os.environ['SLURM_STEP_RESV_PORTS'].split('-')[0] )
tf_hostlist = [ ("%s:%s" % (host,port)) for host in
expand_hostlist( os.environ['SLURM_NODELIST']) ]
祝你好运!
您可以简单地使用 sbatch
命令将批处理脚本传递给 slurm
sbatch --partition=part start.sh
可以使用 sinfo
来列出可用分区。
start.sh(可能配置):
#!/bin/sh
#SBATCH -N 1 # nodes requested
#SBATCH -n 1 # tasks requested
#SBATCH -c 10 # cores requested
#SBATCH --mem=32000 # memory in Mb
#SBATCH -o outfile # send stdout to outfile
#SBATCH -e errfile # send stderr to errfile
python run.py
而 run.py 包含您希望使用 slurm 执行的脚本,即您的 tensorflow 代码。
您可以在这里查看详细信息:https://slurm.schedmd.com/sbatch.html