【问题标题】:How can I utilize the driver node GPU with Horovod on an Azure Databricks cluster?如何在 Azure Databricks 群集上将驱动程序节点 GPU 与 Horovod 结合使用?
【发布时间】:2020-01-09 16:24:17
【问题描述】:

当我创建一个包含一个驱动程序 + 两个工作人员的集群时,每个集群都有一个 GPU,并尝试在每个 GPU 上启动训练,我会写:

from sparkdl import HorovodRunner 
hr = HorovodRunner(np=3) 
hr.run(train_hvd)

但是收到以下错误信息:

HorovodRunner was called with np=3, which is greater than the maximum processes that can be placed
on this cluster. This cluster can place at most 2 processes on 2 executors. Training won't start
until there are enough workers on this cluster. You  can increase the cluster size or cancel the
current run and retry with a smaller np.

显然 HorovodRunner 没有考虑驱动节点上的 GPU(对吗?)。当我使用选项 np=-1(仅驱动 GPU)、np=2(某处 2 个 GPU)或 np=-2(仅驱动但有 2 个 GPU)时,一切正常,即我的功能没有任何问题代码,除此之外我无法让它利用所有 3 个可用的 GPU。

(a) 有没有办法让 Horovod 在分布式学习中包含驱动节点上的 GPU?

(b) 或者:有没有办法在 Databricks 中创建一个包含 GPU 工作器但非 GPU 驱动程序的集群?

【问题讨论】:

    标签: databricks azure-databricks horovod


    【解决方案1】:

    要仅在具有 n 个子进程的驱动程序上运行 HorovodRunner,请使用 hr = HorovodRunner(np=-n)。比如驱动节点有4个GPU,可以选择n最多4个。

    参数:np – 用于 Horovod 作业的并行进程数。此参数仅对 Databricks Runtime 5.0 ML 及更高版本生效。它在开源版本中被忽略。在 Databricks 上,每个进程都会占用一个可用的任务槽,该任务槽映射到 GPU 集群上的 GPU 或 CPU 集群上的 CPU 核心。可接受的值为:

    如果 ,这将在驱动节点上生成 -np 子进程以在本地运行 Horovod。训练 stdout 和 stderr 消息转到笔记本单元输出,并且在单元输出被截断的情况下也可以在驱动程序日志中使用。这对于调试很有用,我们建议首先在此模式下测试您的代码。但是,请注意在共享 Databricks 集群上大量使用 Spark 驱动程序。请注意,np

    如果 >0,这将启动一个包含 np 任务的 Spark 作业,并在任务节点上运行 Horovod 作业。它将等到 np 任务槽可用以启动作业。如果 np 大于集群上的任务槽总数,则作业将失败。从 Databricks Runtime 5.4 ML 开始,训练 stdout 和 stderr 消息将转到笔记本单元输出。如果单元格输出被截断,完整的日志将在由 HorovodRunner 启动的第二个 spark 作业下的任务 0 的 stderr 流中可用,您可以在 Spark UI 中找到它。

    如果为 0,这将使用集群上的所有任务槽来启动作业。

    您可以在HorovodRunner API documentation和“HorovodRunner: Distributed Deep Learning with Horovod”中找到有关参数np的详细信息。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多