Spark新愿景:让深度学习变得更加易于使用

转自:https://www.jianshu.com/p/07e8200b7cea

前言

Spark成功的实现了当年的承诺,让数据处理变得更容易,现在,雄心勃勃的Databricks公司展开了一个新的愿景:让深度学习变得更容易。 当然牛好吹,也是要做些实际行动的,所有便有了spark-deep-learning项目。这件事情已经有很多人尝试做了,但显然太浅了,DB公司则做的更深入些。

原理

要做深度学习,肯定不能离开TensorFlow, MXNet之类的。 spark-deep-learning也是如此,尝试和Tensorflow进行整合。那么如何进行整合呢? 我们知道Tensorflow其实是C++开发的,平时训练啥的我们主要使用python API。Spark要和TensorFlow 进行整合,那么有三种方式:

  1. 走Tensorflow的Java API
  2. 走Tensorflow的Python API
  3. 通过JNI直接走Tensorflow的C++ API

因为Spark自己也可以使用Python,虽然有性能的上的损耗(据说>30%),但是终究是能跑起来。实际上Spark采用了2和3的结合。 第二条容易理解,第三条则主要依赖于另外一个项目tensorframes。这个项目主要是实现tensorflow和spark的互相调用。简单的来说,在spark的dataframe运算可以通过JNI调用tensorflow来完成,反之Spark的dataframe也可以直接喂给tensorflow(也就是tensorflow可以直接输入dataframe了)。有了这个之后,spark-deep-learning 则无需太多关注如何进行两个系统完成交互的功能,而是专注于完成对算法的集成了。

为了给出一个直观的感受,我们看个示例代码(来源于官方):

import tensorflow as tf
import tensorframes as tfs from pyspark.sql import Row data = [Row(x=float(x)) for x in range(10)] df = sqlContext.createDataFrame(data) with tf.Graph().as_default() as g: # The TensorFlow placeholder that corresponds to column 'x'. # The shape of the placeholder is automatically inferred from the DataFrame. x = tfs.block(df, "x") # The output that adds 3 to x z = tf.add(x, 3, name='z') # The resulting dataframe df2 = tfs.map_blocks(z, df) # The transform is lazy as for most DataFrame operations. This will trigger it: df2.collect() 

在这里,通过tensorframes 我可以对spark dataframe里列使用tensorflow来进行处理。

    x = tfs.block(df, "x")

相当于

x =  tf.placeholder(shape=..., dtype=..., name='x')

程序自动从df可以知道数据类型。

    df2 = tfs.map_blocks(z, df)

则相当于将df 作为tf的feed_dict数据。最终f2.collect 触发实际的计算。

spark-deep-learning 提出了三个新的东西:

  1. 首先是,Spark的数据终于可以用DF的方式无缝的喂给Tensorflow/Keras了,而且对Tensorflow/Keras的适配了一套Mllib的库,方便以Spark Mllib的方式进行编程。当然,为了使得原先是Tensorflow/Keras的用户感觉爽,如果你使用Python API你也可以完全使用Keras/Tensorflow 的Style来完成代码的编写。
  2. 其次是多个TF模型同时训练,给的一样的数据,但是不同的参数,从而充分利用分布式并行计算来选择最好的模型。
  3. 另外是模型训练好后如何集成到Spark里进行使用呢?没错,SQL UDF函数,你可以很方便的把一个训练好的模型注册成UDF函数,从而实际完成了模型的部署。

方便理解,我们也简单看看一些代码:

from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.ml import Pipeline
from sparkdl import DeepImageFeaturizer from sparkdl import readImages from pyspark.sql.functions import lit //读取图片,设置为1分类 tulips_df = readImages(img_dir + "/tulips").withColumn("label", lit(1)) //读取图片,设置为2分类 daisy_df = readImages(img_dir + "/daisy").withColumn("label", lit(0)) //构成训练集 train_df = tulips_train.unionAll(daisy_train) //使用已经配置好的模型(InceptionV3) featurizer = DeepImageFeaturizer(inputCol="image", outputCol="features", modelName="InceptionV3") //接一个分类器,也就是传说中的迁移学习 lr = LogisticRegression(maxIter=20, regParam=0.05, elasticNetParam=0.3, labelCol="label") //组装下 p = Pipeline(stages=[featurizer, lr]) //训练,和Mllib保持了一致 model = p.fit(image_df) # train_images_df is a dataset of images (SpImage) and labels //预测 df = model.transform(train_df.limit(10)).select("image", "probability", "uri", "label") predictionAndLabels = df.select("prediction", "label") 

