如何在Distributed Tensorflow中并行化python输入管道

我有一个非常简单的输入管道,它包括读取地面实况和原始数据,并对它们进行预处理,用
Python编写.运行单个样本的输入管道需要很长时间,因此我有多个并行运行的进程(来自python多处理程序包)并排队以快速执行操作并预取数据.然后使用feed_dict将输出馈送到我的网络.我的训练循环中此过程的开销比实际的tf.Session.run()时间小2个数量级.

我正在尝试移动到tf.data API,通过使用tf.py_func包装我的读取预处理函数,但它运行缓慢,可能是由于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多处理的内置支持.如果上述因某些原因无效,您可能需要自己连接多处理.

解决这个问题的一种方法是:让多个进程产生您的输入,将它们放入多处理.Queue(或共享内存,并在其周围进行一些锁定).使用生成器函数实现接收方,并使用from_generator创建数据集.

点赞