在这个数据爆炸的时代,产生的数据量不断地在攀升,从GB,TB,PB到ZB。挖掘其中数据的价值也是企业在不断地追求的终极目标。但是要想对海量的数据进行挖掘,首先要考虑的就是海量数据的存储问题,比如TB量级的数据。
谈到数据的存储,则不得不说的是磁盘的数据读写速度问题。早在上个世纪90年代初期,普通硬盘的可以存储的容量大概是1G左右,硬盘的读取速度大概为4.4MB/s.读取一张硬盘大概需要5分钟时间,但是如今硬盘的容量都在1TB左右了,相比扩展了近千倍。但是硬盘的读取速度大概是100MB/s。读完一个硬盘所需要的时间大概是2.5个小时。所以如果是基于TB级别的数据进行分析的话,光硬盘读取完数据都要好几天了,更谈不上计算分析了。那么该如何处理大数据的存储以及计算分析呢?
一个很简单的减少数据读写时间的方法就是同时从多个硬盘上读写数据。比如,如果我们有100个硬盘,每个硬盘存储1%的数据 ,并行读取,那么不到两分钟就可以完成之前需要2.5小时的数据读写任务了。这就是大数据中的分布式存储的模型。当然实现分布式存储还需要解决很多问题,比如硬件故障的问题,使用多台主机进行分布式存储时,若主机故障,会出现数据丢失的问题,所以有了副本机制:系统中保存数据的副本。一旦有系统发生故障,就可以使用另外的副本进行替换(著名的RAID冗余磁盘阵列就是按这个原理实现的)。其次比如一个很大的文件如何进行拆分存储,读取拆分以后的文件如何进行校验都是要考虑的问题。比如我们使用Hadoop中的HDFS也面临这个问题,只是框架给我们实现了这些问题的解决办法,且在底层进行了封装,使得开发者在开发中不用考虑这些问题。
同样假如有一个10TB的文件,我们要统计其中某个关键字的出现次数,传统的做法是遍历整个文件,然后统计出关键字的出现次数,这样效率会特别特别低。基于分布式存储以后,数据被分布式存储在不同的服务器上,那么我们就可以使用分布式计算框架(比如MapReduce,Spark等)来进行并行计算(或者说是分布式计算),即:每个服务器上分别统计自己存储的数据中关键字出现的次数,最后进行一次汇总,那么假如数据分布在100台服务器上,即同时100台服务器同时进行关键字统计工作,效率一下子可以提高几十倍。
PaddlePaddle是百度推出的开源分布式深度学习框架,致力于让更多中国企业和开发者方便地完成深度学习应用,该框架提供了丰富的API,可以轻松地完成神经网络配置,模型训练等任务。
• 优点:
提供工业级中文 NLP 算法和模型库,涵盖文本分类、序列标注、语义匹配等多种NLP任务的解决方案,拥有当前业内效果最好的中文语义表示模型和基于用户大数据训练的应用任务模型,且同类型算法模型可灵活插拔。
基于百度海量规模的业务场景实践, 同时支持稠密参数和稀疏参数场景的超大规模深度学习并行训练,支持千亿规模参数、数百个节点的高效并行训练。
提供端到端的全流程部署方案,覆盖多硬件、多引擎、多语言,预测速度超过其他主流实现。同时,还提供了模型压缩、加密等工具。
提供丰富的配套工具组件,在自动组网、强化学习、预训练模型、弹性训练等方面加速深度学习项目落地。
中文文档齐全,方便本土开发。
• 缺点:
开发语言单一,目前仅支持Python语言开发。
• 用途:
生成对抗网络
线性回归
数字识别
图像分类
情感分析
机器翻译
个性化推荐
词向量
语义角色标注
…
• 案例:
高尔夫球场的遥感检测:http://ai.baidu.com/support/news?action=detail&id=976
• Github地址:https://github.com/PaddlePaddle/Paddle
Deeplearning4j是基于JVM、聚焦行业应用且提供商业支持的分布式深度学习框架,能在合理的时间内解决各类涉及大量数据的问题。Deeplearning4j与Kafka、Hadoop和Spark集成,可使用任意数量的GPU或CPU运行。
• 优点:
支持Java、Scala和Python等多种语言开发。
用多GPU运行图像处理任务时的性能可媲美Caffe,优于TensorFlow和Torch。
可通过调整JVM的堆空间、垃圾回收算法、内存管理以及Deeplearning4j的ETL数据加工管道来优化Deeplearning4j的性能。
跨平台性强,可在Linux服务器、Windows和OSX桌面、安卓手机上运行,还可通过嵌入式Java在物联网的低内存传感器上运行。
提供多样化组件和工具,可快速搭建深度学习项目,DeepLearning4J的组件包括:
DataVec进行数据摄取,将数据标准化并转换为特征向量。
DeepLearning4J提供配置神经网络、构建计算图的工具。
Keras Model Import(Keras模型导入)帮助用户将已训练的Python和Keras模型导入DeepLearning4J和Java环境。
ND4J让Java能够访问所需的原生库,使用多个CPU或GPU快速处理矩阵数据。
DL4J-Examples(DL4J示例)包含图像、时间序列及文本数据分类与聚类的工作示例。
ScalNet是受Keras启发而为Deeplearning4j开发的Scala语言包装。它通过Spark在多个GPU上运行。
RL4J用于在JVM上实现深度Q学习、A3C及其他强化学习算法。
Arbiter帮助搜索超参数空间,寻找最理想的神经网络配置。
• 缺点:
内存占用高,需要不断调整JVM已达到最优效果。
• 用途:
语音识别
情感分析
欺诈检测
推荐引擎
相片聚类
图像搜索
命名实体识别
…
• 案例:
官方示例:https://github.com/deeplearning4j/dl4j-examples
• Github地址:https://github.com/deeplearning4j/deeplearning4j
Mahout是一个分布式线性计算框架,提供一些可扩展的机器学习领域经典算法的实现,旨在让数学家、统计学家和数据科学家快速实现自己的算法。
• 优点:
包括聚类、分类、推荐过滤、频繁子项挖掘等诸多实现。
基于Hadoop开发,可轻松实现分布式计算。
快速高效实现数据挖掘算法,解决了并行挖掘的问题 。
• 缺点:
实现的算法单一,仅适用于推荐,分类,聚类等单一场景。
对训练的数据格式有要求,定制化数据存在一定难度。
• 用途:
推荐系统
聚类
分类
• 案例:
官方示例:https://github.com/apache/mahout/tree/master/examples
• Github地址:https://github.com/apache/mahout
MLlib(Machine Learnig lib)是Spark对常用的机器学习算法的实现库,同时包括相关的测试和数据生成器。
MLlib是MLBase一部分,其中MLBase分为四部分:MLlib、MLI、ML Optimizer和MLRuntime。
MLlib目前支持4种常见的机器学习问题: 分类、回归、聚类和协同过滤。
• 优点:
基于Spark开发,可轻松实现分布式计算。
拥有庞大的Java生态链支持,文档丰富,业界有许多成功的方案可借鉴。
Spark基于内存的计算模型适合迭代式计算,在内存中完成多个步骤的计算,只有必要时才会操作磁盘和网络,减少I/O和CPU资源的占用。
具有出色而高效的Akka和Netty通信系统,通信效率高。
• 缺点:
开发语言单一,基于Scala语言开发的多范式编程语言需要一定的学习成本。
过度封装,若要修改某个实现环节,需修改源码重新编译。例如Spark内部使用计算两个向量的距离是欧式距离,若修改为余弦或马氏距离,需要修改源码并重新编译。
• 用途:
推荐系统
情感分析
分类
聚类
回归
…
• 案例:
官方示例:http://spark.apache.org/examples.html
• 项目地址:http://spark.apache.org/docs/1.1.0/mllib-guide.html
Ray是针对机器学习领域开发的一种新的分布式计算框架,该框架基于Python的机器学习和深度学习工作负载能够实时执行,并具有类似消息传递接口(MPI)的性能和细粒度。
• 优点:
海量任务调度能力。
毫秒级别的延迟。
异构任务的支持。
任务拓扑图动态修改的能力。
• 缺点:
API层以上的部分还比较薄弱,Core模块核心逻辑估需要时间打磨。
国内目前除了蚂蚁金服和RISELab有针对性的合作以外,关注程度还很低,没有实际的应用实例看到,整体来说还处于比较早期的框架构建阶段。
• 用途:
增强学习
分类
聚类
图像识别
推荐系统
文本翻译
…
• 案例:
官方示例:https://github.com/ray-project/ray/tree/master/examples
• Github地址:https://github.com/ray-project/ray
Spark是一个类似于MapReduce的分布式计算框架,其核心是弹性分布式数据集,提供了比MapReduce更丰富的模型,可以在快速在内存中对数据集进行多次迭代,以支持复杂的数据挖掘算法和图形计算算法。Spark Streaming[6]是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力。
• 优点:
能运行在100+的结点上,并达到秒级延迟。
使用基于内存的Spark作为执行引擎,具有高效和容错的特性。
能集成Spark的批处理和交互查询。
为实现复杂的算法提供和批处理类似的简单接口。
• 缺点:
开发语言单一,基于Scala语言开发的多范式编程语言需要一定的学习成本。
过度封装,若要修改某个实现环节,需修改源码重新编译。例如Spark内部使用计算两个向量的距离是欧式距离,若修改为余弦或马氏距离,需要修改源码并重新编译。
• 用途:
推荐系统
用户画像
日志分析
舆情监控
报表统计
…
• 案例:
官方示例:http://spark.apache.org/examples.html
• 项目地址:http://spark.apache.org/streaming
Horovod是Uber开源的又一个深度学习分布式计算框架,它的发展吸取了Facebook「一小时训练 ImageNet 论文」与百度Ring Allreduce的优点,可为用户实现分布式训练提供帮助。
• 优点:
支持通过用于高性能并行计算的低层次接口 – 消息传递接口 (MPI) 进行分布式模型训练。有了MPI,就可以利用分布式 Kubernetes 集群来训练 TensorFlow 和 PyTorch 模型。
分布式 TensorFlow 的参数服务器模型(parameter server paradigm)通常需要对大量样板代码进行认真的实现,但是 Horovod 仅需要几行。
• 缺点:
国内文档少,需要一定的学习成本。
开发语言单一,目前仅支持Python语言开发。
• 用途:
分类
聚类
文本标注
推荐系统
图像识别
…
• 案例:
官方示例:https://github.com/horovod/horovod/tree/master/examples
• Github地址:https://github.com/uber/horovod
BigDL是一种基于Apache Spark的分布式深度学习框架。它可以无缝的直接运行在现有的Apache Spark和Hadoop集群之上。BigDL的设计吸取了Torch框架许多方面的知识,为深度学习提供了全面的支持,包括数值计算和高级神经网络,借助现有的Spark集群来运行深度学习计算,并简化存储在Hadoop中的大数据集的数据加载过程。
• 优点:
丰富的深度学习支持。模拟Torch之后,BigDL为深入学习提供全面支持,包括数字计算(通过Tensor)和高级神经网络 ; 此外,可以使用BigDL将预先训练好的Caffe或Torch模型加载到Spark程序中。
极高的性能。为了实现高性能,BigDL在每个Spark任务中使用英特尔MKL和多线程编程。因此,在单节点Xeon(即与主流GPU 相当)上,它比开箱即用开源Caffe,Torch或TensorFlow快。
有效地横向扩展。BigDL可以通过利用Apache Spark,以及高效实施同步SGD和全面减少Spark的通信,从而有效地扩展到"大数据规模"上的数据分析。
• 缺点:
对机器要求高 ,JDK7上运行性能差;在CentOS 6和7上,要将最大用户进程增加到更大的值(例如514585),否则,可能会出现"无法创建新的本机线程"异常。
训练和验证的数据会加载到内存,挤占内存。
• 用途:
直接在Hadoop/Spark框架下使用深度学习进行大数据分析(即将数据存储在HDFS、HBase、Hive等数据库上)。
在Spark程序中/工作流中加入深度学习功能。
利用现有的 Hadoop/Spark 集群来运行深度学习程序,然后将代码与其他的应用场景进行动态共享,例如ETL(Extract、Transform、Load,即数据抽取)、数据仓库(data warehouse)、功能引擎、经典机器学习、图表分析等。
• 案例:
官方示例:https://bigdl-project.github.io/0.8.0/#ScalaUserGuide/examples/
• GitHub地址:https://github.com/intel-analytics/BigDL
Petastorm是一个由Uber ATG开发的开源数据访问库(深度学习分布训练库)。这个库可以直接基于数 TB Parquet 格式的数据集进行单机或分布式训练和深度学习模型评估。Petastorm支持基于Python的机器学习框架,如 Tensorflow、Pytorch 和 PySpark,也可以直接用在Python代码中。
• 优点:
通过单数据模式定义进行数据的编码和解码。
提供 Tensorflow 和 PyTorch 的适配器。
将 Apache Spark 作为分布式集群计算框架来生成数据集。
支持 Apache Parquet 格式的数据集的单机或分布式训练、验证。
• 缺点:
兼容的框架有限。
国内参考文档较少,需要一定的学习成本。
• 用途:
单机或分布式训练和深度学习模型评估与验证。
作为深度学习分布训练库。
• 案例:
官方示例: https://github.com/uber/petastorm/tree/master/examples
• Github地址:https://github.com/uber/petastorm
TensorFlowOnSpark是为Apache Hadoop和Apache Spark集群带来可扩展的深度学习框架。 通过结合深入学习框架TensorFlow和大数据框架Apache Spark 、Apache Hadoop的显着特征,TensorFlowOnSpark能够在GPU和CPU服务器集群上实现分布式深度学习计算。
• 优点:
轻松迁移所有现有的TensorFlow程序,小于10行代码更改。
支持所有TensorFlow功能:同步/异步训练,模型/数据并行,推理和TensorBoard。
服务器到服务器的直接通信能实现更快的学习。
允许数据集在HDFS和由Spark推动的其他来源或由TensorFlow拖动。
轻松集成现有的数据处理流水线和机器学习算法(例如,MLlib,CaffeOnSpark)。
轻松部署在云或内部部署:CPU和GPU,以太网和Infiniband。
TensorFlowOnSpark基于TensorFlow实现,而TensorFlow有着一套完善的教程,内容丰富。
• 缺点:
开源时间不长,未得到充分的验证。
• 用途:
词向量
文本标注
情感分析
推荐系统
图像识别
人脸检测
分类
聚类
…
• 案例:
官方示例:https://github.com/yahoo/TensorFlowOnSpark/tree/master/examples
• Github 地址:https://github.com/yahoo/TensorFlowOnSpark
关注我的技术公众号《漫谈人工智能》,每天推送优质文章