2017-08-02 34 views
1

我试图确定从源构建TensorFlow时,bazel如何生成gen_io_ops模块。从源构建TensorFlow时,bazel规则在哪里生成`gen_io_ops.py`文件?


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当由巴泽勒生成)。
_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()方法来完成,但它们都没有涉及。

有人知道在构建过程中何处定义了第三步吗?

回答

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被添加,因此gen_io_ops.py模块将由此规则生成。

相关问题