linux下tensorflow c++的配置

配置这个环境配了好几天,感觉tensorflow c++版本的配置好麻烦,特此记录下来
首先介绍下我的环境

  1. Ubuntu16.04
  2. tensorflow1.13.1
  3. Cuda10.0
  4. cudnn7.6.0

1.安装anaconda3

从官网下载anaconda安装包,对应linux版本,python3.7,然后

bash Anaconda3-2019.03-Linux-x86_64.sh

安装anaconda,按照提示来就行,完成后将anaconda路径添加到~/.bashrc

vim ~/.bashrc

将下面代码添加到文件最后

# conda
export PATH="$PATH:$HOME/bin"

然后更新bashrc

source ~/.bashrc

python3.7对我来说版本太高,需要的是3.6版本,可以通过

conda install python=3.6

对其版本进行降级
anaconda源都是国外的,网速可能会比较慢,可以加入清华源,下面是其网址
https://mirror.tuna.tsinghua.edu.cn/help/anaconda/

2.安装opencv3.4

2.1 下载opencv3.4.6

http://opencv.org/releases.html网站中下载opencv3.4.6,记得选择source版本

2.2 安装

sudo apt-get install cmake  
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev unzip 
unzip unzip opencv-3.4.6.zip

接下来创建build文件夹,然后在里面进行编译

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4

-j4代表开四个线程进行编译,若报错的话直接使用make进行编译
最后进行安装

sudo make install

2.3 环境配置

sudo vim /etc/ld.so.conf.d/opencv.conf

在打开的文件最后,加入/usr/local/lib,然后保存退出
使用sudo ldconfig更新刚才的文件

sudo vim /etc/bash.bashrc  

在文件末尾加上

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  

然后执行下面命令保存修改

source /etc/bash.bashrc  
sudo updatedb  

2.4 测试

在opencv-3.4.6/samples/cpp/example_cmake目录下,有一个cmake的example我们可以拿来测试
按顺序执行

mkdir build
cd build
cmake ..
make
./opencv_example

3.安装bazel

bazel是编译tensorflow的工具

3.1安装所需要的包

sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python3

因为我使用的是anaconda环境,所以就没有安装python3.

3.2下载bazel

tensorflow1.13对应的bazel是0.19.2,所以要在这个链接下载bazel0.19.2版本,找到那个 bazel-0.19.2-installer-linux-x86_64.sh 文件,下载下来。
或者使用下面命令

curl -L https://github.com/bazelbuild/bazel/releases/download/0.19.2/bazel-0.19.2-installer-linux-x86_64.sh > bazel-0.19.2-installer-linux-x86_64.sh

3.3运行安装程序

chmod +x bazel-0.19.2-installer-linux-x86_64.sh
./bazel-0.19.2-installer-linux-x86_64.sh --user

--user 表示将bazel安装在$HOME/bin下面

3.4设置环境

export PATH="$PATH:$HOME/bin"
sudo ldconfig 

将bazel的安装目录添加到环境中
可以将此命令添加到~/.bashrc文件中
到此bazel就安装成功了。

4.安装cudnn7.6.0

因为环境中只配置了cuda10.0,并没有对应的cudnn,就需要安装一下,从官网进行下载,注意与cuda版本进行对应。官网需要注册账户,填写信息,然后就可以下载了。只需要下载 cudnn-10.0-linux-x64-v7.6.0.64.tgz即可

sudo tar -xzvf cudnn-10.0-linux-x64-v7.6.0.64.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

然后就可以通过

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

查看cudnn版本

5.安装tensorflow

5.1下载tensorflow

sudo apt-get install git wget
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout r1.13 # 切换到所要编译的版本分支

5.2编译tensorflow

首先是环境

$ sudo apt-get install autoconf automake libtool curl make # Protobuf Dependencies
$ sudo apt-get install python-numpy swig python-dev python-wheel      # TensorFlow Dependencies

若是安装了anaconda就不需要第二个命令了

进入tensorflow文件夹

./configure

启动其配置文件,对于里面的都选no,是否支持cuda选择yes,然后都使用默认地址就可以
然后使用bazel编译tensorflow源码

// 无显卡,cpu版本
bazel build --config=opt //tensorflow:libtensorflow_cc.so 
// 有显卡
bazel build --config=opt --config=cuda  //tensorflow:libtensorflow_cc.so 
// 若是bazel-bin/tensorflow下面没有libtensorflow_framework.so文件,就运行下面代码
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=monolithic //tensorflow:libtensorflow_framework.so

网上有说加入--config=monolithic,可以让tensorflow支持opencv。我自己测试的情况是不加这个命令,也可以使用opencv,但是加入的话没办法指定GPU,会出现Duplicate registration of device factory for type GPU with the same priority 210错误

5.3安装其他依赖

在tensorflow/contrib/makefile下,执行build_all_linux.sh文件,成功后会出现一个gen文件夹

source tensorflow/contrib/makefile/build_all_linux.sh

如需Eigen库,则进入tensorflow/contrib/makefile/downloads/eigen,执行:

mkdir build  
cd build  
cmake ..  
make  
sudo make install

6.测试

我使用的CMakeLists.txt的内容如下,我添加了opencv库,若是不需要可将其删除

#设置cmake的最小版本
cmake_minimum_required(VERSION 2.8)
#项目名称
project(tf_project)
#编译的文件
set(SOURCE_FILES classification.cpp)
#编译的可执行文件名
set(EXECUTE_FILE tf_test)
#设置opencv
find_package(OpenCV  REQUIRED )
#设置c++编译器
set(CMAKE_CXX_STANDARD 11)
#设置TENSORFLOW_DIR变量,变量内容为安装的tensorflow文件夹路径
set(TENSORFLOW_DIR /root/tensorflow)
#项目中的include路径
include_directories(${TENSORFLOW_DIR})
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/proto)
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/protobuf-host/include)
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/eigen)
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/public)
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/absl)

#项目中的lib路径
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/lib)
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/protobuf-host/lib)
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11)
link_directories(${TENSORFLOW_DIR}/bazel-bin/tensorflow)

add_executable(${EXECUTE_FILE} ${SOURCE_FILES})
#连接libtensorflow_cc.so和libtensorflow_framework库
target_link_libraries(${EXECUTE_FILE} tensorflow_cc tensorflow_framework)
#链接opencv库
target_link_libraries(${EXECUTE_FILE} ${OpenCV_LIBS})

代码如下

#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

int main()
{
    using namespace tensorflow;
    using namespace tensorflow::ops;
    Scope root = Scope::NewRootScope();
    // Matrix A = [3 2; -1 0]
    auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f} });
    // Vector b = [3 5]
    auto b = Const(root, { {3.f, 5.f} });
    // v = Ab^T
    auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
    std::vector<Tensor> outputs;
    ClientSession session(root);
    // Run and fetch v
    TF_CHECK_OK(session.Run({v}, &outputs));
    // Expect outputs[0] == [19; -3]
    LOG(INFO) << outputs[0].matrix<float>();
    return 0;
}

7.其他

  1. 在配置configure的时候,提示有需要nccl,但是我并没有安装,不知道后续会不会有其他问题
  2. bazel与tensorflow、cuda、cudnn的对应关系,该网站有说明
  3. 对应tensorflow1.13的bazel不能使用0.19.0,会报错误 cc-compiler-k8: Error while selecting cc_toolchain: No toolchain found for cpu 'k8' 换成0.19.2就可以了。
  4. 参考文章
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343