整个模型一气呵成。

对于上面的例子比较特殊,DeepImageFeaturizer那块其实因为是使用别人已经训练好的参数,所以本身是分布式的,直接透过tensorrames 调用tensorflow把输入的图片转换为经过InceptionV3处理后的向量,然后到了LogisticRegression,因为这个算法本身是Mllib里的,所以也是分布式的。

如何开发

spark-deep-learning 还处于早期,很多东西还不太完善。
为了方便看源码以及编写实际的代码,你可以clone最新的代码,然后使用intellij idea 可以很方便的导入进来。导入进来后,添加python framework的支持,然后把根目录下的python目录作为source 目录,接着进入project structured 添加pyspark 的zip(一般放在spark home 里的lib目录),这样你在spark-deep-learning里就可以直接做开发了。

spark-deep-learning使用的是spark 2.1.1 以及python 2.7 ,不过我的环境是spark 2.2.0, python 3.6。 所以你需要在build.sbt里第一行修改为

val sparkVer = sys.props.getOrElse("spark.version", "2.2.0")

同时保证你的python为2.7版本(你可以通过一些python的管理工具来完成版本的切换),然后进行编译:

build/sbt assembly

编译的过程中会跑单元测试,在spark 2.2.0会报错,原因是udf函数不能包含“-”,所以你找到对应的几个测试用例,修改里面的udf函数名称即可。

编译好后,你就可以直接写个脚本,比如:

import os
from pyspark import *
from sparkdl import readImages os.environ['PYSPARK_PYTHON'] = '/Users/allwefantasy/python2.7/tensorflow/bin/python' sc = SparkContext.getOrCreate() image_df = readImages("/Users/allwefantasy/resources/images/flower_photos/daisy/") image_df.show() 

比如我这里简单的读取图片文件,并且显示出来。你可以直接点击右键运行,也可以通过spark-submit运行:

./bin/spark-submit --driver-memory 8g
--py-files spark-deep-learning-assembly-0.1.0-spark2.2.jar  \
--jars spark-deep-learning-assembly-0.1.0-spark2.2.jar  \
--master local[*]  spark-deep-learning/python/tests/Test.py

因为比较消耗内存,这里可以通过driver-memory 设置spark submit 内存。

如果你导入项目,想看python相关的源码,但是会提示找不到pyspark相关的库,你可以使用:

pip install pyspark

