随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片、音频、文本)进行大数据处理的业务场景越来越多。本文会介绍Spark如何与深度学习框架进行协同工作,在大数据的处理过程利用深度学习框架对非结构化数据进行处理。

Spark介绍

Spark是大规模数据处理的事实标准,包括机器学习的操作,希望把大数据处理和机器学习管道整合。

Spark使用函数式编程范式扩展了MapReduce模型以支持更多计算类型,可以涵盖广泛的工作流。Spark使用内存缓存来提升性能,因此进行交互式分析也足够快速(如同使用Python解释器,与集群进行交互一样)。缓存同时提升了迭代算法的性能,这使得Spark非常适合机器学习。

由于Spark库提供了Python、Scale、Java编写的API,以及内建的机器学习、流数据、图算法、类SQL查询等模块;Spark迅速成为当今最重要的分布式计算框架之一。与YARN结合,Spark提供了增量,而不是替代已存在的Hadoop集群。在最近的Spark版本中,Spark加入了对于K8s的支持,为Spark与AI能力的融合提供了更好的支持。

深度学习框架介绍

TensorFlow

TensorFlow最初是由Google机器智能研究部门的Google Brain团队开发,基于Google 2011年开发的深度学习基础架构DistBelief构建起来的。由于Google在深度学习领域的巨大影响力和强大的推广能力,TensorFlow一经推出就获得了极大的关注,并迅速成为如今用户最多的深度学习框架。

TensorFlow是一个非常基础的系统,因此也可以应用于众多领域。但由于过于复杂的系统设计,对读者来说,学习TensorFlow底层运行机制更是一个极其痛苦的过程。TensorFlow的接口一直处于快速迭代之中,并且没有很好地考虑向后兼容性,这导致现在许多开源代码已经无法在新版的TensorFlow上运行,同时也间接导致了许多基于TensorFlow的第三方框架出现BUG。

Keras

Keras 于2015年3月首次发布,拥有“为人类而不是机器设计的API”,得到Google的支持。它是一个用于快速构建深度学习原型的高层神经网络库,由纯Python编写而成,以TensorFlow、CNTK、Theano和MXNet为底层引擎,提供简单易用的API接口,能够极大地减少一般应用下用户的工作量。

严格意义上讲,Keras并不能称为一个深度学习框架,它更像一个深度学习接口,它构建于第三方框架之上。Keras的缺点很明显:过度封装导致丧失灵活性。Keras最初作为Theano的高级API而诞生,后来增加了TensorFlow和CNTK作为后端。学习Keras十分容易,但是很快就会遇到瓶颈,因为它缺少灵活性。另外,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正学习到深度学习的内容。

PyTorch

PyTorch于2016年10月发布,是一款专注于直接处理数组表达式的低级API。 前身是Torch(一个基于Lua语言的深度学习库)。Facebook人工智能研究院对PyTorch提供了强力支持。PyTorch支持动态计算图,为更具数学倾向的用户提供了更低层次的方法和更多的灵活性,目前许多新发表的论文都采用PyTorch作为论文实现的工具,成为学术研究的首选解决方案。

Caffe/Caffe2.0

Caffe的全称是Convolutional Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习框架,于2013年底由加州大学伯克利分校开发,核心语言是C++。它支持命令行、Python和MATLAB接口。Caffe的一个重要特色是可以在不编写代码的情况下训练和部署模型。如果您是C++熟练使用者,并对CUDA计算游刃有余,你可以考虑选择Caffe。

在Spark大数据处理中使用深度学习框架

在Spark程序中使用一个预训练过的模型,将其并行应用于大型数据集的数据处理。比如,给定一个可以识别图片的分类模型,其通过一个标准数据集(如ImageNet)训练过。可以在一个Spark程序中调用一个框架(如TensorFlow或Keras)进行分布式预测。通过在大数据处理过程中调用预训练模型可以直接对非结构化数据进行直接处理。

我们重点介绍在Spark程序中使用Keras+TensorFlow来进行模型推理。

使用深度学习处理图片的第一步,就是载入图片。Spark 2.3中新增的ImageSchema包含了载入数百万张图像到Spark DataFrame的实用函数,并且以分布式方式自动解码,容许可扩展地操作。

使用Spark's ImageSchema:

from pyspark.ml.image import ImageSchema
image_df = ImageSchema.readImages("/data/myimages")
image_df.show()

也可以利用Keras的图片处理库:

from keras.preprocessing import image
img = image.load_img("/data/myimages/daisy.jpg", target_size=(, ))

可以通过图片路径来构造Spark DataFrame:

def get_image_paths_df(sqlContext, dirpath, colName):
files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir(dirpath) if f.endswith('.jpg')]
return sqlContext.createDataFrame(files, StringType()).toDF(colName)

使用Keras接口加载预训练模型:

from keras.applications import InceptionV3
model = InceptionV3(weights="imagenet")
model.save('/tmp/model-full.h5')
model = load_model('/tmp/model-full.h5')

定义图片识别推理方法:

def iv3_predict(fpath):
model = load_model('/tmp/model-full.h5')
img = image.load_img(fpath, target_size=(, ))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=)
x = preprocess_input(x) preds = model.predict(x)
preds_decode_list = decode_predictions(preds, top=)
tmp = preds_decode_list[]
res_list = []
for x in tmp:
res = [x[], x[], float(x[])]
res_list.append(res)
return res_list

定义推理输入结果Schema:

def get_labels_type():
ele_type = StructType()
ele_type.add("class", data_type=StringType())
ele_type.add("description", data_type=StringType())
ele_type.add("probability", data_type=FloatType())
return ArrayType(ele_type)

将推理方法定义成Spark UDF:

