【分布式机器学习】基本知识

从今天开始正式入门【分布式机器学习】啦~~~
由于研一的科研项目中我的课题是

一、梯级水电站海量多源异构数据高效存储方法
二、提出梯级水电站时空大数据的并行处理框架

所以我就一直跟并行处理框架过不去,各种资料搜关键词也是搜“并行处理”,没有想到分布式这一层。经过一段时间的研究之后发现【分布式机器学习】这个领域的研究成果还是挺多的,所以打算正式入门。

一、书籍推荐

  1. 《分布式机器学习——算法、理论与实践》 作者:刘铁岩 陈薇 王太峰 高飞
    本书对分布式机器学习这一领域进行了全面而深入的介绍,并且为进一步的研究和时间储备必要的知识和思路。
  2. 《Spark MLlib机器学习——算法、源码及实战详解》 作者:黄美灵
    本书系统、全面、深入地解析Spark MLlib机器学习的相关知识,以源码为基础,兼顾算法、理论与实战,帮助读者在实际工作中进行MLlib的应用开发。(书中提到的算法都是基于Scala语言)
  3. 《PySpark实战指南——利用Python和Spark构建数据密集型应用并规模化部署》 作者:托马兹·卓巴斯[美]
    本书系统讲解如何在Spark2.0上高效运用Python来处理数据并建立机器学习模型,帮助读者开发并部署高效可拓展的实时Spark解决方案。

二、分布式机器学习(DML)基础

  1. DML难点
    分布式机器学习涉及如何分配训练任务,调配计算资源,协调各个功能模块,以达到训练速度与精度的平衡。也就是如何划分训练数据、分配训练任务、调配计算资源、整合分布式的训练结果,以达到训练速度和训练精度的完美平衡。(这几点可以作为大论文的创新点方向)
  2. DML系统的主要模块
    (1)数据和模型划分模块
    (2)单机优化模块
    (3)通信模块
    (4)模型和数据聚合模块

    通过五花八门的组合,其优劣性需要根据机器学习任务本身(比如模型和优化算法的类别)、计算机集群的属性(比如单机运算能力和通信带宽等)以及最终的评价准则(比如精度优先还是速度优先)等来进行取舍。
    分布式机器学习与其他分布式系统不同,我们需要考虑它对数据的鲁棒性,对算法精度的特别要求,以及机器学习的泛化过程等。因而,如果想把分布式机器学习做好,需要把系统和统计、优化等知识有机的结合在一起。
  3. 数据并行vs模型并行
    数据并行的主要思想:将数据进行划分,并分配到多个工作节点上进行训练,这样每个工作节点的局部数据都在容限之内。每个工作节点会根据局部数据训练处一个子模型,并且会按照一定的规律和其他工作节点进行通信(通信的内容主要是子模型参数或参数更新),以保证最终可以有效整合来自各个工作节点的训练结果并得到全局的机器学习模型。
    模型并行暂不研究,不做介绍。
  4. 通信部分
    (1)通信的拓扑结构
    A. 基于迭代式MapReduce/allreduce的通信拓扑,目前应用比较广泛的:Spark MLlib、Vowpal Wabbit(VM)、Cloudera等。
    B. 基于参数服务器的通信拓扑,目前影响力比较大的:CMU的parameter server。
    C. 基于数据流的通信拓扑,例如TensorFlow。
    (2)通信的步调
    A. 同步通信:基于BSP的随机梯度下降法(BSP-SGD)、模型平均法、ADMM、弹性平均随机梯度下降法(EA-SGD)等
    B. 异步通信(配合参数服务器):异步随机梯度下降法(ASGD)等
    (3)通信的频率
    是应该处理完每一个样本或每一个小批量(mini batch)之后就马上进行通信,还是在把所有本地训练数据都处理完之后再进行通信?
  5. 数据与模型聚合模块
    以参数服务器为例,当参数服务器收到来自不同节点的本地模型时,既可以选择对模型参数进行简单平均来获得全局模型,也可以通过解一个一致性优化问题来获得全局模型(如ADMM、BMUF),还可以通过模型集成来获得全局模型。

三、分布式机器学习框架

使用最广的DML数据处理系统之一便是Spark MLlib,Spark MLlib是Apache Spark的扩展ML库,是一个基于内存的DML框架,并且使得ML系统易于扩展和部署。MLlib提供了传统ML算法的分布式实现,例如分类、回归和聚类等等。Apache DeepSpark提供了DL的分布式训练框架的实现。
另外TensorFlowPytorch也都支持DNN的分布式训练和部署。TensorFlow通过tf.distribution支持DNN的分布式训练,允许数据在不同进程上甚至不同服务器上进行计算,并且可以使用多处理器或服务器,在数据集的不同分片上训练相同的模型。Pytorch中的分布式包torch.disruption让研究人员和使用者能够轻松地将他们的DNN训练部署到集群上。

