如何调试 "INVALID_ARGUMENT: input tensor alias not found in signature"

How to debug "INVALID_ARGUMENT: input tensor alias not found in signature"

我正在尝试访问我的 tensorflow 服务模型,该模型具有从该代码段中可以看出的签名:

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"
  }
}

现在我正在尝试基于 TensorFlow API 和 TensorFlow Serving API 原型从 Java 创建请求:

...
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

据我了解,这意味着它已到达服务器,在版本 1 中找到名为 "PhaseModificationWeightRegressor" 的模型,找到名为 "regress_phase_weight" 的签名,但找不到逻辑名称(别名) "phase_features" 导致相应的占位符。还有什么可能是问题吗?我现在已经关注了 2 个小时,但看不到 problem/typo 等,这使得它不起作用。

知道哪里出了问题吗?我怎样才能更好地调试它?也许在未来,TFserving 应该回答它所期望的。

我解决了:

‍.putInputs("inputs", createTensorProto(phaseFeatures));

客户端使用的别名似乎完全是"inputs",而python代码保持不变。 通过此修改,我的代码可以正常工作。

UPDATE:我还使用具有多个(两个)输入的模型对其进行了测试。在这种情况下,您应该使用导出模型时使用的别名。