我正在尝试确定从源代码构建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_v2
是tensorflow/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
方法完成,但似乎没有一个参与。
有人知道在构建过程中定义第三步的位置吗?
答案 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}这个规则将生成模块。