跟着大数据和AI事务的不断交融,大数据分析和处理进程中,经过深度学习技能对非结构化数据(如图片、音频、文本)进行大数据处理的事务场景越来越多。本文会介绍Spark如e i Q y +何与深度学习结构进行协同作业,在大数据的处理进程利用g C 5 } ` i深度学习结构对非结构化数据进行处理。

SparkN N F 4 ?介绍

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

Spark运用函数1 – =式编程范式扩展了MapReduce模型以支撑更多核算类型,能够包括广泛的作业流。Spark运用内存缓存来提高性能,因此进行交互式分析也足够快速(好像运用Python解说器,与集群进行交互一样)。d = i =存一起提高了迭代算法的性能,这使得Spark非常合适机u L i ? ^ ? 0 k器学习。

由于Spark库供给了Python、Scale、Java编写的A0 ( uPI,以及内建的机器学习、流| [ i *数据、图算法、类SQL查询等模块;Spark敏捷成为当今` ` d k最重要的分布式核算结构之一。与YARN结合,Spark供给了增量,而不是替代已存在的Hadoop集群。在最近的Spark版别中,Spark加入了关于K8s的支撑,为Spn S 5ark与AI才能的交融供给了更好的支撑。

深度学习结s I U D h ] j F构介绍

TensorFlow

TensorFlow开始是由Google机器智能研究部门的Google Brain团队开发,根据Google 2011年开发的深度学习根底架构DistBelief构建起来的。由于Google在深度学习领域的巨大影响力和强壮8 K j ) %的推行才能,Tensor| T L G Flow一经推出就获得了极大的重视,并敏捷成为如今用户最多的深度学习结构。

TensorFlow是一个非常根底的体系,因此也能够运用于很多领域。但由于过i N v } % @ 7 8 z于复杂的体系设计,对读者来说,学习TensorFlow底层运行机制更是一个极端苦楚的进程。TensorFlow的接口一向处于快速迭代之N c C V Y中,而且没有很好地考虑向# ? Z : # l ;后兼容性,这导致现在许多开源代码现已无法在新版的TensorFlow上运行,一起也直O Y b . $ m {接导致了许多根据TensorFlG n |ow的第三方结构呈现BUG。

Keras

Keras 于201{ ; n 5 +5年3月首次发布,具有“为人类而不是机器设计的API”,得到GO L O r L Koogle的支撑。它是一个用于快速构建深度学习原型的高层神经网络库,@ F D由纯Python编写而成,以TensorFlow、CNTK、Theano和MXNet为% a @ m z ,底层引擎,供给简单易用的API接口,能够极大地减少一般运用下用户的作业量。

严格意义上讲,? 7 ` bKeras并不能称为一个深度学习结构,它更像一个深度学习接口,它构建于第三方结构之上。Keras的缺陷很明显:过度封1 – p装导5 * o / = 9致丧失灵活性。Keras开始作为Theano的高档API而诞生,后来增加. + T @ { ) I 4了TensorFlow和CNTK作为后端。学习Keras十分简单,可是很快就会遇到瓶颈,因为它短少灵活性。另外,在运用Kerass ] g的大多数时间里,用户主要: P $ t 3 G是在调用接口,很X q 9 8 A ~ W (难真正学习到深度学习的内容。

PyTorch

PyTorch于2016年10月发布,是一款专心于直接处理数组表达式的初级API。 前身是T@ # { :orch(一个根据Lua语言的* q i * Z m深度学习库)。Facebook人工智能研究院对PyTorch供给了强力支撑。PyTorch支撑动态核算图,为更v G y @ n具数学倾向的用户供给了更低层次的办法和更多的灵活性,, ; . 0 { 9目前j X 5 P e M ; O许多新宣布的论文都采用PyTorch作为论文完成的东西,成为学术研究的首选解决方案。

Cafw l _ Yfe/Caffe2.0

Caffe的全称是ConvolutioR { y N Tnal Architecture for Fast Feature Embedding,它是一个清晰、高效的深度学习结构,于2013年底由加州大学伯克利分校开发,中心语言是C++。它支撑命令行、Python和MATLAB接口。Caffe的一个重要特色是能够在不编写代码的情况下练习和布置模型。假如您是C++熟练运用者,并对CUDA核算游刃有余,你能够考虑挑选Caffe。

在Spark大数据处理中运用深度学习结构

在Spark程序中运用一个预练习过的模型,将其并行运用于大型数据集的数据处理。比方,给定一个能够辨^ V x T u B h O .认图片的分类模型,其经过一个标准数据集(9 * V O | | )如ImageNet)练习过。能够在一个Spark程序中调用一个结构(如TensorFlow或Keras)进行分布式猜测。经过在大数据处理进程中调用预练习模型k X # y F能够直接对非结构化数据进行直接处理。

咱们要点介绍在Spark程序中运用Keras+TensorFlow来进行模型推理。

运用深度学习处理图片的第一步,便是载入图片。Spark 2.3中新增的ImageSchema包含了载入数百万张图画到Spark DataFrame的有用函数,而且以分布式办法主动解码,容答应扩展地操作。

运用Spark’s ImageSchema:

from pyspark.ml.imagem q g o R s 1 A Q import ImageSchema
im# } X -age_df = ImageSc5 % g p g dhema.readImage G ^ ,s("/data/myt S  ) A : Mimages")
image_df.show()

也能够利用Keras的图片处理库:v Y n . o i | s

from keras.preprocessing import image
img = image.load_img("/data/myimages/daisy.jpg", target_size=(2K Q @ H Y Z i :99, 299))

能够经过图片路径来构造SZ Q ; I ) O ! I .park DataFrame:

def get_image_paths_df(sqlContext, dirpatU = { Z * 3 + qh, colNb ^ Tame):
files = [os.path.abspath(os.path.join(dirpath, f)W 4 Z o # N X) for f in os.listdir(dirpath) if f.endswith('.jpg')]
return sqlContext.createDataFrame(files, StringType()).toDF(colName)

运用Keras接口加载预练习模型:j y N ; e

from keras.applicatio2 _ _ns import InceptionV3
model = InceptionV3(weights="imagw  h ^ v - C X tenet")
model.save('/tmp/model-full.h5')
model = load_model('/tmp/model-full.h5')

界说图片辨认推理办法:

        def iv3_predict(fpath):
model = load_model('/tmp/model-full.h5D L : w ^ J x j')
img = image.load_imgB q 8 9 f O P . k(fpath, target_size=(299, 299))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model; & c.predict(x)
preds_F S 0 & `decode_list = decode_predictions(preds, top=3)
tmp = preds_decode_list[0]
res_list = []
forV 3 V x in tmp:
res = [x[0], x[% c * K ,1], float(x[2])]
res_list.append(res)
return res$ = /_list

界说推理输入V # a – u %成果Schema:

def get_: , t 0  u L Tlabels_type():
elei # ? ! s y J } M_type = StructType()
ele_type.add("class", data_type=StringType())
ele_type.add("description", d- v w Q 0 W hata_type=StringType())
ele_type.add("probability", data_type=FloatType())
return ArrayType(ele_type)

将推理办法界说成W f 1 u ^ ~ T e 1Spark UDF:

spark.udf.regist^ W wer("iv3_predict", iv3_predict, returnType=get_labels_type())

载入图片界说为数据表:

df = get_image_paths_f 1 w Z N ) ! /df(self.] A Csqlo w E H & L)
df.createOrReplaceTempView("_test_image_paths_df"B @ 4 J x 2 8 S)

运用SQL句子对接图片进行处理:

df_images = spark.sql("select fpath, iv3_predict(fpath) as predicted_labels from _test_imageE W m r  . Y_patho I y / L O } + Qs_df")
df_images.printSchema()
df_imat F 1 D l b /ges.show(truncate=FaU z G )lse)

结语

在大数据Spark引擎中运用深度学习结构加载预处理模型,来进行非结构数据处理有非常多的运用场景。可是由_ 1 K于深度学习结构目前比较多* a w B 2,模型与结构本身是深度耦合,在大数据环境中安装和布置8 p ! / d ^ ) N U深度学习结构软件及其依赖软件会非常复杂,一起不利于大数据集群的管理和维护,增加人力成本。

华为云DLI服务,采用大数据Serverless架构,g l S用户不需要感知实际物理集群,一起DLI服务现已在大数据集群中内置了AI核算结构和底层依赖库(Keras/tensorflow/scikit-learn/pandas/numpy等)。DLI最新版别中现已支撑k8s+Dock– x [ m j S L cer生态,并敞开用户4 ~ , t k $自界说Docker镜像才能,供给给用户来扩展自己的AI结构、模型、算法包。在Serverless根底3 { N T g i ` Y Y上,为用户供给更加敞开的自界说扩展才/ | g 2 O =能。

点击重视,5 e 2 c I z i第一时间了解华为云新鲜技能~

Spark如何与深度学习框架协作,处理非结构化数据