所以我有一个使用scikit-learn的数据集和几个ML算法(带参数调整)的输入。我已经尝试了很多关于如何尽可能高效地执行此操作的尝试,但此时此刻我仍然没有适当的基础设施来评估我的结果。但是,我在这方面缺乏一些背景知识,我需要帮助才能解决问题。
基本上我想知道如何以尽可能多地利用所有可用资源的方式分配任务,以及隐式实现的内容(例如Spark)以及什么不是。
我需要训练许多不同的决策树模型(与所有可能参数的组合一样多),许多不同的随机森林模型,等等......
在我的一种方法中,我有一个列表,每个元素对应一个ML算法及其参数列表。
spark.parallelize(algorithms).map(lambda algorihtm: run_experiment(dataframe, algorithm))
在此函数run_experiment
中,我使用其参数网格为相应的ML算法创建GridSearchCV
。我还设置n_jobs=-1
以便(尝试)实现最大并行度。
在这种情况下,在我的带有几个节点的Spark集群上,执行看起来有点像这样有意义吗?
或者可以在同一节点中运行一个决策树模型和一个随机森林模型?这是我第一次使用集群环境的经历,所以我对如何期望工作有点困惑。
另一方面,在执行方面究竟有什么变化,如果不使用parallelize
的第一种方法,我使用for
循环来顺序迭代我的算法列表并创建{ {1}}在Spark和scikit-learn之间使用数据库' spark-sklearn集成?它在文档中的说明方式似乎是这样的:
最后,关于第二种方法,使用相同的ML算法,而不是使用Spark MLlib而不是scikit-learn,整个并行化/分配是否会得到解决?
很抱歉,如果大部分内容都有点天真,但我非常感谢您对此有任何答案或见解。我想在集群中进行实际测试并使用任务调度参数之前了解基础知识。
我不确定这个问题在这里或CS stackexchange是否更合适。
答案 0 :(得分:0)
spark.parallelize(algorithms).map(...)
从ref,"复制集合的元素以形成可以并行操作的分布式数据集。"这意味着您的算法将分散在您的节点中。从那里,每个算法都将执行。
如果算法及其各自的参数以这种方式分散,那么你的方案可能是有效的,我认为就是这种情况。
关于使用您的所有资源,spark非常擅长这一点。但是,您需要检查工作负载是否在您的任务之间平衡(每个任务执行相同的工作量),以获得良好的性能。
如果使用for
parallelize
代替第一种方法,我会使用for循环进行哪些更改?
一切。您的数据集(在您的情况下算法)不是RDD,因此不会发生并行执行。
..还使用了数据库与Spark和scikit-learn之间的spark-sklearn集成?
此article描述了随机森林的实施方式:
" Spark的scikit-learn包提供了交叉验证算法的替代实现,该算法将工作负载分布在Spark集群上。每个节点使用scikit-learn库的本地副本运行训练算法,并将最佳模型报告给主人。"
我们可以将此推广到您的所有算法,这使您的方案合理。
Spark MLlib而不是scikit-learn,整个并行化/分发会被照顾吗?
是的,它会的。他们认为这个图书馆都是为我们照顾好事情,这样我们才能让生活更轻松。
我建议你一次提出一个大问题,因为答案现在过于宽泛,但我会尽量简洁。