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

完成

再调用pb模型时可能会出现错误“ E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR” 模型中涉及到科学计算等会用到cudnn工具包,

解决方法:先执行“export TF_FORCE_GPU_ALLOW_GROWTH=true” 或将这个加入到~/.bashrc文件中,再运行程序,成功。

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值