Ich bin ziemlich neu in TensorFlow und jetzt in die benutzerdefinierte OP-Entwicklung. Ich habe bereits das offizielle Tutorial gelesen, aber ich fühle, dass hinter den Kulissen viele Dinge passieren und ich möchte meine benutzerdefinierten Ops nicht immer in user_ops Verzeichnis einfügen.Verstehen Sie die Op-Registrierung und Kernel-Verknüpfung in TensorFlow
Als solches ich nahm ein example word2vec
, die einen eigenen "Skipgram" op verwendet, deren Registrierung hier definiert ist:
/word2vec_ops.cc
und Kernel-Implementierung, die hier:
/word2vec_kernels.cc
Mit Blick auf die Build-Datei, ich habe versucht, individuelle Ziele
012 zu bauen1) bazel build -c opt tensorflow/models/embedding:word2vec_ops
Dies generiert Bündel von Objektdateien wie erwartet.
2) bazel build -c opt tensorflow/models/embedding:word2vec_kernels
Gleiches für diese.
3) bazel build -c opt tensorflow/models/embedding:word2vec_kernels:gen_word2vec
Dieser letzte Build verwendet eine benutzerdefinierte Regel nämlich tf_op_gen_wrapper_py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tensorflow.bzl#L197-L231
Interessant zu beachten, dass dies nur auf Op Registrierung abhängig und nicht auf dem Kernel selbst.
Schließlich oben, wenn ich py_binary
bauen sich
bazel build -c opt tensorflow/models/embedding:word2vec
es funktioniert gut, aber ich sehe nicht, wo und wie der Kernel C++ Code verknüpft?
Zusätzlich würde ich auch gerne die tf_op_gen_wrapper_py
Regel und die ganze Compilation/Linking-Prozedur, die hinter den Kulissen für die Ops-Registrierung geht, verstehen.
Danke.
@ mrry- Vielen Dank für die detaillierte Antwort. Es macht jetzt Sinn. :) – Abhi
Ich könnte hinzufügen, dass ich verbrannt wurde versucht, die Syntaxnet "benutzerdefinierte" ops in eine externe Binärdatei zu verknüpfen, weil das BUILD-Ziel in Syntaxnet für eine der Ops fehlt "alwayslink = 1". Ich denke, das liegt daran, dass ohne den "alwayslink" die relevante ".o" -Datei nicht verknüpft ist (es gibt keine symbolischen Abhängigkeiten vom OpKernel selbst) und dies wird nicht registriert. Wenn "alwayslink = 1" vorhanden ist, wird das ".o" verknüpft und registriert den OpKernel statisch, wenn die Binärdatei geladen wird. – dmansfield