我正在尝试从 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 加载数据?