Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark-阿里云开发者社区

开发者社区> 桃子红了呐> 正文

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

简介:
+关注继续查看

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,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Zuul整合Swagger,使用ZuulFilter解决下游服务context-path
问题起因:使用Zuul网关服务,需要整合下游系统的swagger,但是下游服务存在context-path配置,无法正确跳转,最后使用ZuulFilter解决。 1.Zuul整合下游swagger 首先介绍一下Zuul如何整合下游服务swagger,很好理解,就是通过Zuul的swagger地址,实现将下游服务的swagger都放入同一个页面内,流转图如下: 1.
340 0
干货|如何让机器向“时尚达人”学习?阿里做了个“实用”的图像数据集
阿里资深算法专家雷音带领的团队,有个非常特别的名字,叫做“图像与美”。雷音希望,未来AI产品对衣服的理解不只限于照片和文字,还可以理解衣服本身,进而理解时尚穿搭之道、理解流行风向。
908 0
Go语言学习笔记(六)net & net/http
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 net import "net" net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。
663 0
使用Keras进行深度学习:(三)使用text-CNN处理自然语言(下)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习、深度学习的知识! 在上一篇文章中,已经介绍了Keras对文本数据进行预处理的一般步骤。
1769 0
看深度学习框架排名第一的TensorFlow如何进行时序预测!
2017年深度学习框架关注度排名tensorflow以绝对的优势占领榜首,本文通过一个小例子介绍了TensorFlow在时序预测上的应用。
1512 0
阿里深度学习框架开源了!无缝对接TensorFlow、PyTorch
阿里巴巴将于12月开源其内部深度学习框架 X-DeepLearning,面向广告、推荐、搜索等高维稀疏数据场景,以填补TensorFlow、PyTorch等现有开源深度学习框架主要面向图像、语音等低维稠密数据的不足。
2611 0
HttpModule和HttpHandler学习
http://zzk.cnblogs.com/s?w=httpModule&p=2http://www.cnblogs.com/stwyhm/archive/2006/08/09/471729.htmlhttp://www.
632 0
4269
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载