私はTensorFlowを初めて使っていて、今すぐカスタムop開発を検討しています。私はすでに公式のチュートリアルを読んでいますが、多くのことが舞台裏で起こっていると感じています。私はいつもカスタム操作をuser_opsディレクトリに入れたいとは思っていません。
/word2vec_ops.cc
とそのカーネルの実装ここにある:
など、私が登録ここで定義されたカスタム "Skipgram" のOPを使用していますexample word2vecTensorFlowでOp登録とカーネルリンクを理解する
を取り上げたとして
/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
opsのうちの1つのsyntaxnet内のBUILDターゲットに "alwayslink = 1"がないため、シンタックスネット "カスタム" opsを外部バイナリにリンクしようとすると燃えていると付け加えることがあります。これは、 "alwayslink"がないと、関連する ".o"ファイルがリンクされていない(OpKernel自体にシンボリック依存関係がない)ため、登録されないためです。 "alwayslink = 1"が存在する場合、 ".o"がリンクされ、バイナリがロードされるときにOpKernelが静的に登録されます。 – dmansfield