1

我正在尝试从 databricks 在 gpu 集群(p2.xlarge)上运行 horovod.torch。

因为 horovod 使用 AllReduce 在节点之间传递参数,所以每个工作节点需要加载整个数据集并在不同的分区上工作。每次迭代后,所有节点通过 AllReduce 从其他节点获取参数值,通过取平均值来更新自己的参数。

我的理解是这是 SPMD(单程序多数据),因为每个工作节点都需要加载相同的整个数据集。

我需要从每个工作节点加载整个数据集,对吗?

我的代码:

import horovod.torch as hvd
from sparkdl import HorovodRunner 


def test1():
    hvd.init()
    train_df = spark.read.parquet("s3://my_data/").cache()
    print("load data done")
  

hr = HorovodRunner(np=2)
hr.run(test1)

但我得到了错误:

例外:您似乎正试图从广播变量、操作或转换中引用 SparkContext。SparkContext 只能在驱动程序上使用,不能在它在工作人员上运行的代码中使用。有关详细信息,请参阅 SPARK-5063。

似乎火花不允许多个上下文?

我还尝试在每个工作人员上创建一个新的本地 spark 会话:

def test1():
    hvd.init()

    from pyspark.sql import SparkSession

    spark = SparkSession \
          .builder \
          .appName("Python Spark SQL example") \
          .config("spark.some.config.option", "some-value") \
          .getOrCreate()

    train_df = spark.read.parquet("s3://my_data/").cache()
  

hr = HorovodRunner(np=2)
hr.run(test1)

我收到错误:

[1,1]<stderr>:Error: Could not find or load main class org.apache.spark.launcher.Main
[1,1]<stderr>:/databricks/spark/bin/spark-class: line 101: CMD: bad array subscript

如何使用 spark 在每个工作节点上加载数据?

如果 spark 不允许其他节点创建自己的 sparksession,如何在每个工作节点上为 horovod 加载数据?

4

0 回答 0