我正在尝试确定从源代码构建 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
内核库被同一文件中io
定义的库用作依赖项:
cc_library(
name = "io",
deps = [
":text_line_reader_op", ...
],
)
我想这个io
库现在包含TextLineReaderV2
内核的定义。
从我从这个答案中得到的信息来看,应该有第三步,该io
库用于生成bazel-genfiles/tensorflow/python/ops/gen_io_ops.py
模块中的 python 包装器。这个文件生成可以通过tf_op_gen_wrapper_py
Basel中的规则或tf.load_op_library()
方法来完成,但它们似乎都没有涉及。
有人知道这第三步在构建过程中是在哪里定义的吗?
我终于明白了。
确实有一个调用,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
,因此gen_io_ops.py
此规则将生成模块。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句