我有一个由数据集和多个机器学习算法(使用scikit-learn进行参数调整)组成的输入。我已经尝试了多种方法,以尽可能高效地执行这些任务,但在目前,我仍然没有适当的基础设施来评估我的结果。然而,我在这方面的背景知识不足,我需要帮助来澄清一些问题。
基本上,我想知道任务是如何分配的,以便尽可能充分利用所有可用资源,以及哪些是Spark隐式完成的,哪些不是。
我需要训练许多不同的决策树模型(根据所有可能参数的组合数量)、许多不同的随机森林模型,等等…
在我的一个方法中,我有一个列表,其中的每个元素对应一个机器学习算法及其参数列表。
spark.parallelize(algorithms).map(lambda algorihtm: run_experiment(dataframe, algorithm))
在这个run_experiment
函数中,我为相应的机器学习算法创建了一个GridSearchCV
,并设置了其参数网格。我还设置了n_jobs=-1
,以试图实现最大并行性。
在这种情况下,在我的Spark集群中只有几个节点的情况下,执行过程看起来会像这样吗?
还是可以在一个节点上同时运行一个决策树模型和一个随机森林模型?这是我第一次使用集群环境,所以我对如何期望事情运作感到有些困惑。
另一方面,如果我不是使用parallelize
的第一种方法,而是使用for
循环顺序遍历我的算法列表,并使用databricks的spark-sklearn集成来创建GridSearchCV
,那么在执行方面会有什么变化?文档中展示的方式看起来像这样:
最后,关于第二种方法,使用相同的机器学习算法,但使用Spark MLlib而不是scikit-learn,整个并行化/分布会得到处理吗?
如果这些问题中的大部分显得有些幼稚,我很抱歉,但我非常感谢任何回答或见解。我想在实际在集群中测试并玩弄任务调度参数之前,先了解基础知识。
我不确定这个问题是更适合在这里还是在CS stackexchange上提问。
回答:
spark.parallelize(algorithms).map(...)
根据参考,“集合的元素被复制以形成一个可以并行操作的分布式数据集。”这意味着你的算法将被分散到你的节点中。从那里,每个算法都会执行。
如果算法及其各自的参数以这种方式分散,那么你的方案可能是有效的,我认为这对你来说是适用的。
关于充分利用你的资源,spark在这方面做得很好。然而,你需要检查工作负载在你的任务之间是否平衡(每个任务做相同的工作量),以获得良好的性能。
如果不是使用
parallelize
的第一种方法,而是使用for循环,会有什么变化?
一切都会改变。你的数据集(在你的例子中是算法)不是RDD,因此不会发生并行执行。
… 并且还使用databricks的spark-sklearn集成Spark和scikit-learn?
这篇文章描述了随机森林是如何在那里实现的:
“Spark的scikit-learn包提供了一种交叉验证算法的替代实现,该实现将工作负载分布在Spark集群上。每个节点使用scikit-learn库的本地副本运行训练算法,并将最佳模型报告回主节点。”
我们可以将这推广到你所有的算法,这使得你的方案合理。
使用Spark MLlib而不是scikit-learn,整个并行化/分布会得到处理吗?
是的,会的。这两个库的理念都是为我们处理这些事情,以便我们更轻松地生活。
我建议你一次问一个大问题,因为现在答案太宽泛了,但我会尽量简洁。