我目前有一个本地spark集群3.0,它由3台机器组成。两台机器有2个NVIDIA GPU,一台机器是没有NVIDIA GPU的spark客户端主服务器。当我创建spark集群时,我看到它将GPU识别为仪表板上的资源。我正在尝试运行为Spark Distributor Tensorflow page发布的示例。当我创建spark上下文时:
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。
发布于 2021-06-08 17:08:53
根据Spark TensorFlow分销商MirroredStrategyRunner文档字符串:
num_slots:参与分布式训练的GPU或仅CPU火花任务的总数
由于您正在进行GPU训练,并且希望在Spark workers中使用4个GPU训练您的模型,因此您应该这样做:
MirroredStrategyRunner(num_slots=4).run(train)理想情况下,在这个用例中,Spark GPU调度可能会在您产生的spark任务没有获得其请求的资源时给您一个错误,但目前情况并非如此。确保正确设置Spark集群confs以支持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 Runnerhttps://stackoverflow.com/questions/64009192
复制相似问题