如何在 Azure Databricks 群集上使用驱动程序节点 GPU 和 Horovod?



当我创建一个具有一个驱动程序 + 两个工作线程的集群,每个集群有一个 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 驱动程序的集群?

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

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

如果<0,这将在驱动程序节点上生成 -np 子进程以在本地运行 Horovod。训练标准输出和标准输出消息将转到笔记本单元输出,并且在单元输出被截断时也可在驱动程序日志中使用。这对于调试很有用,我们建议先在此模式下测试代码。但是,请注意在共享 Databricks 群集上大量使用 Spark 驱动程序。请注意,np <-1 仅在 Databricks 运行时 5.5 ML 及更高版本上受支持。

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

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

您可以在HorovodRunner API文档和"HorovodRunner:使用Horovod进行分布式深度学习"中找到有关参数np的详细信息。

希望这有帮助。

最新更新