如何在tensorflow服务中保存并提供tf.contrib.learn广泛深度模型?

时间:2016-10-27 21:59:58

标签: tensorflow tensorflow-serving

我想使用类型tf.contrib.learn.DNNLinearCombinedClassifier的模型的导出方法来保存模型,然后编写tensorflow服务客户端来请求模型的预测。

有人可以解释一下:

  1. 如何根据教程中input_fn的结果或预先训练的估算工具的任何其他部分为BaseEstimator.export创建参数?

  2. 如何创建要发送到tensorflow服务器实例的request=predict_pb2.PredictRequest()

2 个答案:

答案 0 :(得分:1)

我在这里写了一个简单的教程Exporting and Serving a TensorFlow Wide & Deep Model

要导出估算器,有四个步骤:

  1. 将导出功能定义为估算器初始化期间使用的所有功能的列表。

  2. 使用create_feature_spec_for_parsing创建功能配置。

  3. 使用serving_input_fn构建适合使用的input_fn_utils.build_parsing_serving_input_fn

  4. 使用export_savedmodel()导出模型。

  5. 要正确运行客户端脚本,您需要执行以下三个步骤:

    1. 创建并将脚本放在/ serve /文件夹中的某个位置,例如/服务/ tensorflow_serving /示例/

    2. 通过添加py_binary

    3. 来创建或修改相应的BUILD文件
    4. 构建并运行模型服务器,例如tensorflow_model_server

    5. 创建,构建并运行一个客户端,该客户端将tf.Example发送到我们的tensorflow_model_server进行推断。

    6. 如果您的模型是使用Estimator.export_savedmodel()导出的,并且您成功构建了TensorFlow服务,那么您可以执行以下操作:

      from grpc.beta import implementations
      from tensorflow_serving.apis import predict_pb2
      from tensorflow_serving.apis import prediction_service_pb2
      
      tf.app.flags.DEFINE_string('server', 'localhost:9000', 'Server host:port.')
      tf.app.flags.DEFINE_string('model', 'wide_and_deep', 'Model name.')
      FLAGS = tf.app.flags.FLAGS
      ...
      def main(_):
      
        host, port = FLAGS.server.split(':')
        # Set up a connection to the TF Model Server
        channel = implementations.insecure_channel(host, int(port))
        stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
      
        # Create a request that will be sent for an inference
        request = predict_pb2.PredictRequest()
        request.model_spec.name = FLAGS.model
        request.model_spec.signature_name = 'serving_default'
      
        # A single tf.Example that will get serialized and turned into a TensorProto
        feature_dict = {'age': _float_feature(value=25),
                        'capital_gain': _float_feature(value=0),
                        'capital_loss': _float_feature(value=0),
                        'education': _bytes_feature(value='11th'.encode()),
                        'education_num': _float_feature(value=7),
                        'gender': _bytes_feature(value='Male'.encode()),
                        'hours_per_week': _float_feature(value=40),
                        'native_country': _bytes_feature(value='United-States'.encode()),
                        'occupation': _bytes_feature(value='Machine-op-inspct'.encode()),
                        'relationship': _bytes_feature(value='Own-child'.encode()),
                        'workclass': _bytes_feature(value='Private'.encode())}
        label = 0
      
        example = tf.train.Example(features=tf.train.Features(feature=feature_dict))
        serialized = example.SerializeToString()
      
        request.inputs['inputs'].CopyFrom(
          tf.contrib.util.make_tensor_proto(serialized, shape=[1]))
      
        # Create a future result, and set 5 seconds timeout
        result_future = stub.Predict.future(request, 5.0)
        prediction = result_future.result().outputs['scores']
      
        print('True label: ' + str(label))
        print('Prediction: ' + str(np.argmax(prediction)))
      

      有关详细信息,请查看教程本身。

      希望它有所帮助。

      P.S。 此类问题至少还有4个重复项。如果有高代表的人可以关闭或分组,那就太好了)

答案 1 :(得分:0)

我按照你提供的参考链接: https://github.com/MtDersvan/tf_playground/blob/master/wide_and_deep_tutorial/wide_and_deep_basic_serving.md

您在哪里定义签名? 的 serving_default 我认为当你导出你的模型然后它是必需的。但是在你的导出代码中没有提到。请定义它。