我对TensorFlow相当陌生,现在正在研究自定义op开发。我已经阅读过官方教程,但是我感觉幕后发生了很多事情,我并不总是希望将我的自定义操作放在user_ops目录中。了解Op注册和TensorFlow中的内核链接
因此,我拿起一个example 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
有趣的注意,这仅取决于作品登记,而不是内核本身。
以上所有之后,如果我使用
bazel build -c opt tensorflow/models/embedding:word2vec
它工作正常建立py_binary
本身,但我看不出在哪里以及如何内核的C++代码链接?
此外,我还想了解tf_op_gen_wrapper_py
规则以及ops注册背后的整个编译/链接过程。
谢谢。
@ mrry-非常感谢您的详细回复。现在有道理。 :) – Abhi
我可能会补充说我试图将syntaxnet“custom”操作链接到外部二进制文件,因为其中一个操作的syntaxnet中的BUILD目标缺少“alwayslink = 1”。我认为这是因为没有“always链接”,相关的“.o”文件没有链接(OpKernel本身没有符号依赖关系),并且它没有注册。当“alwayslink = 1”出现时,“.o”被链接,并在加载二进制文件时静态注册OpKernel。 – dmansfield