Примечание . Чтобы полностью и всесторонне ответить на этот вопрос, потребовалось бы углубиться в архитектуру обслуживания, ее 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
в качестве входных данных.