这比较简单。
在简化的假设下,每个主机请求一个进程,Slurm将为您提供环境变量中所有您需要的信息,特别是SLURM_PROCID,SLURM_NPROCS和SLURM_NODELIST。
例如,您可以按以下方式初始化任务索引,任务数和节点列表:
from hostlist import expand_hostlisttask_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]”),您需要对其进行扩展。我使用肯特·恩格斯特罗姆(KentEngströ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,以便使用–resv-
ports选项来请求端口。实际上,这要求要求他们在其slurm.conf中添加以下内容:
MpiParams=ports=15000-19999
在调试Slurm管理员之前,请检查已经配置了哪些选项,例如:
scontrol show config | grep MpiParams
如果您的站点已经使用了旧版本的OpenMPI,则可能已经存在类似的选项。
然后,如下修改我的第一段代码:
from hostlist import expand_hostlisttask_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']) ]祝好运!



