1

我正在尝试使用 tensorflow-transform v0.11.0 预处理大量数据(一个 tfrecord 文件 ~1Go)并仅在本地传输。

我的代码很大程度上来自https://github.com/tensorflow/transform/blob/master/examples/census_example.py

我有一个适用于较小数据集(<100Mo)的光束管道,但随着我添加更多数据,处理时间会急剧增加。作为 tf-transform 和 apache Beam 的新手,我很难找到问题的原因和解决方案……而且我想避免使用 google DataFlow。

如果我理解正确的话,我的管道使用 beam directRunner 在本地运行,但它只使用一个核心。使用多核可能是缩短预处理时间的一种方法,但我不知道使用 beam directRunner 是否可行。有没有办法让张量流转换管道在我机器上的多个核心上运行?

我查看了光束管道和 directRunner 的选项,但找不到任何关于让运行器访问多个核心或为管道创建多个 directRunner 的迹象。

非常感谢您为我提供的任何帮助!

4

3 回答 3

1

要添加到 Anton 的评论中,您可以利用 Apache Flink 并行运行管道。更多细节总结在Tensorflow transform on beams with flink runner

您还必须根据内核总数设置并行度并启动许多 Flink TaskManager。我的建议是将并行度设置为(内核总数/2)

于 2019-01-07T20:01:51.380 回答
0

@Ankur @Anton 感谢您的回答,我同意这种方法对生产不友好......我们将尝试其他两种解决方案:

  • DataFlow 上的张量流转换
  • 完全删除 tensorflow-transform 并使用 presto 获取分类输入的词汇文件、计算均值和标准差以缩放整个数据集上的数字输入等
于 2019-01-14T11:06:33.140 回答
0

我不相信这是支持的。Direct runner 的主要目的是确保流水线正确实现 Beam 模型。它没有针对生产使用进行优化,实际上可能会导致效率低下:https ://beam.apache.org/documentation/runners/direct/

作为一种解决方法,您可以手动启动多个直接运行器管道来处理不同部分的数据。

更好的选择是使用实际的并行运行器来运行这些类型的作业,例如,您可以启动 Flink 集群:https ://beam.apache.org/documentation/runners/flink/

于 2019-01-04T19:20:17.597 回答