这样代码提示的问题就被解决了。

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/8318141.html,如需转载请自行联系原作者

Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark...相关推荐

  1. 地平线与大陆集团合资公司落户上海;爱立信全球发布新使命与新愿景;复星创富投资比昂芯科技 | 全球TMT...

    国内市场 地平线与科技公司大陆集团正式签订合资合同,双方将共同成立一家合资公司,专注于提供高级辅助驾驶和自动驾驶软硬件整体解决方案.合资公司将由大陆集团控股,员工规模预计近200人.在活动现场,合资公 ...

  2. 李飞飞新研究:基于深度学习和视觉化语言来了解不同物体间的关系

    来源:凤凰科技 概要:最近她所在的实验室正在做一项新研究,基于深度学习和视觉化语言模式了解不同物体之间的关系. 2017未来科学大奖颁奖典礼暨未来论坛年会28.29日在京举办,斯坦福大学终身教授.谷歌 ...

  3. 神策 2020 数据驱动用户大会:新愿景 + 新定位 + 新舰队正式亮相!

    2020 年 10 月 13 日,神策数据 2020 数据驱动用户大会在北京香格里拉酒店成功举行,大会以"数字化·正当潮"为主题,旨在聚焦疫情之下国内各大企业转型线上的数字化&qu ...

  4. 神策2020数据驱动用户大会:新愿景 + 新定位 + 新舰队正式亮相!

    "年度重磅活动,欢迎报名参与,超百家媒体全网扩散传播:[产业图谱+行业盘点]你是"中国数据智能产业最具商业合作价值企业"吗? 点击文末"阅读原文"链接 ...

  5. 干货 | 台大“一天搞懂深度学习”课程PPT(下载方式见文末!!)

    微信公众号 关键字全网搜索最新排名 [机器学习算法]:排名第一 [机器学习]:排名第一 [Python]:排名第三 [算法]:排名第四 Deep Learing Tutorial 本篇文章我们给出了一 ...

  6. 数据保护新愿景:欧盟GDPR十个误解与争议

    来源:腾讯研究院 作者:王融 本文共11000字,建议阅读10+分钟. 本文聚焦10个最易被误解和最具有争议性的问题,展现更为全面.客观的视角,以期消除刻板印象和固有偏见,尽力还原GDPR的真实面貌. ...

  7. 前方高能!AI 大牛 LeCun 设想下一个新前沿:摈弃深度学习的所有概率技巧,改而掌握不断转变的能量值...

    来源:云头条 据深度学习界的领军人物Yann LeCun声称,AI的下一个发展阶段可能是摈弃深度学习的所有概率技巧,改而掌握不断转变的能量值. 据说工程师(以及一些科学家,但以工程师为主)早在坐到板凳 ...

  8. 莱姆智慧城市新愿景 用匠人精神助飞智能电网

    "互联网+"的风口下,新电改方案如期而至,智能电网必将开启能源与互联网有机结合的大门,智能电网布局也成为了国家抢占未来低碳经济制高点的重要战略措施. 2016年7月1日,被誉为中国 ...

  9. 以太坊基金会新愿景:不care价格不越界,押注开发者社区

    以太坊基金会成立的时候,以太坊基金会就是以太坊,基金会里的人就是负责构建以太坊的人,然而现在似乎已经和过去不一样了.--以太坊基金会执行董事宫田亚弥(Aya Miyaguchi) 文章来源:coind ...

最新文章

  1. 中国书法的造型元素与原理 刘彦湖
  2. Android中通过Socket直接与RILD进行通信
  3. python制表符什么意思_python中制表符是什么意思
  4. Spring - shortcuts
  5. DispatcherCore ,一个WPF异步操作常用功能库
  6. c++编码风格指南_100%正确编码样式指南
  7. LeetCode 316. 去除重复字母 / 1081. 不同字符的最小子序列(单调栈)
  8. uni app input添加获取验证码按钮_uni-app跨平台框架对微信小程序的无障碍支持探索...
  9. SQL视图学习(入门概念理解)
  10. (43)FPGA时序逻辑与组合逻辑(时序逻辑)
  11. SAP License:家装ERP
  12. FileStream对象的使用
  13. asp.net获取ip地址的方法
  14. 技术解读Rainbond ServiceMesh微服务架构_开源PaaS Rainbond
  15. NGUI学习笔记汇总
  16. c语言大华面试题,大华股份的一道笔试题 C/C++
  17. 什么是soft matting方法_建筑师学“交互”有什么意义?零基础如何展开?
  18. 吉他铺怎么看(很全)
  19. php的md5(),php MD5加密详解
  20. Word控件Spire.Doc 【图像形状】教程(4) 用 C# 中的文本替换 Word 中的图像

热门文章

  1. 2021年,AI能否进军加密领域?
  2. 下一代 MES,智能制造的骨架
  3. SAP PLM进阶1 – 价值亮点
  4. SAP IQ02 将A序列号改成B序列号后,无修改记录?
  5. 深度学习-我们为什么需要BN(Batch Normalization)?
  6. Python 之 Pandas (四)处理丢失数据
  7. Point-to Analysis指针分析(1)
  8. “厌氧动物”出现,科学家不清楚代谢方式,或颠覆对生命的认知
  9. 专访王田苗:机器人是“刚需”,市场正处于逆周期增长
  10. 收藏!机器学习算法分类图谱及其优缺点综合分析