热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为SparkDeepLearning添加NLP处理实现

前言前段时间研究了SDL项目,看到了Spark的宏大愿景,写了篇Spark新愿景:让深度学习变得更加易于使用。后面看了TFoS,感觉很是巧妙,写了一篇TensorFlowOnSpa
前言

前段时间研究了SDL项目,看到了Spark的宏大愿景,写了篇Spark新愿景:让深度学习变得更加易于使用。后面看了TFoS,感觉很是巧妙,写了一篇TensorFlowOnSpark 源码解析。这些项目都得益于Spark对python的支持,所以了解了下spark和python如何进行交互的,可参看此文PySpark如何设置worker的python命令。

虽然非常看好SDL,但是它存在几个明显的问题:

  1. 进度慢的让人难以忍受。截止到目前为止,已经有26天没有新commit了。
  2. 只做了图像相关的工作,没有任何NLP相关的工具使用。 参看其他人提的这个Issue: What would it take to generalize to non-image data?
  3. 现有的分布式调参功能,基本不可用。参看我提的这个Issue: To Avoid collecting trainning data to driver and broadcasting them
  4. 不支持分布式tranning. 参看我提的这个Issue: Is there any plan to port TensorframeOnSpark(From yahoo) ?

当然SDL的想法非常好:

  1. 相比K8s + TF只是完成了分布式训练, SDL 把data process ,data training,data inference 三者给完全衔接了。
  2. 提供了一个很好的编程模型,以sk-learn/Mllib的方式完成模型的训练,对于工作效率提升明显。
  3. 分布式模型训练,分布式模型超参数tunning, 分别解决了训练数据量大的问题,参数探索的问题。

因为我司以NLP为主,所以我提供了一个deep learning auto-encoder的一个demo,展现SDL的能力。顺带通过引入Kafka解决了
“分布式模型超参数tunning”在实际场景不可用的问题。有时间会完成和TFoS的集成。

演示代码

我这里写了一个单元测试(python/tests/transformers/tf_text_test.py):

class TFTextTransformerTest(SparkDLTestCase):
def test_loadText(self):
input_col = "text"
output_col = "sentence_matrix"
documentDF = self.session.createDataFrame([
("Hi I heard about Spark", 1),
("I wish Java could use case classes", 0),
("Logistic regression models are neat", 2)
], ["text", "preds"])
# transform text column to sentence_matrix column which contains 2-D array.
transformer = TFTextTransformer(
inputCol=input_col, outputCol=output_col)
df = transformer.transform(documentDF)
# create a estimator to training where map_fun contains tensorflow's code
estimator = TFTextFileEstimator(inputCol="sentence_matrix", outputCol="sentence_matrix", labelCol="preds",
kafkaParam={"host": "127.0.0.1", "topic": "test", "group_id": "sdl_1"},
fitParam=[{"epochs": 5, "batch_size": 64}, {"epochs": 5, "batch_size": 1}],
mapFnParam=map_fun)
estimator.fit(df).collect()

TFTextTransformer 主要是把任意文本转化为一个二维矩阵,一行代表一个词汇,每个词汇都是word embedding的形态。该Transformer本质是做featurize的工作,2-D array 是能够直接被包括CNN,LSTM等算法操作的格式。 我这里简要介绍下TFTextTransformer的处理流程:

  1. 获取输入列,然后使用word2vec对数据进行训练,得到每个词的word embedding,最后作为一个map(word, vector) 广播出去
  2. 将input_col列的句子转化为一个2-D array作为outputCol
  3. 添加一些常数列到新的DataFrame里,比如vocab_size(词汇数目),embedding_size(词向量大小)。
  4. 返回新DataFrame

TFTextFileEstimator 完成训练过程,具体流程为:

  1. TFTextFileEstimator 将TFTextTransformer的每一条数据序列化后写入Kafka
  2. 根据fitParams (也就是你设置的超参数组合)长度,启动对应个数的tensorflow实例
  3. 为tensorflow实例从kafka拉去数据,并且提供一个_read_data函数句柄给tensorflow程序。
  4. 调用你编写的tf程序,完成训练。

额外引入kafka的原因是因为,每个tensorflow实例都需要消费全量的数据,一个简单的做法是把数据collect到driver端然后broadcast出去,但是实际上行不通,所以将数据集中放在kafka。

map_fun 是一个函数,这里你完全可以使用keras/tensorflow 构建模型,并且调用_read_data获取数据,以及通过args获得必要的参数,具体代码(python/sparkdl/tf_fun.py):

