【问题标题】:How to distribute custom code through SLURM manager?如何通过 SLURM 管理器分发自定义代码?
【发布时间】:2020-05-28 14:28:49
【问题描述】:

我可以使用 SLURM 管理器访问计算机集群。我想实现不同的节点执行我的代码的不同部分。如果我理解正确,如果您的代码编写正确,这可以通过 SLURM 和 srun 命令来实现。它应该类似于这里的 MPI 示例 https://support.ceci-hpc.be/doc/_contents/QuickStart/SubmittingJobs/SlurmTutorial.html

但我不明白如何在 TF 中创建此代码。 TF 版本 1 有更多信息。如果我尝试这样的事情

jobs={'worker': 4}
cluster=tf.distribute.cluster_resolver.SlurmClusterResolver(jobs=jobs)
server0 = tf.distribute.Server(cluster.cluster_spec(), job_name='worker', task_index=0)
server1 = tf.distribute.Server(cluster.cluster_spec(), job_name='worker', task_index=1)
server2 = tf.distribute.Server(cluster.cluster_spec(), job_name='worker', task_index=2)
server2 = tf.distribute.Server(cluster.cluster_spec(), job_name='worker', task_index=3)

并使用 SLURM 运行它,我收到一个错误,我看到只有第一个服务器已启动,但第二个服务器试图使用相同的地址,即 'localhost:8888'。所以本质上,我不知道如何在以后可以通信的不同节点上创建服务器。我应该同时运行不同的脚本吗?我必须使用带有标志或类似东西的命令行吗?

后来,我的想法是用

with tf.device("/job:worker/task:0"):
#some code
with tf.device("/job:worker/task:1"):
#some other code

分配工作。有什么帮助吗?我认为我无法使用 TF 提供的任何分发策略。

【问题讨论】:

    标签: slurm tensorflow2.x


    【解决方案1】:

    看来我找到了解决方案,所以我发布它,也许它会对某人有所帮助。看来

    cluster = tf.compat.v1.train.ClusterSpec({'worker': ['n03:2222', 'n04:2223'] })
    

    而不是cluster_resolver 解决了地址相同的问题。后来我需要调用一个会话,它必须是与任务1相关的服务器目标的会话(不知道为什么,可能与主节点有关),像这样:

    with tf.compat.v1.Session(server1.target) as sess:
        x=tf.Variable(...)
        for k in range(n):
            y1=f1(x)
            y2=f2(x)
            y1=y1.eval()
            y2=y2.eval()
    

    其中f1(x) 是一个 tf.function,分配给工人的地方,例如:

    @tf.function
    def f1(x):
        with tf.device("/job:worker/task:0"):
             y=...
             x.assign(x+1)
        return y
    

    f2(x) 类似,只是任务1。 这一切都在我在 .sh 文件中调用的一个脚本中。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多