![682aa08c157f91bd28539ed9c7f65dc4.png](https://i-blog.csdnimg.cn/blog_migrate/02584d8399c4f405bd84883b0dba9316.png)
Hi各位,专栏有点时间没有更新文章啦,主要是由于工作方面有点忙(拖延癌),不过这次终于能够抽出空来写文章啦。本次带来TF C++动态库的编译指导,下次的话预告下应该是YOLOv3算法详解,时间方面小七争取尽快写作完成啦,哈哈哈(拖延癌晚期)
OK,进入正题,小七了解到平时大家都比较习惯python+tensorflow的组合进行模型搭建、训练和推理,理由是两者耦合的生态比较好(用的多,支持多)。不过,从工程化的角度来讲,使用C++编码可以使得代码执行效率更高,服务更加稳定,也更容易嵌入C++开发的各种应用之中(C++的工程化应用比较广阔)。小七最近工作上也比较多需要使用tensorflow C++接口进行编程的工作,所以,本次给大家带来的是Tensorflow C++动态库编译从零开始从头到尾的一个技术详解。
前置条件
开始前,小七把编译动态库的一些前置条件、环境先贴出来下:
先贴一个tensorflow 编译为pip安装包的各个环境对应关系,链接,可以用来参考如何构建C++动态库。直接拉到Tested build configurations:
![8ce650b98f48604770476d871ccaf07e.png](https://i-blog.csdnimg.cn/blog_migrate/a596c800f67fc0f467d726ddb35a8015.jpeg)
理论上按照上述的各个依赖对应关系去编译C++动态库都能够成功,小七列一个例子:
- 系统 Ubuntu 16.04
- bazel 0.15.0,在github上下载对应版本,通过这个指导编译安装。
- cuda 9 + cudnn7+nccl2.4.8,安装指导,nccl安装
- gcc 4.8.5,多版本共存和切换
- python 3.5.2 + python3-dev,加上six、numpy、wheel包,建议新开一个virtualenv环境安装上述依赖。
sudo apt-get install python3-dev
virtualenv cpp_tf -p python3
source cpp_tf/bin/activate
pip install six numpy wheel
![c4e8eb86f185c04fa88e13763d2668b7.png](https://i-blog.csdnimg.cn/blog_migrate/051c5b4b0f6dfba58108c37e0bd033f8.png)
- tensorflow source 1.12,网页切换到r1.12版本下载zip文件 or:
git clone https://github.com/tensorflow/tensorflow/tree/r1.12
OK,完成上述的环境自查和安装后,我们就可以开始进行动态库的编译了。
步骤一:编译配置,生成tensorflow_cc.so(请注意保持cpp_tf的虚拟环境激活状态)
cd tensorflow-r1.12
./configure
configure的过程中,基本上都是enter就可以,除了:是否支持CUDA选择y,cuda位置输入‘/usr/local/cuda-9.0’(具体看你的配置), nvcc版本输入2.4.8,其他一步下来全部选择默认即可。如下图:
![ff84274aa8512bb71607d66479f9ca98.png](https://i-blog.csdnimg.cn/blog_migrate/42b177bf65c6f8c0982c9156b30e8adb.jpeg)
配置过程中可能会出现:'site' has no attribute "getsitepackages",忽略即可。
bazel build --config=opt //tensorflow:libtensorflow_cc.so
编译预计花费30分钟,完成后在bazel-bin/tensorflow下面生成libtensorflow_cc.so和libtensorflow_framework.so两个文件。
步骤二:编译其他依赖(eigen、protobuf等):
开始前先确定下tensorflow/workspace.bzl里面的protobuf版本是哪个,看是否和download_dependecies.sh里面下载的版本一致。如果不的话,会报This file was generated by a newer version of protoc which is i