Tensorflow服务预测REST API'未正确格式化为base64数据'错误

问题描述 投票:3回答:1

我保存了Tensorflow模型并使用Tensorflow服务(tensorflow / serving:1.12.0和tensorflow / serving:1.12.0-gpu)服务它。

我想使用Predict REST API,但是调用失败并且“未正确格式化base64数据”错误。

请求:

POST / v1 / models / payfraud:预测

{
  "inputs": [
    {
      "payFraudInput": [[44.26, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]]
    }
  ]
}

响应:

400

{
    "error": "JSON Value: {\n    \"payFraudInput\": [\n        [\n            44.26,\n            0,\n            0,\n            0,\n            0,\n            1,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0,\n            0\n        ]\n    ]\n} not formatted correctly for base64 data"
}

模型输入期待DT_FLOAT,所以我认为我不应该需要base64编码。

POST / v1 / models / payfraud / versions / 1 / metadata

{
    "model_spec": {
        "name": "payfraud",
        "signature_name": "",
        "version": "1"
    },
    "metadata": {
        "signature_def": {
            "signature_def": {
                "predict_fraud": {
                    "inputs": {
                        "payFraudInput": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "15",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "payFraudInput:0"
                        }
                    },
                    "outputs": {
                        "payFraudOutput": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "2",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "payFraudOutput:0"
                        }
                    },
                    "method_name": "tensorflow/serving/predict"
                },
                "serving_default": {
                    "inputs": {
                        "inputs": {
                            "dtype": "DT_STRING",
                            "tensor_shape": {
                                "dim": [],
                                "unknown_rank": true
                            },
                            "name": "tf_example:0"
                        }
                    },
                    "outputs": {
                        "classes": {
                            "dtype": "DT_STRING",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "2",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "index_to_string_Lookup:0"
                        },
                        "scores": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "2",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "TopKV2:0"
                        }
                    },
                    "method_name": "tensorflow/serving/classify"
                }
            }
        }
    }
}

这就是模型的保存方式:

    prediction_signature = (
      tf.saved_model.signature_def_utils.build_signature_def(
          inputs={"payFraudInput": tensor_info_x},
          outputs={"payFraudOutput": tensor_info_y},
          method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

    classification_signature = (
       tf.saved_model.signature_def_utils.build_signature_def(
          inputs={
              tf.saved_model.signature_constants.CLASSIFY_INPUTS:
                  classification_inputs
          },
          outputs={
              tf.saved_model.signature_constants.CLASSIFY_OUTPUT_CLASSES:
                  classification_outputs_classes,
              tf.saved_model.signature_constants.CLASSIFY_OUTPUT_SCORES:
                  classification_outputs_scores
          },
          method_name=tf.saved_model.signature_constants.CLASSIFY_METHOD_NAME))

    export_path = os.path.join(tf.compat.as_bytes(export_dir), tf.compat.as_bytes("1"))
    print('Exporting trained model to ', export_path)
    builder = tf.saved_model.builder.SavedModelBuilder(export_path)
    builder.add_meta_graph_and_variables( sess, [tf.saved_model.tag_constants.SERVING],
        signature_def_map={
            'predict_fraud':
                 prediction_signature,
             tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
                 classification_signature,
        },
        main_op=tf.tables_initializer(),
        strip_default_attrs=True)

    builder.save()
    print('Done exporting!')

尝试b64也不起作用:

请求

{
  "inputs": [
    {
      "payFraudInput":{"b64":"NDQuMjYsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDA="}
    }
  ]
}

响应

{
    "error": "JSON Value: {\n    \"payFraudInput\": {\n        \"b64\": \"NDQuMjYsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDA=\"\n    }\n} not formatted correctly for base64 data"
}

我究竟做错了什么?

python rest tensorflow tensorflow-serving
1个回答
0
投票

在清理并简化模型保存训练脚本之后,我得到了预测响应。

保存现在看起来像这样:

    export_path = os.path.join(tf.compat.as_bytes(export_dir), tf.compat.as_bytes("1"))
    builder = tf.saved_model.builder.SavedModelBuilder(export_path)

    predict_signature_def = (
        tf.saved_model.signature_def_utils.predict_signature_def({"x": X}, {"y": Y_hat}))
    signature_def_map = {
        tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
            predict_signature_def
    }
    sess.run(tf.global_variables_initializer())
    builder.add_meta_graph_and_variables(
        sess, [tf.saved_model.tag_constants.SERVING],
        signature_def_map=signature_def_map)
    builder.save()

我可以从Tensorflow服务获得有效的回复:

预测请求:

POST / v1 / models / payfraud:预测

{
  "inputs": [[44.26, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
}

预测响应:

{
    "outputs": [
        [
            0.5,
            0.5
        ]
    ]
}

GET / v1 / models / payfraud / versions / 1 / metadata

{
    "model_spec": {
        "name": "payfraud",
        "signature_name": "",
        "version": "1"
    },
    "metadata": {
        "signature_def": {
            "signature_def": {
                "serving_default": {
                    "inputs": {
                        "x": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "15",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "x:0"
                        }
                    },
                    "outputs": {
                        "y": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [
                                    {
                                        "size": "-1",
                                        "name": ""
                                    },
                                    {
                                        "size": "2",
                                        "name": ""
                                    }
                                ],
                                "unknown_rank": false
                            },
                            "name": "y:0"
                        }
                    },
                    "method_name": "tensorflow/serving/predict"
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.