ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Tensorflow c++源码编译(踩坑版)

2021-12-14 13:03:58  阅读:311  来源: 互联网

标签:tar sudo gz bazel 源码 tensorflow release Tensorflow 坑版


在实际项目部署过程中,会需要tensorflow c或者c++版本, 网上一通查,说自己编译会各种坑,投机取巧。。在拿到别人编译好的c和c++版本调用报错后,开始痛定思痛,躲不过的坑 自己来趟好了。。

先说下电脑环境:

  1. linux18.04

  2. cuda 10.0

  3. cudnn 7.6.5

  4. make 4.1

  5. protobuf 3.7

############环境安装#############

怕tensorflow版本高 容易出错,保守选择 tensroflow 1.13.1版本, 并选择bazel的版本为0.19.2 为啥选择这个版本 是因为之前看过一个博客是这样对应的 ,
link

1 安装bazel

1.安装bazel需要的安装包:pkg-config,zip,g++,zlib1g-dev, unzip,python

$ sudo apt install unzip 
$ sudo apt install make
$ sudo apt install g++ 
$ sudo apt install gcc 
$ sudo apt install cmake
 
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
sudo apt install curl(used to download gmock)
sudo apt-get install zlib1g-dev
sudo apt-get install liblzma-dev

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

如果安装不成功
2. git 上下载指定版本的bazel:可以在 bazel发布页上找对应版本
https://github.com/bazelbuild/bazel/releases
下面链接是我所对应的0.19.2的版本:
Release 0.19.2 · bazelbuild/bazel
3.运行安装程序

切换到bazel下载到的文件中,如果担心权限不够 可以先运行

chmod +x bazel-<version>-installer-linux-x86_64.sh

再运行:

./bazel-<version>-installer-linux-x86_64.sh --user

--user标志将Bazel安装到$HOME/bin系统上的目录并设置.bazelrc路径$HOME/.bazelrc

2 安装protobuf

因为之前安装过protocbuf 3.7版本 现在重新安装3.6.1.2版本,存在两个版本共存问题,需要软连接:

  1. 下载protobuf 3.6.1.2版本:https://link.zhihu.com/?target=https%3A//codeload.github.com/protocolbuffers/protobuf/tar.gz/v3.6.1.2
  2. 解压并移动到相应文件夹中:
tar -zxvf protobuf-3。6.1.2.tar.gz
sudo cp -rf protobuf-3.6.1.2 /usr/local
cd /usr/local 
sudo chmod -R 0777 protobuf-3.6.1.2  # 更改文件夹权限
  1. 安装protobuf-3.61.2:
$cd  protobuf-3.6.1.2
$ ./autogen.sh
$ ./configure  --prefix=/usr/protobuf  # 为了与之前安装的protobuf版本分开来,设定配置目录
$ make
$ make check
$ sudo make install
  1. 创建软链接:
sudo ln -s /usr/protobuf/bin/protoc /usr/local/bin/protoc3.6
  1. 查看版本并验证安装是否成功:
protoc3.6 --version
  1. 查看系统默认protobuf
which protoc
  1. 将protocbuf3.6.1.2作为系统默认版本
vim ~/.profile 加入  export LD_LIBRARY_PATH=/usr/local/lib
  1. 激活profile
source ~/.profile

