我是TensorFlow的新手,现在正在研究定制的op开发.我已经阅读了官方教程,但我觉得很多事情都发生在幕后,我并不总是想把我的自定义操作放在user_ops目录中.
因此,我举了一个例子word2vec
它使用自定义的"Skipgram"操作,其注册定义如下:
/word2vec_ops.cc
,其内核实现位于:
/word2vec_kernels.cc
查看构建文件,我尝试构建单个目标
1)bazel build -c opt tensorflow/models/embedding:word2vec_ops
这会按预期生成一堆目标文件.
2)bazel build -c opt tensorflow/models/embedding:word2vec_kernels
同样的.
3) bazel build -c opt tensorflow/models/embedding:word2vec_kernels:gen_word2vec
最后一个版本使用自定义规则,即tf_op_gen_wrapper_py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tensorflow.bzl#L197-L231
有趣的是,这只取决于操作注册而不是内核本身.
毕竟,如果我py_binary使用自己构建自己
bazel build -c opt tensorflow/models/embedding:word2vec
它工作正常,但我没有看到内核c ++代码链接的位置和方式?
另外,我还想了解tf_op_gen_wrapper_py操作注册的幕后规则和整个编译/链接过程.
谢谢.