在Slurm集群上运行TensorFlow?

20
我可以访问一个计算集群,具体是一个节点,拥有两个12核CPU,正在运行 Slurm Workload Manager
我想在该系统上运行 TensorFlow,但不幸的是,我找不到任何关于如何实现这一点或者是否可能的信息。我对此很陌生,但据我了解,我必须创建一个Slurm作业来运行TensorFlow,并不能直接通过ssh执行python/tensorflow。
是否有人对此有任何想法、教程或任何类型的资源?

1
持续集成网站 上的信息可能会有所帮助。此外,还请查看 readme - Guy Coder
1
你有找到特定的资料来源吗?如果有,请分享一下。当然,谷歌列出了一些页面,但我没能找到任何关于如何通过Slurm作业使用TensorFlow Python-API的技巧、教程或官方信息。 - daniel451
1
没有,我没有找到具体的东西。我不知道Slurm,甚至没有使用它的权限。我提出了建议,因为CI网站正在使用Docker镜像;所有作业都在Docker容器中运行,并检查Docker是否可以与Slurm一起工作。我发现了Slurm和docker/containers。我不认为你会得到答案,所以我给出了我所拥有的最好信息。带着一点点怀疑,但希望这能导致成功的结果。 - Guy Coder
1
请参考TensorFlow Docker安装指南 - Guy Coder
1
顺便提一下,这里正在为Slurm开发一个集群管理器:https://github.com/tensorflow/tensorflow/issues/1686 - Jacob Holloway
显示剩余2条评论
2个回答

26

这相对来说很简单。

在您要求每个主机只请求一个进程的简化假设下,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的模块hostlist来完成这项工作,可以在此处获得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']) ]  

祝你好运!


1
你能给一个SBATCH配置的例子吗?谢谢。 - Hamid

3
您可以通过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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接