Как отладить "INVALID_ARGUMENT: псевдоним входного тензора не найден в подписи"

Я пытаюсь получить доступ к моей модели обслуживания tenorflow, которая имеет сигнатуру, как видно из этого сегмента кода:

regression_signature = predict_signature_def(
    inputs={"phase_features" : phase_features},
    outputs={"phase_weight": phase_weight}
)

builder.add_meta_graph_and_variables(
    sess=sess, 
    tags=[tag_constants.SERVING],
    signature_def_map={'regress_phase_weight': regression_signature})
builder.save()

Он загружается в tf-сервер с помощью файла конфигурации модели со следующим содержимым:

model_config_list: {
  config: {
    name: "PhaseModificationWeightRegressor",
    base_path: "../../models/phase-mod-weights",
    model_platform: "tensorflow"
  }
}

Сейчас я пытаюсь создать запрос из Java на основе протоколов TensorFlow API и TensorFlow Serving API:

...
tensorflow.serving.Model.ModelSpec.Builder modelSped = ModelSpec.newBuilder()
              .setName("PhaseModificationWeightRegressor") // name as defined in the tensorflow serving model config file
              .setSignatureName("regress_phase_weight") // signature name as defined in signature_def_map of add_meta_graph_and_variables of your SavedModelBuilder
              .setVersion(Int64Value.newBuilder().setValue(1)); // model version as indicated by the version of your model when saving it

tensorflow.serving.Predict.PredictRequest.Builder requestBuilder = PredictRequest.newBuilder()
              .setModelSpec(modelSped)
              .putInputs("phase_features", createTensorProto(phaseFeatures));

      return requestBuilder.build();

К сожалению, я получаю исключение:

Exception in thread "main" io.grpc.StatusRuntimeException: INVALID_ARGUMENT: input tensor alias not found in signature: phase_features

Из того, что я понимаю, это означает, что оно достигло сервера, НАЙДЕНО моей модели с именем "PhaseModificationWeightRegressor" в версии 1, НАЙДЕНО подпись с именем "regress_phase_weight", но не смог найти логическое имя (псевдоним) "phase_features", которое приводит к соответствующему заполнителю, Что-нибудь еще, что могло быть проблемой? Сейчас я смотрю на это с двух часов, но не вижу проблемы / опечатки и т. Д., Которая делает это неэффективным.

Есть идеи, что может быть не так? Как я могу отладить это лучше? Возможно, в будущем TFserving должен ответить на то, что он ожидает вместо этого.

1 ответ

Я решил с:

.putInputs ("входы", createTensorProto(phaseFeatures));

Кажется, что псевдоним, который будет использоваться от клиента, является в точности "входными данными", в то время как код Python остается тем же. С этой модификацией мой код работает.

==== ====UPDATE

Я также проверил это с моделью с несколькими (двумя) входами. В этом случае вы должны использовать псевдоним, который вы используете при экспорте модели.

Другие вопросы по тегам