Ошибка REST API прогноза обслуживания Tensorflow «неправильно отформатирован для данных base64» Ошибка - PullRequest
3 голосов
/ 19 апреля 2019

Я сохранил модель Tensorflow и обслуживаю ее, используя Tensorflow Serving (тензор потока / обслуживание: 1.12.0 и тензор потока / обслуживание: 1.12.0-gpu).

Я хочу использовать API Predict REST, но вызов не выполняется с ошибкой «неправильно отформатирован для данных 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 / версии / 1 / метаданные

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

Что я делаю не так?

1 Ответ

0 голосов
/ 21 апреля 2019

После очистки и упрощения модели сохранения фрагмента учебного сценария я получаю ответ на прогноз.

Сохранение теперь выглядит так:

    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 / версии / 1 / метаданные

{
    "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"
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...