2017-08-02 1 views
1

J'essaie de déterminer comment le module gen_io_ops est généré par bazel lors de la construction de TensorFlow à partir de la source.Où est la règle bazel qui génère le fichier `gen_io_ops.py` lors de la construction de TensorFlow à partir de sources?


Dans tensorflow/python/ops/io_ops.py, il y a ce morceau de code:

from tensorflow.python.ops.gen_io_ops 
[...] 

# used in the TextLineReader initialization 
rr = gen_io_ops._text_line_reader_v2(...) 

se référant au module bazel-genfiles/tensorflow/python/ops/gen_io_ops.py (et généré par bazel lors de la construction tensorflow).
Le _text_line_reader_v2 est un wrapper de TextLineReaderV2 défini dans tensorflow/tensorflow/core/kernels/text_line_reader_op.cc.

Pour autant que je comprends, l'étape de construction sont les suivants:


1) La bibliothèque du noyau pour le text_line_reader_op est construit en tensorflow/tensorflow/core/kernels/BUILD

tf_kernel_library(
     name = "text_line_reader_op", 
     prefix = "text_line_reader_op", 
     deps = IO_DEPS,) 

tf_kernel_library regarde essentiellement pour text_line_reader_op.c fichier et le construire.


2) La bibliothèque du noyau :text_line_reader_op est ensuite utilisé comme une dépendance par la bibliothèque io définie dans the same file:

cc_library(
    name = "io", 
    deps = [  
     ":text_line_reader_op", ... 
    ], 
) 

Je suppose que la bibliothèque io contient maintenant la définition du noyau TextLineReaderV2.


D'après ce que je reçois de ce answer, il devrait y avoir une troisième étape où la bibliothèque io est utilisée pour générer les emballages de python qui sont dans le module bazel-genfiles/tensorflow/python/ops/gen_io_ops.py. Cette génération de fichier peut être effectuée par la règle tf_op_gen_wrapper_py dans Basel ou par la méthode tf.load_op_library(), mais aucune d'entre elles ne semble impliquée.

Est-ce que quelqu'un sait où cette troisième étape est définie dans le processus de construction?

Répondre

1

J'ai finalement compris.


Il y a en effet un appel à tf_op_gen_wrapper_py mais il est caché dans un appel à 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, ... 

Ainsi, les étapes sont les suivantes.

En tensorflow/tensorflow/python/BUILD, il y a cette règle

tf_gen_op_wrapper_private_py(
    name = "io_ops_gen", 
    [...] 
) 

Et, dans cette règle le suffixe _gen seront supprimés (en tf_gen_op_wrapper_private_py) et un préfixe gen_ seront ajoutés dans tf_gen_op_wrapper_py et donc le module gen_io_ops.py sera généré par cette règle.