Tensorflow Serving

TensorFlow Serving 是一个用于机器学习模型 serving 的高性能开源库。它可以将训练好的机器学习模型部署到线上,使用 gRPC 作为接口接受外部调用。更加让人眼前一亮的是,它支持模型热更新与自动模型版本管理。这意味着一旦部署 TensorFlow Serving 后,你再也不需要为线上服务操心,只需要关心你的线下模型训练。

export_path_base = sys.argv[-1]#导出的目录
export_path = os.path.join(
      compat.as_bytes(export_path_base),
      compat.as_bytes(str(FLAGS.model_version)))#model_version明确了保存的模型的版本
print 'Exporting trained model to', export_path
builder = tf.saved_model.builder.SavedModelBuilder(export_path)#如果目录不存在的话,将会创建目录
builder.add_meta_graph_and_variables(#此方法导入graph的信息以及变量
      sess, [tag_constants.SERVING],#标签名可以自定义,在之后载入模型的时候,需要根据这个标签名去查找对应的MetaGraphDef,找不到就会报RuntimeError。标签也可以选用系统定义好的参数,如tf.saved_model.tag_constants.SERVING与tf.saved_model.tag_constants.TRAINING。
      signature_def_map={
           'predict_images':
               prediction_signature,
           signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
               classification_signature,
      },
      legacy_init_op=legacy_init_op)
builder.save()

sess是Tensorflow session含有被导出的被训练的模型。

tags是标签化的模型,使用预定义的SavedModel tag constants.

signature_def_map user-supplied key: tensorflow::SignatureDef 明确了什么类型的模型被导出,什么类型的input/output tensors 被绑定,在inference的时候。

使用signature_def_utils.build_signature_def()去建立predict_signatureclassification_signature.

tf.saved_model.utils.build_tensor_info
tf.saved_model.signature_def_utils.build_signature_def

使用tf.saved_model.loader.load方法可以载入模型。

关于SignatureDef我的理解是,它定义了一些协议,对我们所需的信息进行封装,我们根据这套协议来获取信息,从而实现创建与使用模型的解耦。

下载完Tensorflow Serving,编译的命令:

bazel build -c opt //tensorflow_serving/model_servers:tensorflow_model_server


模型服务化,后边为保存模型的目录


bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/models/mnist_model/