Как передать произвольную функцию Python на обслуживание Tensorflow? - PullRequest
0 голосов
/ 14 апреля 2020

Отмечая, что настоящий вопрос относится к 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 и других подобных наихудших практик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...