我對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