Как отладить "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