分布式Tensorflow中python输入管道的并行化

分布式Tensorflow中python输入管道的并行化,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,我有一个非常重要的输入管道,它由读取基本事实和原始数据并对它们执行预处理组成,用Python编写。为单个示例运行输入管道需要很长时间,因此我有多个并行运行的进程(来自python multiprocessing package)和队列来快速执行操作和预取数据。然后使用feed_dict将输出馈送到我的网络。在我的训练循环中,这个过程的开销比实际的tf.Session.run()时间少2个数量级。 我试图通过使用tf.py_func包装我的read+preprocess函数来转移到tf.data

我有一个非常重要的输入管道,它由读取基本事实和原始数据并对它们执行预处理组成,用Python编写。为单个示例运行输入管道需要很长时间,因此我有多个并行运行的进程(来自python multiprocessing package)和队列来快速执行操作和预取数据。然后使用feed_dict将输出馈送到我的网络。在我的训练循环中,这个过程的开销比实际的tf.Session.run()时间少2个数量级。 我试图通过使用tf.py_func包装我的read+preprocess函数来转移到tf.data API,但它运行缓慢,可能是由于GIL,即使在增加多个调用的数量时也是如此。 我想将我的培训扩展到多台机器,但不确定在这种情况下数据获取的行为如何,同时也存在单台机器的性能问题:)

所以,基本上我的问题是:
如何在多个CPU核上并行运行tf.data api输入管道中的python函数?

有几点澄清,
tf.py_func
可以与您的
sess.run()
并行运行(因为
sess.run()
释放了GIL),但不能在同一个python进程中运行多个
tf.py_func

在这种情况下,通常的答案是离线后进行预处理,将结果保存在磁盘上(例如使用TFRecord格式),在培训期间从文件中读取准备就绪的数据。您可能可以使用类似于多处理的方法并行化脱机预处理

如果可以使用tf操作来表示预处理,那么可以使用
Dataset.map
并行运行它,但是
tf.data
中没有内置的对python多处理的支持。如果由于某种原因上述方法不起作用,您可能需要自己连接多处理


实现这一点的一种方法如下。让多个进程生成您的输入,将它们放入multiprocessing.Queue(或共享内存,并在其周围加锁)。使用生成器函数实现接收端,并使用创建数据集。

最近谷歌发布了Tensorflow Extended(TFX)。它主要包括:

  • 一组操作符,每个操作符都使用ApacheBeam进行数据分发(称为组件)
  • 数据和参数格式的标准化(他们称之为protobuf)
  • 操作员的自动化依赖关系管理(工作流/编排)
  • 跑步记录。这允许系统跳过在相同条件下已执行的操作
我建议要么看看TFX。或者,更温和的飞跃,看看ApacheBeam