以下是要求-:
class MultiMachineDoWork:
def Function1(self, A, B):
return A+B
def Function2(self, A, B):
return A*B
def Function3(self, A, B):
return A**B
def Function4():
X = MultiMachineDoWork.Function1(5,10)
Y = MultiMachineDoWork.Function2(5,10)
Z = MultiMachineDoWork.Function3(5,10)
return X+Y+Z
假设Function1,Function2和Function3各自花费很长时间,最好在机器L,M和N上分别在分布式模型上并行运行它们。 功能4可以在机器P上运行,机器P可以收集结果并合并。
MapReduce在某种相似的概念上工作,但是在数据的不同部分上运行相同的功能 ... Dask / Ray / Celery在这个案例研究中可以用吗?
如果必须构建自定义解决方案,解决方案将如何进行?
带有Dask本地群集的Pydoop / Spark?
现实生活中的案例研究-机器学习分类的集成模型。一个函数用于RandomForest,一个函数用于支持向量,一次用于XGBoost。全部在同一数据集上运行...
答案 0 :(得分:1)
可以使用python中的各种框架在多个计算机/节点之间分配任务/功能/计算。最常用和广泛使用的是Ray,Dask和PySpark,要使用哪种取决于实际用例。
对于简单的功能/任务分配,您可以使用Ray库(@ ray.remote)进行分配,然后使用get方法将结果积分/计算回去。同样,也可以通过dask来完成。
https://rise.cs.berkeley.edu/blog/modern-parallel-and-distributed-python-a-quick-tutorial-on-ray/
当您要处理大型数据集并且想要执行某种ETL操作以将庞大的数据集分布到多个节点然后执行一些转换或操作时,我会更喜欢 Spark / Pyspark 在上面。注意Spark或mapreduce概念假定您将计算带到数据上,它将对不同的数据子集执行相同/相似的任务,最后执行一些聚合(涉及改组)。
Spark / Pyspark 通过其内置的随机森林或梯度增强树算法支持集成。但是,目前尚不支持在单独的节点/执行器上训练单独的模型(随机森林,渐变树,逻辑回归等)(即开即用)。尽管通过自定义的spark代码可能是可能的,就像它们在内部对随机森林所做的方式(训练多个决策树)一样。
真实的合奏场景可以使用dask和sklearn轻松完成。 Dask与scikit-learn xgboost等很好地集成在一起,可以使用joblib上下文管理器在分布式集群节点/工作人员之间执行并行计算。
现在用于整体场景,您可以使用scikit-learn的不同模型/算法(RandomForest,SGD,SVM,逻辑回归),并使用Voting分类器将多个不同模型(即子估计器)组合为一个模型,(在理想情况下)比任何单个模型(即整体概念的基础)都要强大。
使用Dask将在群集中的不同计算机上训练各个子估计器/模型。
https://docs.dask.org/en/latest/use-cases.html
高级代码看起来像-
classifiers = [
('sgd', SGDClassifier(max_iter=1000)),
('logisticregression', LogisticRegression()),
('xgboost', XGBClassifier()
('svc', SVC(gamma='auto')),
]
clf = VotingClassifier(classifiers)
with joblib.parallel_backend("dask"):
clf.fit(X, y)
**以上内容也可以通过其他分布式框架(如Ray / Spark.etc)来实现,但需要更多的自定义编码。
希望此信息对您有帮助!