为什么dataproc上的apachesparkml只在单节点上训练?

cqoc49vn  于 2021-07-12  发布在  Spark
关注(0)|答案(1)|浏览(268)

我是新的分布式ml和目前正在做我的个人项目
我在clouddataproc上使用pyspark训练我的模型,并像下面的代码那样构建管道

spark = SparkSession.builder.appName('sparkify-train').getOrCreate()
df = spark.read.parquet(path)

gbt = GBTClassifier()

paramGrid = ParamGridBuilder() \
    .addGrid(gbt.maxDepth, [4,8,12]) \
    .addGrid(gbt.maxIter, [5,10,15]) \
    .addGrid(gbt.featuresCol, ["features_1", "features_2"]) \
    .build()

tvs = TrainValidationSplit(estimator=gbt,
                           estimatorParamMaps=paramGrid,
                           evaluator=BinaryClassificationEvaluator(),
                           trainRatio=0.75)
tvs.fit(df)

注意:我没有在上面的代码中显示特征提取和其他内容
但是在cpu利用率图表上,主节点是唯一繁忙的节点,而不是三个工作节点

我使用cloudshell和下面的命令创建dataproc集群。此命令由dataproc create cluster ui生成。

gcloud beta dataproc clusters create sparkify --enable-component-gateway --region asia-southeast2 --subnet default --zone asia-southeast2-c 
--master-machine-type custom-1-3840 --master-boot-disk-type pd-ssd --master-boot-disk-size 50 --num-workers 3 --worker-machine-type custom-1-3840 --worker-boot-disk-type pd-ss
d --worker-boot-disk-size 30 --image-version 2.0-ubuntu18 --optional-components JUPYTER,ZEPPELIN --project wskt-trek

这是上面命令中的集群属性:



我只是想知道我的代码有什么问题吗?或者我错过了什么设置?我认为所有的工人cpu都应该有很高的利用率。谢谢!

kiz8lqtg

kiz8lqtg1#

集群配置良好,在您使用notebok的情况下,将建立客户端模式,在这种情况下,我建议您:
你创建了一个有多个主程序(例如2个主程序和3个工作程序)的Spark簇,这不是一个好的实践(你将在第3点中理解为什么)。
您可以使用spark tensorflow distributor,它是tensorflow中的一个开源本机包,可以帮助用户在spark集群上使用tensorflow进行分布式培训。它建立在tensorflow.distribute.strategy的基础上,tensorflow.distribute.strategy是TensorFlow2的主要特性之一。有关详细的api文档,请参阅docstrings。有关分布式tensorflow的一般文档,请参阅使用tensorflow进行分布式培训。
最重要的一点是:不要把你的视野局限在这个层面,我的意思是在使用笔记本的层面上,看看spark cluster的行为,为什么?在训练了模型之后,您需要将其保存为pmml文件,然后部署它,spark将很好地工作。您可以参考这个简单的示例,尝试部署您的模型,并在使用notebok客户机模式时将dataproc中的spark集群行为与前一个进行比较。

相关问题