从源构建 TensorFlow 时,生成 `gen_io_ops.py` 文件的 bazel 规则在哪里?
Where is the bazel rule generating the `gen_io_ops.py` file when building TensorFlow from sources?
我正在尝试确定在从源代码构建 TensorFlow 时,gen_io_ops 模块是如何由 bazel 生成的。
在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
库用于生成 python bazel-genfiles/tensorflow/python/ops/gen_io_ops.py
模块中的包装器。此文件生成可以通过巴塞尔的 tf_op_gen_wrapper_py
规则或 tf.load_op_library()
方法完成,但其中 none 似乎涉及。
有人知道第三步在构建过程中的什么地方定义吗?
终于明白了
确实有对 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
中)并在 tf_gen_op_wrapper_py
中添加 gen_
前缀,因此 gen_io_ops.py
模块将按此规则生成。
我正在尝试确定在从源代码构建 TensorFlow 时,gen_io_ops 模块是如何由 bazel 生成的。
在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
库用于生成 python bazel-genfiles/tensorflow/python/ops/gen_io_ops.py
模块中的包装器。此文件生成可以通过巴塞尔的 tf_op_gen_wrapper_py
规则或 tf.load_op_library()
方法完成,但其中 none 似乎涉及。
有人知道第三步在构建过程中的什么地方定义吗?
终于明白了
确实有对 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
中)并在 tf_gen_op_wrapper_py
中添加 gen_
前缀,因此 gen_io_ops.py
模块将按此规则生成。