Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@yjhjstz
Forked from candlewill/TensorFlow Severing.md
Created April 9, 2018 06:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yjhjstz/47582b519e8ad1004d749111358c2af8 to your computer and use it in GitHub Desktop.
Save yjhjstz/47582b519e8ad1004d749111358c2af8 to your computer and use it in GitHub Desktop.
TensorFlow Severing

TensorFlow Severing

本文讲解如何使用TensorFlow Severing落地一个训好的模型。

安装

Bazel (可选,编译源代码才用)

# 从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

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

TensorFlow Serving Python API PIP package

pip install tensorflow-serving-api

ModelServer

优先安装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

Hello World:第一个TF Server应用

我们首先训练一个简单模型,然后进行Servering。

需要的代码:

  1. 模型训练、导出代码,mnist_saved_model.py
  2. 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/

测试Server (Python Client)

本例中使用mnist_client脚本来测试Server。这个脚本先下载一些测试数据,然后发送服务器请求,最后计算inference误差。

运行方式

python mnist_client.py --num_tests=1000 --server=localhost:9000

本例中大概可以取得91%正确率。

构建标准TensorFlow模型服务(C++ Client)

前文使用Python作为客户端,在本节中,我们将:

  1. 使用C++客户端
  2. 动态加载新模型

为此,我们将会使用TensorFlow提供的ServerCoreSessionBundleSourceAdapterConfig两个C++ API。

训练并导出模型

我们将训练两个模型,一个迭代100次,一个迭代2000次;并分别导出,对应版本1和2。

未完待续。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment