如何在分布式 Tensorflow 中并行化 python 输入管道
How to parallelise python input pipeline in Distributed Tensorflow
我有一个非常重要的输入管道,它包括读取基本事实和原始数据并对它们执行预处理,用 Python 编写。 运行 单个样本的输入管道需要很长时间,所以我有多个进程(来自 python 多处理包)运行 并行并排队以快速执行操作并预取数据。然后使用 feed_dict 将输出馈送到我的网络。在我的训练循环中这个过程的开销比实际的 tf.Session.run() 时间少 2 个数量级。
我正在尝试通过用 tf.py_func 包装我的读取+预处理函数来移动到 tf.data API,但它 运行 很慢,可能是由于 GIL,即使在增加时也是如此多次通话的次数。
我想将我的训练扩展到多台机器,但我不确定在这种情况下数据获取的行为如何,而且单台机器也存在性能问题:)
所以,基本上我的问题是:
如何 运行 python 在 tf.data api 中在多个 CPU 内核上并行输入管道?
一些说明,tf.py_func
可以 运行 与您的 sess.run()
并行(因为 sess.run()
释放了 GIL)但您不能 运行 多个tf.py_func
在同一个 python 进程中。
在这种情况下,通常的答案是离线进行一次预处理,将结果保存在磁盘上(例如使用 TFRecord 格式),在训练期间从文件中读取准备好的数据。您可能可以使用诸如多处理之类的方法并行化离线预处理。
如果你可以使用 tf 操作表达你的预处理,你可以 运行 使用 Dataset.map
并行处理它,但是没有对 python 多处理的内置支持tf.data
。如果由于某种原因上述方法不起作用,您可能必须自己连接多处理。
解决此问题的一种方法如下。让多个进程产生您的输入,将它们放入 multiprocessing.Queue (或带有一些锁定的共享内存)。使用生成器函数实现接收端并使用 from_generator.
创建数据集
最近 Google 发布了 Tensorflow Extended (TFX)。它主要包括:
- 一组操作符,每个操作符都使用 Apache Beam 进行数据分发(他们称它们为组件)。
- 数据和参数格式的标准化(他们称之为 protobuf)
- 运算符的自动化依赖管理(workflow/orchestration)
- 跑步跟踪。这允许系统跳过已经在相同条件下执行的操作。
我建议要么看看 TFX。或者,要获得更适度的飞跃,请查看 Apache Beam。
我有一个非常重要的输入管道,它包括读取基本事实和原始数据并对它们执行预处理,用 Python 编写。 运行 单个样本的输入管道需要很长时间,所以我有多个进程(来自 python 多处理包)运行 并行并排队以快速执行操作并预取数据。然后使用 feed_dict 将输出馈送到我的网络。在我的训练循环中这个过程的开销比实际的 tf.Session.run() 时间少 2 个数量级。 我正在尝试通过用 tf.py_func 包装我的读取+预处理函数来移动到 tf.data API,但它 运行 很慢,可能是由于 GIL,即使在增加时也是如此多次通话的次数。 我想将我的训练扩展到多台机器,但我不确定在这种情况下数据获取的行为如何,而且单台机器也存在性能问题:)
所以,基本上我的问题是: 如何 运行 python 在 tf.data api 中在多个 CPU 内核上并行输入管道?
一些说明,tf.py_func
可以 运行 与您的 sess.run()
并行(因为 sess.run()
释放了 GIL)但您不能 运行 多个tf.py_func
在同一个 python 进程中。
在这种情况下,通常的答案是离线进行一次预处理,将结果保存在磁盘上(例如使用 TFRecord 格式),在训练期间从文件中读取准备好的数据。您可能可以使用诸如多处理之类的方法并行化离线预处理。
如果你可以使用 tf 操作表达你的预处理,你可以 运行 使用 Dataset.map
并行处理它,但是没有对 python 多处理的内置支持tf.data
。如果由于某种原因上述方法不起作用,您可能必须自己连接多处理。
解决此问题的一种方法如下。让多个进程产生您的输入,将它们放入 multiprocessing.Queue (或带有一些锁定的共享内存)。使用生成器函数实现接收端并使用 from_generator.
创建数据集最近 Google 发布了 Tensorflow Extended (TFX)。它主要包括:
- 一组操作符,每个操作符都使用 Apache Beam 进行数据分发(他们称它们为组件)。
- 数据和参数格式的标准化(他们称之为 protobuf)
- 运算符的自动化依赖管理(workflow/orchestration)
- 跑步跟踪。这允许系统跳过已经在相同条件下执行的操作。
我建议要么看看 TFX。或者,要获得更适度的飞跃,请查看 Apache Beam。