问题描述
我目前有一个由3台机器组成的本地Spark集群3.0。两台计算机具有2个NVIDIA GPUS,一台计算机是没有NVIDIA GPU的spark客户端主计算机。 创建Spark集群时,我看到它将GPU识别为仪表板上的资源。 我正在尝试运行为Spark Distributor Tensorflow page发布的示例。 创建火花上下文时:
sc = pyspark.SparkContext(master = "spark://192.168.1.113:7077",appName="Spark GPU"
)
我看到GPU被用作资源执行器。
但是,当我运行以下命令时:
MirroredStrategyRunner(num_slots=8).run(train)
它导致以下错误:
raise ValueError(f'Found GPU addresses {addresses} which '
ValueError: Found GPU addresses [''] which are not all in the correct format for CUDA_VISIBLE_DEVICES,which requires integers with no zero padding.
我不确定为什么它无法检测到远程计算机上的GPU。
解决方法
根据 Spark TensorFlow Distributor MirroredStrategyRunner 文档字符串:
num_slots:GPU 或 CPU 的总数 Spark 任务 参与分布式训练
由于您正在进行 GPU 训练,并且想要在 Spark 工作器中使用 4 个 GPU 来训练您的模型,您应该这样做:
MirroredStrategyRunner(num_slots=4).run(train)
理想情况下,在此用例中,当您生成未获得其请求资源的 Spark 任务时,Spark GPU 调度可能会给您一个错误,但目前情况并非如此。确保正确设置 Spark 集群配置以支持 GPU 调度,示例如下:
from pyspark.sql import SparkSession
from spark_tensorflow_distributor import MirroredStrategyRunner
spark = (SparkSession.builder.appName("tf")
.config("spark.dynamicAllocation.enabled","false")
.config("spark.executor.resource.gpu.amount","1")
.config("spark.executor.cores","15")
.config("spark.task.cpus","15")
.config("spark.task.resource.gpu.amount","1")
.config("spark.executor.resource.gpu.discoveryScript","/usr/lib/spark/scripts/gpu/getGpusResources.sh")
.config("spark.driver.resource.gpu.discoveryScript","/usr/lib/spark/scripts/gpu/getGpusResources.sh")
.config("spark.driver.resource.gpu.amount","1")
.getOrCreate())
# use MirroredStrategy Runner