如何在 tf.Transform 中使用 Google DataFlow Runner 和模板?

How to use Google DataFlow Runner and Templates in tf.Transform?

我们正在 Google 云上建立机器学习管道,利用 GC ML-Engine 进行分布式 TensorFlow 训练和模型服务,并利用 DataFlow 进行分布式预处理作业。

我们希望 运行 我们的 Apache Beam 应用程序作为 Google 云上的 DataFlow 作业。看着 ML-Engine samples 似乎可以获取 tensorflow_transform.beam.impl AnalyzeAndTransformDataset 来指定使用哪个 PipelineRunner,如下所示:

from tensorflow_transform.beam import impl as tft
pipeline_name = "DirectRunner"
p = beam.Pipeline(pipeline_name) 
p | "xxx" >> xxx | "yyy" >> yyy | tft.AnalyzeAndTransformDataset(...)

TemplatingDataflowPipelineRunner provides the ability to separate our preprocessing development from parameterized operations - see here: https://cloud.google.com/dataflow/docs/templates/overview - 基本上:

问题是:你能告诉我我们如何使用 tf.Transform 来利用 TemplatingDataflowPipelineRunner 吗?

遗憾的是,Python 管道不能用作模板。它仅适用于 Java today。由于需要使用python库,所以这样做是不可行的。

tensorflow_transform 还需要支持 ValueProvider 以便您可以将选项作为值提供程序类型通过它传递。

Python 模板于 2017 年 4 月可用(参见 documentation)。操作方法如下:

  • 定义从 PipelineOptions 子类化的 UserOptions。
  • 使用 add_value_provider_argument API 添加要参数化的特定参数。
  • 将继续使用 argparse 的 add_argument.
  • 定义常规不可参数化选项
class UserOptions(PipelineOptions):
     @classmethod
     def _add_argparse_args(cls, parser):
         parser.add_value_provider_argument('--value_provider_arg', default='some_value')
         parser.add_argument('--non_value_provider_arg', default='some_other_value')

请注意 Python 没有 TemplatingDataflowPipelineRunner,Java 2.X 也没有(与 Java 1.X 中发生的情况不同)。