替换默认的probuf,,根据which protoc找到默认protoc版本地址,先删除掉该地址,再替换,我的默认地址在/usr/bin/protoc,新安装的protoc地址在 /usr/local/bin/protoc3.6,软连接替代掉:(!!!一定要替换掉,找到对应的protobuf版本,不然后期tensorflow即使编译出来了,调用会出现很多未知错误。

rm /usr/bin/protoc
ln -s /usr/local/bin/protoc3.6 /usr/bin/protoc

至此,环境安装完毕。

3.安装tensorflow

重中之重的来liao…

  1. 下载tensorflow 我下载的是1.13.1版本 可以去官网上找各种其他版本:
    https://link.zhihu.com/?target=https%3A//codeload.github.com/tensorflow/tensorflow/tar.gz/v1.13.1
    下载完成后,解压:
tar -zxvf tensorflow-1.13.1.tar.gz
  1. 进入config配置

解压后进入tensorflow-1.13.1文件夹中:

开始配置:

./configure

开始出现一系列选项:

个人认为,如果要调用cuda时,最主要的是要知道自己的cuda和cudnn版本号:
cuda版本号查询:nvcc -V
cudnn版本号查询:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
在这里插入图片描述
我的版本号是7.6.5

在配置时,如果需要用cuda,需要填上:
主要是CUDA support 和cuda版本号 cudnn版本号
配置完就可以编译了。
3. bazel build编译:
不调用cuda:

bazel build --config=opt //tensorflow:libtensorflow_cc.so

调用cuda:

bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so

然后一直编译过程。。。要等30分钟。。。。。。最后出现:
在这里插入图片描述
过程中 踩坑无数, 下面开始踩坑之路:

【error】:
ERROR: …/tensorflow-1.13.1/tensorflow/core/kernels/BUILD:4680:1: no such package '@icu//xception: Error downloading [https://mirror.bazel.build/github.com/unicode-org/icu/archive/release-62-1.//github.com/unicode-org/icu/archive/release-62-1.tar.gz] to …/.cache/bazel/_bazel_zhang56dc5e19b594a565bd2f1d372/external/icu/release-62-1.tar.gz: Tried to reconnect at offset 9,642,752 but support it and referenced by ‘//tensorflow/core/kernels:string_util’

ERROR: Analysis of target ‘//tensorflow:libtensorflow_cc.so’ failed; build aborted: no such package '@icIOException: Error downloading [https://mirror.bazel.build/github.com/unicode-org/icu/archive/release-62ps://github.com/unicode-org/icu/archive/release-62-1.tar.gz] to …/.cache/bazel/_bazel_zh82456dc5e19b594a565bd2f1d372/external/icu/release-62-1.tar.gz: Tried to reconnect at offset 9,642,752 but support it

【分析】
icu_release-62-1.tar.gz下载不下来,所以可以自己手动下载下来,然后通过服务传上去,所以需要几步操作:1/搭建本地http服务;2/手动下载 icu_release-62-1.tar.gz;3/将下载tar.gz放到本地服务中。

搭建本地http服务有以下几步:
在linux终端输入:

sudo apt-get install httpd

在这里插入图片描述
再安装apache2:sudo apt-get install apache2
再安装apache2-dev sudo apt-get install apache2-dev
安装完成后 查看是否安装成功:sudo systemctl status apache2
在这里插入图片描述
后面在浏览器中粘贴localhost看是否有apache的界面出现 出现则安装成功;同时在根目录下可以看到/var/www/html文件夹,这个文件夹后面要用到。
2. 手动下载 icu_release-62-1.tar.gz:
https://link.zhihu.com/?target=https%3A//codeload.github.com/unicode-org/icu/tar.gz/release-62-1
:虽然直接从浏览器下载容易很多,但是也会经常断,这里推荐一个炒鸡好用的github加速网站,不用注册,GitHub 加速下载 - 在线工具
3. 第三步将手动下载的文件上传至本地服务:
将icu_release-62-1.tar.gz 文件名改成release-62-1.tar.gz, 并将改后的文件放到/var/www/html文件夹下;
修改tensorflow/third_party/icu/workspace.bzl文件,在url=[…]中添加一条

"http://localhost/release-62-1.tar.gz"

urls 添加到第三个 建议放到第一个上
清理 再重新编译:

bazel clean
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so

【error】
ERROR: …/tensorflow-1.13.1/tensorflow/core/kernels/BUILD:4680:1: no such package ‘@icu//’: java.io.IOException: Error downloading [http://localhost/release-62-1.tar.gz, https

标签:tar,sudo,gz,bazel,源码,tensorflow,release,Tensorflow,坑版
来源: https://blog.csdn.net/zqwwwm/article/details/121924210

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有