Сохранить модель для обслуживания TensorFlow с конечной точкой API, сопоставленной определенному методу с помощью SignatureDefs? - PullRequest
7 голосов
/ 05 марта 2019

Я недавно прошел этот урок .У меня есть обученная модель из учебника, и я хочу обслужить ее с помощью Docker, чтобы я мог отправить ей произвольную строку символов и получить прогноз из модели.

Я также прошел этот урок , чтобы понять, как работать с докером.Но я не понимал, как модель была сохранена с возможностью принимать входные параметры.Например:

    curl -d '{"instances": [1.0, 2.0, 5.0]}' \
        -X POST http://localhost:8501/v1/models/half_plus_two:predict

Как модель half_plus_two узнает, что делать с параметром instances?

В руководстве по генерации текста есть метод, называемый generate_textкоторый обрабатывает генерацию прогнозов.

    def generate_text(model, start_string):
        # Evaluation step (generating text using the learned model)

        # Number of characters to generate
        num_generate = 1000

        # Converting our start string to numbers (vectorizing) 
        input_eval = [char2idx[s] for s in start_string]
        input_eval = tf.expand_dims(input_eval, 0)

        # Empty string to store our results
        text_generated = []

        # Low temperatures results in more predictable text.
        # Higher temperatures results in more surprising text.
        # Experiment to find the best setting.
        temperature = 1.0

        # Here batch size == 1
        model.reset_states()
        for i in range(num_generate):
            predictions = model(input_eval)
            # remove the batch dimension
            predictions = tf.squeeze(predictions, 0)

            # using a multinomial distribution to predict the word returned by the model
            predictions = predictions / temperature
            predicted_id = tf.multinomial(predictions, num_samples=1)[-1,0].numpy()

            # We pass the predicted word as the next input to the model
            # along with the previous hidden state
            input_eval = tf.expand_dims([predicted_id], 0)

            text_generated.append(idx2char[predicted_id])

        return (start_string + ''.join(text_generated)) 

Как я могу обслуживать обученную модель из учебника по генерации текста и иметь входные параметры для модели, привязанные к уникальным методам, таким как generate_text?Например:

    curl -d '{"start_string": "ROMEO: "}' \
        -X POST http://localhost:8501/v1/models/text_generation:predict

1 Ответ

3 голосов
/ 14 марта 2019

Примечание . Чтобы полностью и всесторонне ответить на этот вопрос, потребовалось бы углубиться в архитектуру обслуживания, ее API-интерфейсы и то, как они взаимодействуют с сигнатурами моделей. Я пропущу все это, чтобы сохранить ответ на приемлемой длине, но я всегда могу расширить чрезмерно неясные части, если это необходимо (оставьте комментарий, если это так).

Как модель half_plus_two знает, что делать с параметром instance?

Из-за нескольких не упомянутых причин, которые накапливаются, чтобы сделать это удобным коротким примером, если только ИМО немного вводит в заблуждение.

1) Откуда берется параметр instances? Определение Predict API для RESTful API имеет предопределенный формат запроса, который в одном из двух возможных формы, принимает один instances параметр.

2) На что отображается параметр instances? Мы не знаем. для SignatureDefs только с одним входом instances в этом очень специфическом формате вызова отображается непосредственно на вход без необходимости указывать ключ ввода ( см. раздел «Задание входных тензоров в формате строки» в Спецификации API ).

Итак, что происходит: вы делаете POST-запрос к модели, в которой определен только один вход. Служба TF принимает эти входные данные и передает их в модель, запускает их до тех пор, пока не получит все значения для тензоров, определенных в части «выводы» сигнатуры модели, и вернет вам объект JSON с key:result элементами для каждого ключа в список «выходов».

Как я могу обслуживать обученную модель из учебника по генерации текста и иметь входные параметры для модели API, сопоставленные с уникальными методами, такими как generate_text?

Вы не можете (по крайней мере, напрямую не сопоставлять функцию с методом Serving). Инфраструктура обслуживания предоставляет некоторые предопределенные методы (regress, predict, classify), которые знают, как интерпретировать сигнатуры для получения запрошенного вами вывода, запустив конкретные подграфы модели. Эти подграфы должны быть включены в SavedModel, поэтому, например, использование tf.py_func не будет работать.

Ваш лучший шанс - попытаться описать генерацию текста как подграф TF (т.е. используя исключительно операции TF) и написать отдельный SignatureDef, который принимает начальную строку и num_generate в качестве входных данных.

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