从 pyspark 导入 TensorFlow 数据

Posted

技术标签:

【中文标题】从 pyspark 导入 TensorFlow 数据【英文标题】:Import TensorFlow data from pyspark 【发布时间】:2018-04-30 13:52:36 【问题描述】:

我想基于数百 GB 的数据创建一个预测模型。数据需要一些不密集的预处理,我可以在 pyspark 中进行,但在 tensorflow 中则不行。在我的情况下,直接将预处理的结果传递给 TF 会方便得多,理想情况下,将 pyspark 数据帧视为 TF 的虚拟输入文件,而不是将预处理的数据保存到磁盘。但是,我一点也不知道该怎么做,而且我在互联网上找不到任何地方。


经过一番思考,在我看来,我实际上需要一个迭代器(如 tf.data.Iterator 所定义的)来处理 spark 的数据。但是,我在网上发现 cmets 暗示了 Spark 的分布式结构使其非常困​​难,如果不是不可能的话。为什么这样?想象一下,我不关心行的顺序,为什么不能遍历 spark 数据?

【问题讨论】:

为什么投反对票? 一点更新:David Parks 提出的解决方案效果很好,但是整个输入管道在我的机器上非常慢,并且占用了大部分训练时间。一旦我决定对数据进行预处理,然后将结果存储为 tfrecords,我就获得了令人难以置信的加速,比如快了 100 倍。 (当时我没有尝试预取输入数据,我不知道这是否可能。但是,它也可能有助于解决问题。) 【参考方案1】:

听起来你只是想使用tf.data.Dataset.from_generator() 你定义了一个从 spark 中读取样本的 python 生成器。虽然我不太了解 spark,但我确信您可以对将运行 tensorflow 模型的服务器进行缩减。更好的是,如果您正在分发训练,您可以减少需要最终数据集的一些分片的服务器集。

import data programmers guide 更详细地涵盖了Dataset 输入管道。 tensorflow Dataset 将为您提供一个由图形直接访问的迭代器,因此无需 tf.placeholders 或在您编写的 tf.data.Dataset.from_generator() 代码之外编组数据。

【讨论】:

感谢您的评论。不幸的是,我对这些事情的理解似乎远不如你的,所以我仍在努力弄清楚你对这一切的确切含义以及如何实现它。特别是,pyspark 数据帧有一个to_local_iterator() 函数,它可能会有所帮助。我仍然不明白如何正确使用它;但想象一下我让它工作:我可以以某种方式将一个生成器包裹在一个迭代器周围来调用tf.data.Dataset.from_generator()吗? 请务必阅读程序员指南以了解 Tensorflow 数据集预处理管道。您想要做的是用 Python 生成器函数包装 to_local_iterator()。然后将该生成器传递给tf.data.Dataset.from_generator()。您将从数据集中创建一个 tensorflow 迭代器,该迭代器将生成您可以像使用占位符或任何其他张量一样使用的张量。 谢谢,这确实是解决方案。我遇到了一些奇怪的错误(连接被拒绝,这实际上意味着没有为 pyspark 分配足够的内存)但现在它似乎可以工作了。

以上是关于从 pyspark 导入 TensorFlow 数据的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - ImportError:无法从“pyspark”导入名称“SparkContext”

如何从 pyspark 中的本地 jar 导入包?

从模块导入 myfunctions 的 azure pyspark;没有模块名称

手动从 Tensorflow 导入 LSTM 到 PyTorch

从列表中创建一个 pyspark 数据框列,其中列表的长度与数据框的行数相同

SqlContext 导入和并行化 Pyspark 中的错误