运行 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