本博文参考:
https://blog.youkuaiyun.com/qq_25109263/article/details/81285952
https://blog.youkuaiyun.com/dragonchow123/article/details/80682787
介绍
最近要把模型落地了,由于整个系统是基于C++的,但是我们一般都是使用python来训练模型,这个时候就需要进行转换了。tensorflow提供了基于C++的API,但是需要编译,过程在这里记录下,网上的教程还是有点坑的。
PipeLine
整个工作流:keras训练->“my_model.h5”->转换到pb类型->“my_model.pb”->C++端用tensorflowAPI调用并运行模型。
必备环境配置
本机配置:GTX1080ti,Ubuntu18.04
(1)一个配有tensorflow和keras的python环境,建议用anaconda去创建
(2) CUDA9.1, cudnn7.1.2(安装CUDA和cudnn的方法请自行查找,不在本文范围内)
(3)OpenCV3.4(安装OpenCV的方法请自行查找,不在本文范围内)
(4)编译tensorflow C++接口,这在接下来会介绍
编译安装tensorflow的C++接口,本文编译的tensorflow C++是1.7版的
1.配置C++版tensorflow使用时的第三方依赖
(1)Protobuf!!!!!这玩意儿是重中之重,它的版本与tensorflow的版本密切相关,它的版本错了就无法work,我用的3.5.0。
先从以下网址下载protobuf-cpp-3.5.0.tar.gz
https://github.com/google/protobuf/releases
再解压出来,获得一个protobuf-3.5.0的文件夹
cd prtobuf-3.5.0
./configure
sudo make -j8
make check -j8
sudo make install
sudo ldconfig
以上步骤可以完成Protubuf的源码的编译和安装
如果遇到什么问题,建议去看Protobuf的官方的编译安装指南:
https://github.com/google/protobuf/blob/master/src/README.md
(2)Eigen,这是一个C++端的矩阵运算库,这个库只要下载压缩包,解压到某个自己知道的路径下即可
先下载eigen的压缩包
wget http://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2
下载之后解压,重新命名为eigen3,放到某个路径下,安装就好
mkdir build
cd build
cmake ..
make
sudo make install
2.编译安装Tensorflow
(1)下载安装编译工具bazel
先下载Bazel的安装包
https://github.com/bazelbuild/bazel/releases,我下载的是bazel-0.10.1-installer-linux-x86_64.sh
然后执行安装
./bazel-0.10.1-installer-linux-x86_64.sh
注意:bazel版本不能过高,否则会报错
(2)编译安装Tensorflow,我的源码路径是~/tensorflow
# 先下载tensorflow源码
git clone https://github.com/tensorflow/tensorflow.git
# 进入tensorflow文件夹
cd tensorflow
# 切换到1.7版本:
git checkout r1.7
# 执行configure
sudo ./configure
这一步需要你指定python路径,需要有各种y/N的选择
建议如下:
python路径用anaconda的路径:/home/oliver/anaconda3/bin/python
其他的第一个y/N选择y,后面的都是N
cuda要选择y,然后会自动搜索cudnn版本
nccl选择默认的1.3,
后面的不是选择N就是默认
详见Tensorflow官网的提示:https://www.tensorflow.org/install/install_sources
也可以参考一个链接:https://blog.youkuaiyun.com/qq_37674858/article/details/81095101
# 使用bazel去编译
bazel build --config=opt //tensorflow:libtensorflow_cc.so // 无显卡,cpu版本
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so // 有显卡
....漫长的等待编译,大约20分钟
# 最后显示类似如下的信息,说明编译成功了:
....
Target //tensorflow:libtensorflow_cc.so up-to-date:
bazel-bin/tensorflow/libtensorflow_cc.so
INFO: Elapsed time: 1192.883s, Critical Path: 174.02s
INFO: 654 processes: 654 local.
INFO: Build completed successfully, 656 total actions
然后回到tensorflow目录下执行:
./tensorflow/contrib/makefile/download_dependencies.sh
#完成后会有一个download文件夹在makefile文件夹中。
然后:
在tensorflow/contrib/makefile下,执行build_all_linux.sh文件,成功后会出现一个gen文件夹。
操作完成后需要把"tensorflow/bazel-genfiles/tensorflow/"中的cc和core文件夹中的内容copy到"tensorflow/tensorflow/"中,然后完成覆盖即可,这一步是为了复制.pb.h和.cc文件。
完成这一步之后:
# 再把必要.h头文件以及编译出来.so的动态链接库文件复制到指定的一些路径下:
sudo mkdir /usr/local/include/tf
sudo cp -r bazel-genfiles/ /usr/local/include/tf/
sudo cp -r tensorflow /usr/local/include/tf/
sudo cp -r third_party /usr/local/include/tf/
sudo cp bazel-bin/tensor