多节点Spark集群上的分布式Tensorflow培训

时间:2020-09-22 11:53:19

标签: apache-spark tensorflow cluster-computing distributed

我目前有一个由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。

1 个答案:

答案 0 :(得分:0)

根据 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

这个例子来自https://cloud.google.com/blog/products/data-analytics/faster-machine-learning-dataproc-new-initialization-action

相关问题