在从源构建TensorFlow时,bazel规则在哪里生成`gen_io_ops.py`文件?

时间:2017-08-02 09:36:39

标签: python c++ tensorflow bazel

我正在尝试确定从源代码构建TensorFlow时bazel如何生成 gen_io_ops 模块。

tensorflow/python/ops/io_ops.py中,有一段代码:

from tensorflow.python.ops.gen_io_ops
[...]

# used in the TextLineReader initialization
rr = gen_io_ops._text_line_reader_v2(...)

引用bazel-genfiles/tensorflow/python/ops/gen_io_ops.py模块(在构建TensorFlow时由bazel生成) _text_line_reader_v2tensorflow/tensorflow/core/kernels/text_line_reader_op.cc中定义的TextLineReaderV2的包装。

据我了解,构建步骤如下:

1) text_line_reader_op的内核库内置于tensorflow/tensorflow/core/kernels/BUILD

tf_kernel_library(
        name = "text_line_reader_op",
        prefix = "text_line_reader_op",
        deps = IO_DEPS,)

其中tf_kernel_library基本上查找 text_line_reader_op.c 文件并构建它。

2) :text_line_reader_op内核库随后被the same file中定义的io库用作依赖项:

cc_library(
    name = "io",
    deps = [       
        ":text_line_reader_op", ...
    ],
)

我认为io库现在包含TextLineReaderV2内核的定义。

从我从answer获得的内容,应该有一个第三步,其中io库用于生成{{1}中的python包装器模块。这个文件生成可以通过巴塞尔的bazel-genfiles/tensorflow/python/ops/gen_io_ops.py规则或tf_op_gen_wrapper_py方法完成,但似乎没有一个参与。

有人知道在构建过程中定义第三步的位置吗?

1 个答案:

答案 0 :(得分:1)

我终于明白了。

tf_op_gen_wrapper_py确实有来电,但在tf_gen_op_wrapper_private_py的来电中隐藏了它:

def tf_gen_op_wrapper_private_py(name, out=None, deps=[],
                                 require_shape_functions=True,
                                 visibility=[]):
  if not name.endswith("_gen"):
    fail("name must end in _gen")
  [...]
  bare_op_name = name[:-4]
  tf_gen_op_wrapper_py(name=bare_op_name, ...

所以步骤如下。

tensorflow/tensorflow/python/BUILD中,有这条规则

tf_gen_op_wrapper_private_py(
    name = "io_ops_gen",
    [...]
)

因此,在此规则中,_gen后缀将被移除(在tf_gen_op_wrapper_private_py中),gen_前缀将添加到tf_gen_op_wrapper_py中,因此{{1}这个规则将生成模块。