我可以访问一个计算集群,特别是一个拥有两个12核CPU的节点,该节点使用Slurm Workload Manager运行。
我想在那个系统上运行TensorFlow,但不幸的是,我找不到任何有关如何执行此操作的信息,或者是否可以执行此操作的信息。我对这个还不熟悉,但据我所知,我必须通过创建slurm作业来运行tensorflow,并且不能通过ssh直接执行python/tensorflow。
有人有关于这个主题的想法、教程或任何来源吗?
最佳答案
这相对简单。
在您请求每个主机一个进程的简化假设下,slurm将为您提供环境变量中所需的所有信息,特别是slurm进程、slurm进程和slurm节点列表。
例如,可以初始化任务索引、任务数和节点列表,如下所示:
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]”),您需要扩展它。我用模块hostlist通过
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安装在固定端口2222上侦听的服务器。如果多个这样的作业恰好被调度到同一个节点,那么第二个作业将无法侦听2222。
更好的解决方案是让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']) ]
祝你好运!