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_pathbuilder = 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_signature
和classification_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/