限于水平,本文只依据TensorFlow官方教程作简单的操作性介绍,不对示例的源代码(第2、4部分)作详细分析。
测试环境:Win10Pro + PyCharm,Win10子系统Ubuntu16 + Serving。
这种搭配,如果对Linxu命令不熟悉,可以很好地利用Win10的图形界面进行操作。Ubuntu子系统在Win10中的路径为C:\Users\un\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu***\LocalState\rootfs
。不过要注意,用Win10图形界面操作子系统文件时,需要重启Ubuntu命令窗口且修改相应文件的权限。
TensorFlow Serving的编译依赖于Google的开源编译工具Bazel;gRPC用作客户端访问Serving服务的通道;Serving,或ModelServer将模型以服务暴露出去。如果不使用Bazel编译源代码,可以不用安装,后续的py代码执行只需tensorflow-serving-api
。
可以安装二进制文件,也可以从源码安装。此处选择前者。
下载Bazel的二进制文件https://github.com/bazelbuild/bazel/releases。
放置到Ubuntu子系统后要修改该文件的权限,然后才能安装:
chmod +x bazel-0.5.4-installer-linux-x86_64.sh
./bazel-0.15.2-installer-linux-x86_64.sh --user
配置环境,把export PATH="$PATH:$HOME/bin"
放到~/.bashrc中。
可以从PyPI安装,也可以从源码安装,此处选择前者。
安装gRPC(locally):
pip3 install grpcio
或者system wide:
sudo pip3 install grpcio
安装TensorFlow Serving依赖的库:
sudo apt-get update && sudo apt-get install -y \
automake \
build-essential \
curl \
libcurl3-dev \
git \
libtool \
libfreetype6-dev \
libpng12-dev \
libzmq3-dev \
pkg-config \
python3-dev \
python3-numpy \
python3-pip \
software-properties-common \
swig \
zip \
zlib1g-dev
安装tensorflow-serving-api
,无需Bazel即可运行Python客户端:
pip3 install tensorflow-serving-api
对于Serving,可以安装二进制文件,也可以从源码安装。此处选择前者。
TensorFlow Serving ModelServer有两个版本,即tensorflow-model-server和tensorflow-model-server-universal,其中前者针对SSE4和AVX之类的指令集进行了优化,但对老机器支持不好。前者不可行,即处理器不支持AVX指令集,则安装后者。
sudo apt-get remove tensorflow-model-server
# 把Serving的发行URI添加为package源
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 -
# 安装更新,之后即可通过tensorflow_model_server命令调用
sudo apt-get update && sudo apt-get install tensorflow-model-server
以后可以通过以下方式把ModelServer升级到指定版本:
sudo apt-get upgrade tensorflow-model-server
此处使用TensorFlow Serving提供的示例mnist_saved_mdoel.py
,其源码可从此处获取https://github.com/tensorflow/serving。导入Win10的PyCharm后,运行serving/tensorflow_serving/example/mnist_saved_model.py
,注意是通过CMD运行、且要输入参数,比如:
python mnist_saved_model.py --training_iteration=1000 --model_version=2 tmp
三个参数依次是迭代轮数、模型版本号、输出路径。程序会在tmp目录下生成以版本号命名的文件夹,并在其中存放导出模型pb文件。
将上述版本号文件夹复制到Ubuntu的Serving工作目录,比如/home/un/serving/mnist/
下。
在Ubuntu下运行Serving服务:
# 最后一个参数要是绝对路径
tensorflow_model_server --port=9000 --model_name=mnist --model_base_path=/home/un/serving/model/mnist
如成功运行会打印如下日志:
2018-08-02 10:45:53.322984: I tensorflow_serving/model_servers/main.cc:323] Running ModelServer at 0.0.0.0:9000 ...
TensorFlow Serving的mnist_client.py
示例即为客户端。在Win10的PyCharm命令窗口下运行该客户端py文件:
python mnist_client.py --num_tests=10000 --server=localhost:9000
其中参数num_tests测试次数可置为其他值。由于Win10与子系统的IP地址相同,所以可以使用localhost
作为服务器。
然后命令窗口输出的日志中会给出错误率。
至此,Serving试用完成。关于模型导出、客户端发送请求的代码实现,以及gRPC的工作原理,还有很多内容需要讨论。争取以后补充吧。