def map_fun(_read_data, **args):
import tensorflow as tf
EMBEDDING_SIZE = args["embedding_size"]
feature = args['feature']
label = args['label']
params = args['params']['fitParam']
SEQUENCE_LENGTH = 64
def feed_dict(batch):
# Convert from dict of named arrays to two numpy arrays of the proper type
features = []
for i in batch:
features.append(i['sentence_matrix'])
# print("{} {}".format(feature, features))
return features
encoder_variables_dict = {
"encoder_w1": tf.Variable(
tf.random_normal([SEQUENCE_LENGTH * EMBEDDING_SIZE, 256]), name="encoder_w1"),
"encoder_b1": tf.Variable(tf.random_normal([256]), name="encoder_b1"),
"encoder_w2": tf.Variable(tf.random_normal([256, 128]), name="encoder_w2"),
"encoder_b2": tf.Variable(tf.random_normal([128]), name="encoder_b2")
}

_read_data 可以获取spark dataframe的数据,典型用法如下:

for i in range(params.epochs):
print("epoll {}".format(i))
for data in _read_data(max_records=params.batch_size):
batch_data = feed_dict(data)
sess.run(train_step, feed_dict={input_x: batch_data})
sess.close()

这里,你核心关注如何构建网络,数据处理的工作前面的transformer已经帮你完成。

详细代码参看: https://github.com/allwefantasy/spark-deep-learning/tree/nlp-support


推荐阅读
  • 本文详细探讨了如何在 SparkSQL 中创建 DataFrame,涵盖了从基本概念到具体实践的各种方法。作为持续学习的一部分,本文将持续更新以提供最新信息。 ... [详细]
  • 本文详细介绍了如何配置Apache Flume与Spark Streaming,实现高效的数据传输。文中提供了两种集成方案,旨在帮助用户根据具体需求选择最合适的配置方法。 ... [详细]
  • 本文详细介绍如何使用 Apache Spark 执行基本任务,包括启动 Spark Shell、运行示例程序以及编写简单的 WordCount 程序。同时提供了参数配置的注意事项和优化建议。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 深入解析Spark核心架构与部署策略
    本文详细探讨了Spark的核心架构,包括其运行机制、任务调度和内存管理等方面,以及四种主要的部署模式:Standalone、Apache Mesos、Hadoop YARN和Kubernetes。通过本文,读者可以深入了解Spark的工作原理及其在不同环境下的部署方式。 ... [详细]
  • 在Ubuntu 16.04中使用Anaconda安装TensorFlow
    本文详细介绍了如何在Ubuntu 16.04系统上通过Anaconda环境管理工具安装TensorFlow。首先,需要下载并安装Anaconda,然后配置环境变量以确保系统能够识别Anaconda命令。接着,创建一个特定的Python环境用于安装TensorFlow,并通过指定的镜像源加速安装过程。最后,通过一个简单的线性回归示例验证TensorFlow的安装是否成功。 ... [详细]
  • 解决getallheaders函数导致的500错误及8种服务器性能优化策略
    本文探讨了解决getallheaders函数引起的服务器500错误的方法,并介绍八种有效的服务器性能优化技术,包括内存数据库的应用、Spark RDD的使用、缓存策略的实施、SSD的引入、数据库优化、IO模型的选择、多核处理策略以及分布式部署方案。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
  • 深入理解一致性哈希算法及其应用
    本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
  • 本改进旨在提升运行选择器中名称换行的显示效果,以提高用户体验。 ... [详细]
  • 基于2-channelnetwork的图片相似度判别一、相关理论本篇博文主要讲解2015年CVPR的一篇关于图像相似度计算的文章:《LearningtoCompar ... [详细]
  • 吴恩达推出TensorFlow实践课程,Python基础即可入门,四个月掌握核心技能
    量子位报道,deeplearning.ai最新发布了TensorFlow实践课程,适合希望使用TensorFlow开发AI应用的学习者。该课程涵盖机器学习模型构建、图像识别、自然语言处理及时间序列预测等多个方面。 ... [详细]
  • 本文详细介绍了非极大值抑制(Non-Maximum Suppression, NMS)算法的原理及其在目标检测中的应用,并提供了C++语言的具体实现代码。NMS算法通过筛选出高得分的检测框并移除重叠度高的其他检测框,有效提高了检测结果的准确性和可靠性。 ... [详细]
  • 本文探讨了图像标签的多种分类场景及其在以图搜图技术中的应用,涵盖了从基础理论到实际项目实施的全面解析。 ... [详细]
author-avatar
i_Screw_Robots
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有