当Spark遇上TensorFlow分布式深度学习框架原理和实践

1.spark的核心抽象:RDD

为什么要做RDD这样的抽象呢?主要是因为它的一致性、高效并行、容错机制,RDD屏蔽了分布式的复杂性,使开发程序时简单如写单机程序。

RDD也提供了一些操作,如transform和action,通过对RDD操作业务的封装以及计算逻辑,我们就会形成一个大的DAG计算图(参考下图右)。
在这里插入图片描述
2.spark的大数据生态:

这部分是讲spark的数据生态,包括它支持的组件库、部署环境和数据来源。
在这里插入图片描述
3.Spark SQL和Spark Streaming:

我们简要介绍一下这两个比较重要的组件,首先是spark sql,它的典型应用场景是OLAP多维分析,它提供了一个DataFrame抽象接口,等价于RDD,如下图所示。
在这里插入图片描述
Spark Streaming是spark的一个实时处理组件,它的典型应用场景是实时特征处理,它提供了一个Dstreams抽象接口,直观上理解Dstreams就是一个持续的RDD,如下图。
在这里插入图片描述
四.Deep Learning概述

下面,我们一起来了解关于Deep Learning的相关内容。

1.Deep Learning模型:

第一个模型是非常经典的多层感知器模型(MLP)。首次这个模型有一个输入层,在输入层后面有两个隐藏层,最后是输出层。这个模型的特点是全连接,在最后输出之前有一个Softmax函数,它的作用是把最终的权值转换为最直观的概率。理论上来讲,MLP这种带有隐藏层的神经网络可以拟合一切的函数,但它的计算量很大,所以传统的MLP模型并不适合去更深层次地加深网络结构。
在这里插入图片描述
真正把神经网络推向更深层次网络结构模型的是CNN卷积神经网络,它通常应用在图像分类等领域,这里有一个概念—感受野,所谓感受野就是空间局部性的考虑,它认为图像上比较接近的图像领域具有更强的相关性,图像上更远的像素之间相关性更弱,基于感受野的考虑,它把全连接层替换为卷积操作。

卷积操作的特点是可以将局部特征抽象化,另外大幅减少计算量,以便加深神经网络,丰富语义表达。
在这里插入图片描述
2.Tensorflow模型建模与训练:

介绍完深度学习模型后,回到我们的tensorflow部分,首先我们了解一下tensorflow是怎样来做模型建模的。如下图所示,X是Tensor,W和b是Variable,Matmul、Add、ReLU都是Operator,最后组成一个神经网络图Graph。
在这里插入图片描述
其次,我们来了解一下tensorflow训练的核心问题—拟合f(),主要通过反向梯度计算来拟合f(),反向梯度计算的目的是计算梯度和更新参数,这里涉及到Loss函数和最小化Loss。那么怎么去计算梯度呢?主要通过链式求导(看下图右)。一次链式求导只是一次的前向和后向的计算结果,在训练流程当中,我们通常批量计算,所以会涉及batch_size和epoch。

在这里插入图片描述
最后我们结合一个代码事例,回顾一下前面所讲的知识点:

在这里插入图片描述
我们以多层感知器模型MLP为例,首先需要创建一个模型,模型定义就是两个隐藏层加最后的输出层,定义好模型之后,我们需要定义损失函数,在这里它是对你的标签和预测输出进行的交叉熵的损失定义,然后选择一个optimizer的优化器来做优化训练,

在训练开始之前,你需要去调一个sess.run(init)对权值做一个随机初始化的过程,初始化之后,进入到我们的训练阶段。

3.Tensorflow分布式训练机制:

刚才介绍的是tensorflow怎么去定义模型以及怎么去做反向计算,那么,在大规模数据场景下,它又是怎样工作的?

在这里插入图片描述
Tensorflow本身提供了一些并行机制,第一个是模型并行机制,就是基于图去拆分(如上图左下),它会把一张大的图拆分成很多部分,每个部分都会在很多设备上去运行、计算。通常是针对一个节点无法存下整个模型的情况下,去对图进行拆分。

更多场景下我们的数据量会比较大,这时候就采用数据并行机制,在这种机制下tensorflow有两个角色,一个是参数服务器,负责参数的存储和交换更新,一个是工作节点,负责具体的模型计算。每个工作节点会负责它领域内的数据分片所对应模型参数的更新计算,同时它们又会向参数服务器去传递它所计算的梯度,由参数服务器来汇总所有的梯度,再进一步反馈到所有节点,根据参数服务器合并参数的方式又分为同步更新和异步更新,这两种更新方式各有优缺点,异步更新可能会更快速地完成整个梯度计算,而对于同步更新来讲,它可以更快地进行一个收敛,选择哪种方式取决于实际的应用场景。

五.Deep Learning On Spark

经过刚才的介绍,我们知道spark是一个分布式的通用计算框架,而以tensorflow为代表的deep learning是一个分布式模型训练框架,它更多专注在梯度计算,那为什么要将两者整合呢?整合的意义在哪里?意义就是能实现更好的分布式训练和数据传输。

在这里插入图片描述
针对分布式训练的场景,雅虎开源了TensorflowOnSpark的开源框架,它主要实现tensorflow能够与spark相结合做分布式训练。同时也有其它的一些机制,例如,CaffeOnSpark、MMLSpark(CNTK)、PaddleOnSpark。

TensorflowOnSpark解决的核心问题是将spark作为分布式tensorflow的底层调动机制,通过spark executor去把tensorflow的进程调动起来,这样在进行tensorflow训练时就不需要手动地去组建网络。它也提供了一个API,通过调TFCluster.run这样一个API,可以快速获得tensorflow的一个分布式训练环境。

在这里插入图片描述

除此之外TensorflowOnSpark还提供了基于RDD的数据并行机制,如下图所示。这套机制非常方便地集成了spark已有的RDD处理机制,可以更好地跟spark sql或spark streaming去做相应的集成。

在这里插入图片描述
然后进入到另外一个方向,叫做spark-deep-learning,是由spark的创始公司—Data Bricks发起的,它主要的目标是提供一些high-level的API,把底层的模型进行组件化,同时它期望可以兼容底层深度式学习框架。
在这里插入图片描述
这里有个“Transfer Learning as a Pipeline”的例子供大家了解,如下图所示
在这里插入图片描述

TensorflowOnSpark Pipeline开发了两个API,一个是TFEstimator,另一个是TFModel,提供了这两个之后,你可以直接把它们集成到spark-deep-learning pipeline里面,进行进一步的训练。

在这里插入图片描述

六.TensorflowOnSpark案例实践

最后一部分,我们来进行案例实践介绍,我们要解决的是一个图像分类问题,这里采用了一个kaggle dataset,叫做花朵识别,有5个类别,4000多张图片,包括郁金香、太阳花、蒲公英、玫瑰和雏菊这五种花。把这些数据预先存储于MongoDB中。我们的案例实践是一个分布式解决方案,包括分布式数据获取、分布式训练、分布式评估。

在这里插入图片描述

以下几张图片是代码示例,简单了解一下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值