2017-08-02 70 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模塊將由此規則生成。

相關問題