Jestem całkiem nowy w TensorFlow i właśnie teraz zajmuję się niestandardowym rozwojem op. Przeczytałem już oficjalny tutorial, ale czuję, że wiele rzeczy dzieje się za kulisami i nie zawsze chcę umieścić moje niestandardowe ops w katalogu user_ops.Zapoznaj się z rejestracją i łączeniem jądra w TensorFlow
Jako taki, podjąłem się example word2vec
który wykorzystuje niestandardowe "Skipgram" OP, którego rejestracja jest zdefiniowany tutaj:
/word2vec_ops.cc
i którego jądro realizacja jest tutaj:
/word2vec_kernels.cc
Patrząc na plik budowy, próbowałem zbudować pojedyncze cele
1) bazel build -c opt tensorflow/models/embedding:word2vec_ops
Generuje to wiązkę plików obiektów zgodnie z oczekiwaniami.
2) bazel build -c opt tensorflow/models/embedding:word2vec_kernels
To samo dotyczy tego.
3) bazel build -c opt tensorflow/models/embedding:word2vec_kernels:gen_word2vec
Ten ostatni build używa niestandardową regułę mianowicie tf_op_gen_wrapper_py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tensorflow.bzl#L197-L231
warto zauważyć, że to zależy tylko od op rejestracji, a nie na samym jądrze.
Wszakże powyżej, jeżeli buduję sam py_binary
użyciu
bazel build -c opt tensorflow/models/embedding:word2vec
to działa dobrze, ale nie widzę, gdzie i jak C++ kod jądra związane?
Dodatkowo, chciałbym również zrozumieć regułę tf_op_gen_wrapper_py
i całą procedurę kompilacji/łączenia, która idzie w parze z rejestracją operacji.
Dzięki.
@ mrry- Wielkie dzięki za szczegółową odpowiedź. Ma to sens teraz. :) – Abhi
Mogę dodać, że zostałem wypalony, próbując powiązać "niestandardowe" operacje syntaxnetu z zewnętrznym binarnym, ponieważ cel BUILD w syntaksonie dla jednego z ops brakuje "alwayslink = 1". Myślę, że dzieje się tak dlatego, że bez "alwayslink" odpowiedni plik ".o" nie jest połączony (nie ma żadnych symbolicznych zależności na samym OpKernelu) i to się nie rejestruje. Gdy "alwayslink = 1" jest obecne, ".o" jest połączone i statycznie rejestruje OpKernel, gdy ładowany jest plik binarny. – dmansfield