多机集群上的分布式Python

时间:2019-05-19 19:21:25

标签: python machine-learning distributed-computing

以下是要求-:

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。全部在同一数据集上运行...

1 个答案:

答案 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)来实现,但需要更多的自定义编码。

希望此信息对您有帮助!