Tensorflow 在c++上的编译和遇到的一些问题
本人部署的配置为tensorflow1.15 cuda10.1 cudnn7.6.5 bazel 0.24.1
依赖环境:
1、bazel 安装
国内下载地址:https://www.newbe.pro/Mirrors/Mirrors-Bazel/
chmod +x bazel****.sh
./bazel****.sh --user
gedit ~/.bashrc 打开.bashrc
再将 "export PATH="$PATH:$HOME/bin" 加入 最后一行
再“source ~/.bashrc”**路径
注意:安装路径中包含中文可能汇报错
关于bazel版本,在编译时会提示所需版本,在这我使用的是0.24.1
bazel卸载:
rm -rf ~/.bazel
rm -rf ~/bin
rm -rf /usr/bin/bazel
再将 "export PATH="$PATH:$HOME/bin" 删除
下载tensorflow源码
git clone --recursive https://github.com/tensorflow/tensorflow
将源码克隆下来
然后切换分支
进行配置
cd tensorflow # 进入tensorflow文件夹
git checkout r1.15 #切换到r1.15分支
./configure #配置
除了cuda 是y 其他都是n
注意:如果你的bazel版本不匹配这里会报错,也可以打开configure.py文件中查看所需bazel文件版本;
还有一报错可能“读取不到你的cuda版本,让你手动输入”这里可能是你的编译的tensorflow版本太低或者你装的cuda版本太高,更换版本即可。
开始编译
#有显卡
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
#没显卡
bazel build --config=opt //tensorflow:libtensorflow_cc.so
#有显卡
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_framework.so
#没显卡
bazel build --config=opt //tensorflow:libtensorflow_framework.so
编译完会出现bazel-bin bazel-genfiles bazel-out bazel-tensorflow bazel-testlogs 文件夹(若在master分支编译则没有bazel-genfiles文件夹)
下载依赖库
到tensorflow/contrib/makefile下,执行“./build_all_linux.sh”若成功则会出现gen文件夹,downloads文件夹下会出现很多文件夹
报错如下:
原因:其中eigen下载网址https://bitbucket.org/eigen/eigen/get/49177915a14a.tar.gz 有误
解决方案:
将tensorflow下的workspace.bzl文件中,找到eigen
urls中复制eigen的下载路径"https://storage.googleapis.com/mirror.tensorflow.org/bitbucket.org/eigen/eigen/get/49177915a14a.tar.gz"
替换掉tensorflow/contrib/makefile下download_dependencies.sh中EIGEN_URL
再执行./build_all_linux.sh 就可以了(此过程保持*状态)
期间还可能报错一大堆“-std=c++11”,替换gcc版本4.8即可,建议从头到尾都用gcc4.8
新建工程进行测试
目录结构
- src:源代码目录,如下main.cpp
- build:构建项目文件区,编译后产生相关构建文件。无需添加文件
- CMakeLists.txt
main.cpp
#include <tensorflow/core/platform/env.h>
#include <tensorflow/core/public/session.h>
#include <iostream>
using namespace std;
using namespace tensorflow;
int main()
{
Session* session;
Status status = NewSession(SessionOptions(), &session);
if (!status.ok()) {
cout << status.ToString() << "\n";
return 1;
}
cout << "Session successfully created.\n";
}
CMakeLists.txt
cmake_minimum_required (VERSION 2.8.8)
project (example)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")
aux_source_directory(./src DIR_SRCS)
link_directories(/home/les/bazelzz/tensorflow/bazel-bin/tensorflow)
include_directories(
#./include
#如果没有拷贝相关头文件到include目录,需要添加以下包含目录
# path_to_tensorflow/tensorflow
# path_to_tensorflow/tensorflow/bazel-genfiles
# path_to_tensorflow/tensorflow/contrib/makefile/gen/protobuf/include
/home/les/bazelzz/tensorflow
/home/les/bazelzz/tensorflow/bazel-genfiles
/home/les/bazelzz/tensorflow/tensorflow/contrib/makefile/gen/protobuf/include
/home/les/bazelzz/tensorflow/tensorflow/contrib/makefile/downloads/absl
/usr/include/eigen3
)
add_executable(example ${DIR_SRCS})
target_link_libraries(example tensorflow_cc tensorflow_framework)
在build下执行
cmake ..
make
./example
完成