本文讲解如何使用TensorFlow Severing落地一个训好的模型。
# 从https://github.com/bazelbuild/bazel/releases下载bazel安装包
cd ~/Downloads
chmod +x bazel-0.4.5-installer-linux-x86_64.sh
./bazel-0.4.5-installer-linux-x86_64.sh --user
export PATH="$PATH:$HOME/bin"
source ~/.bashrc
gRPC需要版本号>=1.0.0,安装如下:
$ pip install grpcio
sudo apt-get update && sudo apt-get install -y \
build-essential \
curl \
libcurl3-dev \
git \
libfreetype6-dev \
libpng12-dev \
libzmq3-dev \
pkg-config \
python-dev \
python-numpy \
python-pip \
software-properties-common \
swig \
zip \
zlib1g-dev
pip install tensorflow-serving-api
优先安装tensorflow-model-server
,如果不成功,则先卸载,再安装tensorflow-model-server-universal
。卸载方法:
sudo apt-get remove tensorflow-model-server
安装方法
# 1. Add TensorFlow Serving distribution URI as a package source (one time setup)
echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list
curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | sudo apt-key add -
# 2. Install and update TensorFlow ModelServer
sudo apt-get update && sudo apt-get install tensorflow-model-server
安装成功后,可执行文件可通过tensorflow_model_server
打开。之后升级可通过如下命令进行:
sudo apt-get upgrade tensorflow-model-server
我们首先训练一个简单模型,然后进行Servering。
需要的代码:
- 模型训练、导出代码,mnist_saved_model.py;
- C++代码,编译产生ModelServer二进制程序,main.cc。
注意:Python环境为2.7版本,不支持Python3。
训练代码常规训练一致,此处略。
使用SavedModelBuilder模块对模型进行导出。训好的模型通过SavedModelBuilder
保存一份"快照",以便之后加载用于inference。在本例中,导出模型的过程如下:
from tensorflow.python.saved_model import builder as saved_model_builder
...
export_path_base = sys.argv[-1]
export_path = os.path.join(
compat.as_bytes(export_path_base),
compat.as_bytes(str(FLAGS.model_version)))
print 'Exporting trained model to', export_path
builder = saved_model_builder.SavedModelBuilder(export_path)
builder.add_meta_graph_and_variables(
sess,
[tag_constants.SERVING],
signature_def_map={ # signature
'predict_images': prediction_signature,
signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: classification_signature,
},
legacy_init_op=legacy_init_op)
builder.save()
signature_def_map
参数指明了什么类型的模型将要导出,和模型的输入/输出tensors。
通过tf.saved_model.signature_def_utils
模块可以构造signature。例如本例中,prediction_signature
构造方法如下:
prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={'images': tensor_info_x}, # 输入Tensor信息
outputs={'scores': tensor_info_y}, # 输出Tensor信息
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)) # inference方式
method_name
指定inference方式,对于预测请求,应该设置成tensorflow/serving/predict
。更多inference方式见: signature_constants.py。
实干
执行代码:
python mnist_saved_model.py mnist_model
执行结束后将会在mnist_model
文件夹中产生导出的模型。版本号1子目录中有两个文件:
saved_model.pb
序列化的模型定义。variables
序列化的变量
tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=./mnist_model/
本例中使用mnist_client脚本来测试Server。这个脚本先下载一些测试数据,然后发送服务器请求,最后计算inference误差。
运行方式
python mnist_client.py --num_tests=1000 --server=localhost:9000
本例中大概可以取得91%正确率。
前文使用Python作为客户端,在本节中,我们将:
- 使用C++客户端
- 动态加载新模型
为此,我们将会使用TensorFlow提供的ServerCore
和SessionBundleSourceAdapterConfig
两个C++ API。
我们将训练两个模型,一个迭代100次,一个迭代2000次;并分别导出,对应版本1和2。