随着大数据和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=(299, 299))

可以通过图片路径来构造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=(299, 299))x = image.img_to_array(img)x = np.expand_dims(x, axis=0)x = preprocess_input(x)preds = model.predict(x)preds_decode_list = decode_predictions(preds, top=3)tmp = preds_decode_list[0]res_list = []for x in tmp:res = [x[0], x[1], float(x[2])]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. 【华为云技术分享】大数据实践解析(下):Spark的读写流程分析

    摘要:本文通过简单的例子来解析,大数据实践中的Spark读写流程,内容主要聚焦于Spark中的高效并行读写以及在写过程中如何保证事务性. 导读: 众所周知,在大数据/数据库领域,数据的存储格式直接影响 ...

  2. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  3. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  4. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  5. 【华为云技术分享】数据湖数据库,别再傻傻分不清了

    什么是数据湖 如果需要给数据湖下一个定义,可以定义为这样:数据湖是一个存储企业的各种各样原始数据的大型仓库,其中的数据可供存取.处理.分析及传输. 数据湖从企业的多个数据源获取原始数据,并且针对不同的 ...

  6. 【华为云技术分享】云原生数据库三驾马车之TaurusDB

    [前言]Taurus是华为对标AWS Aurora的一款重磅云原生数据库.其设计思想是Log-as-database以最小化网络IO,采用计算存储分离的架构.Taurus的市场定位是OLTP的企业级市 ...

  7. 【华为云技术分享】如何处理暗数据?

    有研究表明,全球数据总量每两年翻一番,各企业都在处理和存储这些海量数据.这些数据主要由结构化数据.非结构化数据等类型数据构成.企业对数据了解得越透彻,就能够越准确地判断数据的价值及风险. 结构化的数据 ...

  8. 工信部重点实验室非结构化数据技术创新实验基地揭牌成立

    2021年12月31日,信息智能处理与内容安全工业和信息化部重点实验室--非结构化数据技术创新实验基地(以下简称"实验基地")在鸿翼正式揭牌成立,国家工业信息安全发展研究中心数据资 ...

  9. 【华为云技术分享】华为专家亲述:如何转型搞 AI?

    前言 参考塞缪尔. 约翰逊(18 世纪英国文学评论家.诗人,著有<英语大辞典>.<莎士比亚集>)的思路,"当一个人厌倦了学习技术,那他肯定也厌倦了 IT 行业,因为只 ...

最新文章

  1. linux内核 机器码,u-boot与Linux内核机器码问题
  2. vim graphics
  3. 手工编译Android程序
  4. python算法与数据结构-插入排序算法(34)
  5. 查看手机是否安装微信客户端
  6. 转——深度学习之BN算法(Batch Normailization)
  7. CRM Online Outlook Client Configuration Wizard
  8. layui table 复选框数据_Python操作三大数据库 Mysql
  9. (TPC-H测试 SF=10,SF=200) PostgreSQL 11 vs 10 vs Deepgreen
  10. VS C++ sprintf 格式
  11. 取代NBSI2:Opendatasource And Openrowset
  12. android设置字体大小,Android中如何设置字体大小
  13. word页眉页脚页码设置详解
  14. 有关VScode 配置MinGW32_9.2.0+OpenGL+GLFW+GLAD
  15. 微信小程序开发(六)——服务器
  16. 计算机操作系统——LINUX的C语言编程与shell编程
  17. 湖南文理学院第十六届程序设计竞赛_题解
  18. 速览默默发展的Web3邮箱赛道
  19. 监听器(Listener)
  20. python调用ch_python curses使用

热门文章

  1. Less的@import指令
  2. 视觉SLAM笔记(36) 3D-2D: PnP
  3. linux驱动大全,linux驱动
  4. kakfa怎么看消息是否堆积_不停的打开微信,只为看你是否更新了消息
  5. php中http有哪些状态码,http状态码是什么意思?http常用状态码有哪些
  6. Appium-关于appium的原生控件的 xpath 定位问题及常用方法
  7. 自定义的plot函数参数date坐标模型[x,y]的使用建议
  8. [剑指Offer] 42.和为S的两个数字
  9. Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
  10. BZOJ 3304: [Shoi2005]带限制的最长公共子序列( LCS )