Отмечая, что настоящий вопрос относится к Python, из Не зарегистрирован OpKernel для поддержки Op 'PyFunc' при загрузке модели в Java, кажется, что это нелегко (возможно?) определите пользовательскую / произвольную функцию в Python и вызовите ее при обслуживании в тензорном потоке.
Это правда, и если нет, то как ее можно достичь (в TF 1.x и / или TF 2.x)?
Мои причины для использования функции python состоят в том, чтобы (i) иногда реализовывать произвольные функциональные возможности, основанные на не-TF-примитивах, и (ii) избегать преобразования множества существующих функционирует в версиях с использованием примитивов TF, где это возможно. Я также интенсивно использую numpy и scipy.
Согласно https://www.tensorflow.org/api_docs/python/tf/compat/v1/py_func:
tf.compat.v1.py_fun c Операция () имеет следующие известные ограничения:
Тело функции (т.е. fun c) не будет сериализовано в GraphDef. Поэтому вам не следует использовать эту функцию, если вам нужно сериализовать вашу модель и восстановить ее в другой среде.
, но там не дано никакого решения. Настройка py_fun c op после импорта GraphDef в TensorFlow подразумевает, что Python функция может быть сериализована в графе, но мне не ясно, как можно вызвать это от TF-сервировки.
Может быть некоторая надежда через https://github.com/endernewton/tf-faster-rcnn/issues/113#issuecomment -306535076
Вот пример кода:
import numpy as np
import tensorflow.compat.v1 as tf
from tensorflow.python.framework import ops
tf.disable_v2_behavior()
tf.compat.v1.disable_eager_execution()
@tf.function
def validate_against_test_string(input_string):
test_string = '1234'
# The following line is a placeholder for code that cannot be written using TF primitives
# (I am fully aware that the following line can be written using TF primitives)
test = input_string == test_string
return test
np_validate_against_test_string = np.vectorize(validate_against_test_string)
def tf_validate_against_test_string(x,name=None):
with tf.name_scope(name, "validate_against_test_string", [x]) as name:
y = tf.numpy_function(np_validate_against_test_string,
[x],
[tf.bool],
name=name))
return y[0]
my_input_string = tf.placeholder(tf.string,name=u'my_input_string')
check_string = tf_validate_against_test_string(my_input_string,name=u'check_string')
sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf.compat.v1.saved_model.simple_save(sess,u'models/my_model',inputs={u"my_input_string": my_input_string},outputs={u"check_string": check_string})
sess.close()
Затем в Службе тензорного потока:
export $MODEL=my_model
docker run -p 8501:8501 --mount type=bind,source=$MODEL,target=/models/$MODEL -e MODEL_NAME=$MODEL -t tensorflow/serving
Это приводит к следующей ошибке, прежде чем я даже вызываю ее через curl (обратите внимание, что DT_INT16 и check_a_2 укажите c к моей проблеме с доменом):
external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:333] SavedModel load for tags { serve }; Status: fail: Invalid argument: No OpKernel was registered to support Op 'PyFuncStateless' used by {{node check_a_2}}with these attrs: [_output_shapes=[<unknown>], Tin=[DT_INT16], Tout=[DT_INT16], token="pyfunc_0"]
Registered devices: [CPU]
Registered kernels:
<no registered kernels>
Извиняюсь за любое смешивание TF 1.x / 2.x и других подобных наихудших практик.