spark.udf.register("iv3_predict", iv3_predict, returnType=get_labels_type())

载入图片定义为数据表:

df = get_image_paths_df(self.sql)
df.createOrReplaceTempView("_test_image_paths_df")

使用SQL语句对接图片进行处理:

df_images = spark.sql("select fpath, iv3_predict(fpath) as predicted_labels from _test_image_paths_df")
df_images.printSchema()
df_images.show(truncate=False)

结语

在大数据Spark引擎中使用深度学习框架加载预处理模型,来进行非结构数据处理有非常多的应用场景。但是由于深度学习框架目前比较多,模型与框架本身是深度耦合,在大数据环境中安装和部署深度学习框架软件及其依赖软件会非常复杂,同时不利于大数据集群的管理和维护,增加人力成本。

华为云DLI服务,采用大数据Serverless架构,用户不需要感知实际物理集群,同时DLI服务已经在大数据集群中内置了AI计算框架和底层依赖库(Keras/tensorflow/scikit-learn/pandas/numpy等)。DLI最新版本中已经支持k8s+Docker生态,并开放用户自定义Docker镜像能力,提供给用户来扩展自己的AI框架、模型、算法包。在Serverless基础上,为用户提供更加开放的自定义扩展能力。

点击关注,第一时间了解华为云新鲜技术~

Spark如何与深度学习框架协作,处理非结构化数据的更多相关文章

  1. 吴恩达《深度学习》-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-第一周 机器学习(ML)策略(1)(ML strategy(1))-课程笔记

    第一周 机器学习(ML)策略(1)(ML strategy(1)) 1.1 为什么是 ML 策略?(Why ML Strategy?) 希望在这门课程中,可以教给一些策略,一些分析机器学习问题的方法, ...

  2. spark 解析非结构化数据存储至hive的scala代码

    //提交代码包 // /usr/local/spark/bin$ spark-submit --class "getkv" /data/chun/sparktes.jar impo ...

  3. 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架

    20 个顶尖的 Python 机器学习开源项目 机器学习 2015-06-08 22:44:30 发布 您的评价: 0.0 收藏 1收藏 我们在Github上的贡献者和提交者之中检查了用Python语 ...

  4. 推荐GitHub上10 个开源深度学习框架

    推荐GitHub上10 个开源深度学习框架   日前,Google 开源了 TensorFlow(GitHub),此举在深度学习领域影响巨大,因为 Google 在人工智能领域的研发成绩斐然,有着雄厚 ...

  5. TensorFlow与主流深度学习框架对比

    引言:AlphaGo在2017年年初化身Master,在弈城和野狐等平台上横扫中日韩围棋高手,取得60连胜,未尝败绩.AlphaGo背后神秘的推动力就是TensorFlow--Google于2015年 ...

  6. 从TensorFlow 到 Caffe2:盘点深度学习框架

    机器之心报道 本文首先介绍GitHub中最受欢迎的开源深度学习框架排名,然后再对其进行系统地对比 下图总结了在GitHub中最受欢迎的开源深度学习框架排名,该排名是基于各大框架在GitHub里的收藏数 ...

  7. 转:TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比

    http://geek.csdn.net/news/detail/138968 Google近日发布了TensorFlow 1.0候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步.自Tens ...

  8. Amazon宣布将MXNet作为AWS的深度学习框架——貌似性能比tf高啊

    Amazon公司的Werner Vogels于上周宣布Amazon深度学习框架将会正式选用MXNet,并且AWS将会通过增加源代码贡献.改进文档以及支持来自其它框架的可视化.开发以及迁移工具,为实现M ...

  9. [深度学习大讲堂]从NNVM看2016年深度学习框架发展趋势

    本文为微信公众号[深度学习大讲堂]特约稿,转载请注明出处 虚拟框架杀入 从发现问题到解决问题 半年前的这时候,暑假,我在SIAT MMLAB实习. 看着同事一会儿跑Torch,一会儿跑MXNet,一会 ...

随机推荐

  1. MySql 常用的函数

    一.聚合函数 avg(col)      计算平均值    count(col)    计算中非NULL值的个数(这个容易忘)    greatest(x1,x2,...,xn) 返回集合中最大的值  ...

  2. java远程执行linux服务器上的shell脚本

    业务场景:需要从服务器A中新增的文件同步至本地服务器,服务器A中内存有限,需同步成功之后清除文件. Java调用远程shell脚本,需要和远程服务器建立ssh链接,再调用指定的shell脚本. 1.创 ...

  3. C++ 海量代码 排查内存/GDI泄漏历程

    排查分两大部分: 1.代码静态分析,通过Code Review查找不合规范的代码点: 2.运行目标软件,结合内存监控工具,分析目标软件的代码,定位内存泄漏点. 目前能找到的代码静态分析软件:Cover ...

  4. BFC与优雅降级 渐进增强——学习笔记

    BFC(块级格式化上下文) BFC(Block formatting context) 直译为"块级格式化上下文". 元素的显示模式 我们前面讲过 元素的显示模式 display. ...

  5. 【Flume】知识总结

    Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并 ...

  6. 从SpringBoot源码分析 主程序配置类加载过程

    1.@Import(AutoConfigurationPackages.Registrar.class) 初始SpringBoot 我们知道在SpringBoot 启动类上有一个@SpringBoot ...

  7. Java实现 LeetCode 235 二叉搜索树的最近公共祖先

    235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个 ...

  8. Java实现 LeetCode 91 解码方法

    91. 解码方法 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总 ...

  9. Java实现 LeetCode 63 不同路径 II(二)

    63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...

  10. Java实现大整数乘法

    1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import java.math.BigInteger; publi ...