四、Spark分布式机器学习

  1. Spark MLlib
    Spark核心由一组功能强大的、高级别的库组成,包括SparkSQL、Spark Sreaming、MLlib及GraphX。
    Spark程序一般由Scala语言编写,想用Python的话可以用PySpark库。
    【分布式机器学习】基本知识_第1张图片
  2. 基于Scala:Spark MLlib机器学习
  3. 基于Python:
    Spark/PySpark有MLlib和ML包,区别在于,MLlib包是基于RDD的,ML包是基于DataFrame的(DataFrame属于DataSet)。RDD和DataFrame事两种分布式数据集,DataSet底端是RDD,但是DataSet对RDD进行了更深一层的优化。
    pyspark学习:
    PySpark MLlib
    分布式机器学习原理及实战(Pyspark)
    Spark编程基础(Python版) 厦门大学 林子雨(PPT)
    一个视频学会PySpark-附源码

五、Spark+Pytorch

这个我看也有人用,后面再研究,先马一个视频教程:https://edu.csdn.net/course/play/29974/435059

六、Spark分布式深度学习

  1. 可行性
    首先,要明确spark是用来做什么的,它是一种分布式计算框架,代表的是算力。深度学习和数据分析是数据建模和数据处理,可以用深度学习来进行数据分析。简单来说就是,Spark是计算方式,深度学习是建模,可以采用Spark这种计算方式,但是目前主流的tf、torch并没有集成。
    Spark中的神经网络目前只有多层感知机分类这一个算法。目前来看,Spark最适用的其实是数据处理,清洗等任务,能够在部分领域里取代传统数据库,这本质是因为其选择了MapReduce的机制实现分布式化,每次通信都要等待同步,而目前主流的专用分布式dl/ml框架都是采用参数服务器的形式,允许不同worker之间的异步执行,因此将Spark与主流的框架深度结合不会是一件容易的事情。
  2. 存在的问题
    深度学习以神经网络结构为代表,layers之间是串行结构,中间显然不适合Spark做分布式计算,最多某些步骤采用并行加速。由此来看,深度学习并不适合分布式结构。(并不是说DL不适合分布式计算,而是说DL不适合在Spark这样的cluster上运行,因为DL的运算一般需要多次迭代一些小运算,比如算两组参数的点积再取其sigmoid函数,这种运算方式使得DL在GPU上会有更好的表现)
    使用Spark的优点在于可以更快更有效的调整训练参数,还可以并行运算多个网络架构。也就是说Spark起的是个微调的作用,神经网络都是用tensorflow实现的。
    总而言之,目前spark在深度学习中大多起辅助作用,很大程度上依赖其他框架。但是谁也说不好将来会怎样,毕竟spark刚发布时根本写不了神经网络算法,而现在已经有很多实现方法了。
  3. Spark可结合的深度学习框架
    (1)如1中所说,MLlib中有一个多层感知机的model,实际上就是最基本的DNN,但是在参数很大的情况下,去应用这个模型不太合适。
    (2)Intel开源了基于Apache Spark的分布式深度学习框架BigDL,对于直接支持已有Spark集群的深度学习开源库,BigDL是唯一的一个框架。
    (3)有caffeonspark和tensorflowonspark可以直接进行深度学习的application。在tensorflow与spark的集成上,Yahoo开源了他们的框架TensorFlowOnSpark,支持train和inference,可以高效的利用已有的spark集群。
    (4)虽然Spark貌似不支持深度学习,但是可以通过DeepLearning4j与Spark整合来支持,参考代码:https://github.com/sunbow1/SparkMLlibDeepLearn
  4. 目前已实现的项目
    当然也有大神改造为并行的网络结构,部署在Spark分布式计算框架上。
    (1)把Spark和DL结合起来的项目不少,基本都是基于Parameter Server架构,worker算了gradient然后传到driver去aggregate,Deeplearning4j on Spark(不过感觉没啥人用,只是玩儿玩儿)。
    (2)在databricks上用spark+tensorflow训练MNIST数据:Deep Learning with Spark and TensorFlow
    databrick也有一个spark-deep-learning项目,但主要是应用于大规模的inference。
    (3)社区maillist里mllib的核心开发者也在讨论在spark中集成一些ml/dl框架spark-dev-mail。
    (4)Spark给出了一套官方解决方案Spark新愿景:让深度学习变得更加易于使用 传送门: databricks/spark-deep-learning
  5. 再不济可以参考书籍《Spark深度学习指南》,在Spark平台从头搭建神经网络。

你可能感兴趣的:(分布式机器学习,scala,big,data,人工智能)