背着锄头的互联网农民

0%

TensorFlow-Serving源码编译

上一篇文章中我们学习了如何来搭建TensorFlow-Serving的Docker环境,但是在启动TensorFlow-Serving服务的时候,会有一行日志:

1
2
3
I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:141]
Your CPU supports instructions that this TensorFlow binary was not compiled to
use: AVX2 FMA

说明默认的TensorFlow-Serving的二进制版本不满足CPU优化的条件,这时候需要手动编译TensorFlow-Serving的源码。在官方文档提供了一种Docker的编译方法,但是在实际环境中执行的时候因为网速的原因一直没有成功,所以这里选择了另外自己编译的方法。

下载devel版本的TensorFlow
1
sudo docker pull tensorflow/serving:nightly-devel
编译TensorFlow-Serving
1
2
3
sudo docker run -it tensorflow/serving:nightly-devel bash #进入容器
cd /tensorflow_serving
bazel build --config=nativeopt tensorflow_serving/... #nativeopt参数在编译时候会自动适应当前的CPU型号

可能会遇到错误找不到/usr/include/python3.6m,解决方法是:

1
2
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3-dev

完成后TensorFlow-Serving的二进制文件位置:/tensorflow_serving/bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server

保存Docker Image

刚才的操作都是在Docker中,一旦退出Docker之前的更改全部失效,所以需要退出之前保存该Image的更改。另起一个窗口执行命令:

1
2
sudo docker ps #查找当前运行Docker对应的Container ID
sudo docker commit containerId tensorflow/serving:nightly-devel

执行TensorFlow-Serving
1
2
3
4
5
6
7
8
9
# 启动Docker
nohup sudo docker run -p 8502:8500 -p 8501:8501 --name tfserving_testnet --mount type=bind,source=/home/tensorflow/xception,target=/models/xception -e MODEL_NAME=xception -t tensorflow/serving:nightly-devel & #绑定端口并启动Docker

# 进入Docker
sudo docker exec -it containerId bash

# 启动tensorflow-serving
cd /tensorflow_serving
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=8500 --rest_api_port=8501 --model_name=xception --model_base_path=/models/xception

可以看到,这次启动时没有出现Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA的报警。

后续

但是使用这种方法编译后的TensorFlow-Serving,在实际测试时候并没有提升预测的耗时性能,具体原因还需要后续继续分析。另外TensorFlow的编译最好使用Docker环境编译,在物理机上涉及到很多环境变量和其他软件版本的不匹配问题。