#apache-spark #pyspark #pytorch #horovod
#apache-spark #pyspark #pytorch #horovod
Вопрос:
Я пытаюсь запустить horovod.torch на кластерах gpu (p2.xlarge) из databricks.
Поскольку horovod использует AllReduce для обмена параметрами между узлами, каждый рабочий узел должен загружать весь набор данных и работать с разными разделами. После каждой итерации все узлы получают значения параметров от других узлов с помощью AllReduce для обновления своих собственных параметров путем их усреднения.
Я понимаю, что это SPMD (single program multiple data), потому что каждый рабочий узел должен загружать один и тот же набор данных целиком.
Мне нужно загрузить весь набор данных с каждого рабочего узла, верно?
Мой код:
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 не допускает множественного контекста?
Я также попытался создать новый локальный сеанс 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?