繁体   English   中英

如何在分布式Tensorflow中并行化python输入管道

[英]How to parallelise python input pipeline in Distributed Tensorflow

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

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

tf.py_func说明, tf.py_func可以与sess.run()并行运行(因为sess.run()会释放GIL),但是您不能在同一python进程中运行多个tf.py_func

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

使用TF操作如果你可以表达你的预处理,可以使用并行运行Dataset.map ,但没有内置的蟒蛇在支援多核心tf.data 如果以上操作由于某些原因无法正常工作,则您可能必须自己连接多处理程序。

解决此问题的一种方法如下。 有多个进程产生您的输入,然后将它们放入multiprocessing.Queue(或带有一些锁定的共享内存)。 使用生成器函数实现接收方,并使用from_generator创建数据集。

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

  • 一组运算符,每个运算符均使用Apache Beam进行数据分发(它们称为组件)。
  • 数据和参数格式的标准化(它们称为protobuf)
  • 自动化的操作员依赖管理(工作流程/流程)
  • 跟踪运行。 这使系统可以跳过在相同条件下已经执行的操作。

我建议要么看看TFX。 或者,为更适度的飞跃,请查看Apache Beam。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM