tensorflow serving踩坑记录

参考:https://blog.csdn.net/luoyexuge/article/details/79821668

clone代码

git clone --recurse-submodules https://github.com/tensorflow/serving
cd serving

创建tensorflow_serving

bazel build tensorflow_serving/…

测试

bazel test tensorflow_serving/…

准备模型

import tensorflow as  tf
import  numpy as np
import  os
tf.app.flags.DEFINE_integer('training_iteration', 300,
'number of training iterations.')
tf.app.flags.DEFINE_integer('model_version', 1, 'version number of the model.')
tf.app.flags.DEFINE_string('work_dir', 'model/', 'Working directory.')
FLAGS = tf.app.flags.FLAGS
 
sess = tf.InteractiveSession()
 
x = tf.placeholder('float', shape=[None, 3])
y_ = tf.placeholder('float', shape=[None, 1])
w = tf.get_variable('w', shape=[3, 1], initializer=tf.truncated_normal_initializer)
b = tf.get_variable('b', shape=[1], initializer=tf.zeros_initializer)
 
sess.run(tf.global_variables_initializer())
 
y = tf.matmul(x, w) + b
 
ms_loss = tf.reduce_mean((y - y_) ** 2)
 
train_step = tf.train.GradientDescentOptimizer(0.005).minimize(ms_loss)
 
train_x = np.random.randn(1000, 3)
# let the model learn the equation of y = x1 * 1 + x2 * 2 + x3 * 3
train_y = np.sum(train_x * np.array([1, 2, 3]) + np.random.randn(1000, 3) / 100, axis=1).reshape(-1, 1)
 
train_loss = []
 
for _ in range(FLAGS.training_iteration):
    loss, _ = sess.run([ms_loss, train_step], feed_dict={x: train_x, y_: train_y})
    train_loss.append(loss)
print('Training error %g' % loss)
export_path_base = FLAGS.work_dir
export_path = os.path.join(
    tf.compat.as_bytes(export_path_base),
    tf.compat.as_bytes(str(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
 
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
 
prediction_signature = (
    tf.saved_model.signature_def_utils.build_signature_def(
        inputs={'input': tensor_info_x},
        outputs={'output': tensor_info_y},
        method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))
 
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
 
builder.add_meta_graph_and_variables(
    sess, [tf.saved_model.tag_constants.SERVING],
    signature_def_map={
        'prediction':
            prediction_signature,
    },
    legacy_init_op=legacy_init_op)
 
builder.save()
 
print('Done exporting!')
 
print('Done training!')

启动服务

bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server  --port=9000 --model_name=example_model --model_base_path=/path/model

启动客户端

python client.py

from grpc.beta import implementations
import numpy
import tensorflow as tf
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2
 
tf.app.flags.DEFINE_string('server', 'localhost:9000', 'PredictionService host:port')
FLAGS = tf.app.flags.FLAGS
 
 
def do_inference(hostport):
    """Tests PredictionService with concurrent requests.
    Args:
    hostport: Host:port address of the Prediction Service.
    Returns:
    pred values, ground truth label
    """
    # create connection
    host, port = hostport.split(':')
    channel = implementations.insecure_channel(host, int(port))
    stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
 
    # initialize a request
    request = predict_pb2.PredictRequest()
    request.model_spec.name = 'example_model'
    request.model_spec.signature_name = 'prediction'
 
    # Randomly generate some test data
    temp_data = numpy.random.randn(10, 3).astype(numpy.float32)
    data, label = temp_data, numpy.sum(temp_data * numpy.array([1, 2, 3]).astype(numpy.float32), 1)
    request.inputs['input'].CopyFrom(
        tf.contrib.util.make_tensor_proto(data, shape=data.shape))
 
    # predict
    result = stub.Predict(request, 5.0)  # 5 seconds
    return result, label
 
 
def main(_):
    if not FLAGS.server:
        print('please specify server host:port')
        return
 
    result, label = do_inference(FLAGS.server)
    print('Result is: ', result)
    print('Actual label is: ', label)
 
 
if __name__ == '__main__':
    tf.app.run()

错误1:

ERROR: Process exited with status 127: Process exited with status 127
/bin/sh: /proc/self/cwd/tools/gen_status_stamp.sh: No such file or directory
INFO: Elapsed time: 75.434s, Critical Path: 0.04s
INFO: 0 processes.
FAILED: Build did NOT complete successfully

解决方法:

修改文件
./tools/bazel.rc
最后一行
build --workspace_status_command=/proc/self/cwd/tools/gen_status_stamp.sh
=>
build --workspace_status_command=tools/gen_status_stamp.sh 

你可能感兴趣的:(c++,python,tensorflow)