Databricks から GPU クラスター (p2.xlarge) で horovod.torch を実行しようとしています。
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 セッションを作成しようとしました。
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 の各ワーカー ノードにデータをロードする方法は?