编译tensorflow的小小记录

编译tensorflow有专门的编译工具bazel,所以需要先安装bazel。我使用的是源码编译bazel(https://github.com/bazelbuild/bazel/releases)。

第一个坑:git clone bazel源码或者使用下载的bazel-0.21.0.tar.gz,这种源码里缺少生成需要的文件,所以需要下载的是bazel-0.21.0-dist.zip这种带有dist的源码包。编译命令简单,./compile.sh就可以了。这里需要的依赖工具有:pkg-config zip g++ zlib1g-dev unzip python python-numpy(python3-numpy) swig python-dev(python3-dev) openjdk-8-jdk,这些是安装页面提示的,全安了就行。生成的bazel在output/目录下,并且要把目录添加到PATH中。

第二个坑:git clone --recurse-submodules https://github.com/tensorflow/tensorflow,其中--recurse-submodules 参数是必须得, 用于获取 TesorFlow 依赖的 protobuf 库(这个是官方说明,如果不加貌似需要自己安装依赖的protobuf库:http://www.tensorfly.cn/tfdoc/get_started/os_setup.html,另一个:https://tensorflow.google.cn/install/source),从git上下载的tensorflow版本需要的bazel版本也比较高,所以需要切一下版本。

查看本地版本:git branch,查看远程分支:git branch -a,切换分支:git checkout -b “本地自己命名” “远程分支名”,如果不切分支,tensorflow和bazel版本不对应,无法编译。

第三个坑:下载cuda和cudnn,并安装,版本需要对应,需要注意的是cuda默认目录是/usr/local/cuda/,但是cudnn默认在/usr/目录下,所以需要把/usr/include下的cudnn.h拷贝到/usr/local/cuda/include下,把/usr/lib/x86_64-linux-gnu下的libcudnn相关的库都拷贝到/usr/local/cuda/lib64目录下。如果没有进行拷贝,会提示各种库没有,各种头文件找不到,真实是个大坑。

第四个坑:./configure时需要确认各种条件,这些条件我也没有全弄明白需要哪些,从网上查到的情况看,初级只需要cuda相关的选y,其他的都选n就可以,目录也只需要确认python、cuda、cudnn这些就可以了。

编译命令:

bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer(例子,同时生成frame的so)
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so(这个是c++的so)

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

更新:

1.编译自己的库,将项目目录拷贝到tensorflow/examples下,使用命令:

bazel build -c opt --config=cuda //tensorflow/examples/xxx/...进行编译,注意啦:自己的项目xxx目录后面要加...三个点,否则不知道为啥编译不过,可能是写的比较挫吧(>人<;)

bazel build -c opt --config=cuda //tensorflow/examples/xxx/... --linkopt=//home/ubuntu/myprojects/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so 新版本貌似需要指定连接

项目中的BUILD一定要写好,需要编译的源文件要写全,否则编译完成了不报错,运行就苦恼了。

有的人使用编译选项--copt=-msse3 --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma,目前了解的情况大概是这个是cpu架构支持的选项。如果有大神知道都代表什么意思希望能留言指点一下,谢谢!

2.ignoring visible gpu devices:0 ,with Cuda compute capability 7.0. The minimum required Cuda capability is 7.5,这个问题是编译tensorflow的时候的configure有一个配置:Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 7.5]:需要写7.0(按不同使用的卡填写),默认的是7.5,所以设备跑不起来,而且跑起来之后自己的库也要重新编译。算力官网地址:https://developer.nvidia.com/cuda-gpus

2020.02.26更新:

3.tensorflow与bazel对应版本在tensorflow目录下有一个.bazelversion文件,里面写的就是需要的版本号,切换tensorflow版本分支后,.bazelversion内会有变化。

4.编译TensorFlow2.0及之后版本的时候命令略有不同需要添加--config=v2,例如
bazel build --config=opt --config=cuda --config=v2 //tensorflow:libtensorflow_framework.so

2020.04.03更新:

5.--cxxopt='-g' 可以用于编译debug版本,方便gdb查找,例如:bazel build -c opt --cxxopt='-g' --config=cuda //tensorflow/examples/xxx/... --linkopt=//home/ubuntu/myprojects/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so

6.可以使用--retain-symbols-file和--version-script来限定对外开放的接口,防止接口名冲突导致的一系列问题。例如:

bazel build -c opt --config=cuda //tensorflow/examples/xxx/... --linkopt=//home/ubuntu/myprojects/tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so --linkopt=-Wl,--retain-symbols-file=/home/ubuntu/projects/tf/tensorflow/tensorflow/examples/model_classify/retain_symbols.sys --linkopt=-Wl,--version-script=/home/ubuntu/projects/tf/tensorflow/tensorflow/examples/model_classify/version_script.map

2020.05.15更新:

7.如果一个新的环境编译时自动下载特别慢,可以考虑使用proxy,但是有个问题可能不是每个人都会遇到,就是配置了代理之后,报错:HTTP/1.1 407 Proxy Authentication Required,这个问题基本确定是bazel的问题,所以搜索之后发现了这个:https://github.com/bazelbuild/bazel/issues/7487#issuecomment-466012513,bazel自己家的解决方法,先使用wget将下载失败的依赖包下载下来,这时候proxy是起作用的,速度很快,然后将所有需要的依赖包放到一个目录中,使用bazel的--distdir参数来指定本地依赖包目录,相当于离线,参考命令:

bazel build -c opt --config=cuda --distdir /home/test/projects/downloads //tensorflow/cc:tutorials_example_trainer

2020.05.21更新:

8.如果你的环境是arm64即aarch64的,那么可能会遇到其他奇特的问题,比如总有一些函数没有编译进库里,总是提示未定义函数等,稍微总结一点点,希望帮到大家。

首先,可能交叉编译环境不支持,所以要手动添加一下cpu类型,在tensorflow/third_party/gpus/crosstool目录下找到CROSSTOOL_hipcc.tpl,vi打开,找到

default_toolchain {cpu: "arm"toolchain_identifier: "local_linux"
}

在后面添加一个aarch64的:

default_toolchain {cpu: "aarch64"toolchain_identifier: "local_linux"
}

保存退出。

第二 ,还是这个目录,vi打开BUILD.tpl,找到标签cc_toolchain_suite下面的toolchains =中的"arm": ":cc-compiler-local",,在这个下面添加一行"aarch64": ":cc-compiler-local",,然后保存退出,如下:

cc_toolchain_suite(name = "toolchain",toolchains = {"local|compiler": ":cc-compiler-local","darwin|compiler": ":cc-compiler-darwin","x64_windows|msvc-cl": ":cc-compiler-windows","x64_windows": ":cc-compiler-windows","arm": ":cc-compiler-local","aarch64": ":cc-compiler-local","k8": ":cc-compiler-local","piii": ":cc-compiler-local","ppc": ":cc-compiler-local","darwin": ":cc-compiler-darwin",},
)

 第三,有可能你会用到aws相关的,那么在tensorflow/third_party/aws目录下找到BUILD.bazel文件,vi打开,找到标签cc_library-->srcs = select-->"//conditions:default": [],修改为如下:

cc_library(name = "aws",srcs = select({"@org_tensorflow//tensorflow:linux_x86_64": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),"@org_tensorflow//tensorflow:darwin": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),"@org_tensorflow//tensorflow:linux_ppc64le": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),"@org_tensorflow//tensorflow:raspberry_pi_armeabi": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),#"//conditions:default": [],"//conditions:default": glob(["aws-cpp-sdk-core/source/platform/linux-shared/*.cpp",]),}) + glob([

 

2021.04.01更新:

ERROR: An error occurred during the fetch of repository 'io_bazel_rules_docker'

方法来自:https://blog.csdn.net/lsqtzj/article/details/108899430

 

目前遇到的坑就这些,已经编译出so了,能用,有新问题或新发现会在更新中顺序向下,待以后补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

layui富文本编译器添加图片

1、创建富文本编辑器 <form class"layui-form" method"post" id"myForm" enctype"multipart/form-data"><div class"layui-form-item layui-form-text"><label class"layui-form-label">内容&…

为什么数学是理解世界的最佳方式

来源&#xff1a;遇见数学在对着乔治梅森大学最近的一届新生致辞时&#xff0c;丽贝卡戈尔丁&#xff08;Rebecca Goldin&#xff09;传递了一个令人沮丧的数据&#xff1a;最近的一项研究显示&#xff0c;36%的大学生在大学四年时间里批判性思维并未显著提高。戈尔丁解释说&am…

windows查看dll库接口函数

一种是使用工具depends&#xff0c;另一种是使用vs的cmd命令窗口&#xff0c;dumpbin /EXPORTS xxx.dll就可以查看xxx.dll的函数接口了

bootstrap-table 行合并和列合并,以及固定列宽度等问题

列合并和列宽度固定&#xff1a; 1 .setWidth {2 table-layout: fixed;3 }4 5 .setWidth > thead > tr > th {6 width: 80px;7 }8 <table class"setWidth" id"EstateTable" data-mobile-responsive&…

c++错误functional:1526:9: error: no type named ‘type’ in ‘class std::result_of

关于这个错误&#xff0c;我自己的情况是thread函数形参有&引用传值&#xff0c;例如: void thread_test(vector<int> &test_vec)&#xff0c;编译就会报错&#xff0c;去掉&就可以了&#xff0c;查到的其他方式并没有能解决这个问题&#xff0c;不知道是因…

5G 标准的走向,为何越来越不同寻常?

作者 | Michael Koziol译者 | 弯月&#xff0c;责编 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;如果没有互联网工程任务组&#xff08;Internet Engineering Task Force&#xff09;制定种种互联网标准&#xff0c;那么此时此刻你…

WebSocket教程(一)

一、websocket与http WebSocket是HTML5出的东西&#xff08;协议&#xff09;&#xff0c;也就是说HTTP协议没有变化&#xff0c;或者说没关系&#xff0c;但HTTP是不支持持久连接的&#xff08;长连接&#xff0c;循环连接的不算&#xff09; 首先HTTP有 1.1 和 1.0 之说&…

iis设置导致python调用urllib.request.urlopen出错问题

iis确实用的很少&#xff0c;从来没有注意过&#xff0c;今天就遇见了问题。 python中使用urllib.request.urlopen调用测试服务器接口&#xff0c;之前从没有出现问题&#xff0c;今天用了一条70M的数据进行测试&#xff0c;突然报错404&#xff0c;这是什么鬼&#xff0c;各种…

人类智慧的本质是什么?【知社视频】第118期

来源&#xff1a;知社学术圈自古希腊开始&#xff0c;人们就认为智慧是人的根本属性&#xff0c;哲学家普罗泰戈拉有句名言&#xff0c;“人是万物的尺度&#xff0c;是存在的事物存在的尺度&#xff0c;也是不存在的事物不存在的尺度”。马克思主义也认为&#xff0c;认识世界…

scrapy的安装

1. 先安装python3 2. 设置python3的环境变量&#xff0c;script的环境变量 3. pip3 install scrapy 4. 安装错误提示去ms官网下载vc2015 5. 安装pywin32 pywin32-221.win-amd64-py3.6 安装完成&#xff01;&#xff01; 转载于:https://www.cnblogs.com/liyugeng/p/7941102.ht…

nginx小记

这只是个小记&#xff0c;不是很懂&#xff0c;随手记录已知的知识。 1.nginx是为了让外部网络可以访问内部系统&#xff0c;做了ip和端口的映射&#xff0c;所以如果是内部使用&#xff0c;可以直接连接内部ip和端口&#xff0c;而不用非要使用nginx映射的。 &#xff08;有新…

20个!中国科协发布2020年重大科学问题和工程技术难题

来源&#xff1a; 中国科学报作者 | 高雅丽8月15日&#xff0c;中国科协在第二十二届中国科协年会闭幕式上发布了 10个对科学发展具有导向作用的科学问题和10个对技术和产业具有关键作用的工程难题。10个前沿科学问题为&#xff1a;冠状病毒跨种传播的生态学机制是什么&#xf…

openvino安装小记

使用的是Linux版本安装完整包l_openvino_toolkit_p_2019.2.242.tgz&#xff0c;这个是官方安装说明&#xff1a;https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html。 简单记录一下问题&#xff1a; 1.使用xmanager想要用GUI脚本…

Java 8特性

1. Java8的新特性 1.1. Lambda表达式和函数式接口 最简单的Lambda表达式可以用逗号分隔的参数列表、->符号和功能语句块来表示。示例如下&#xff1a; Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) ); 请注意到…

图神经网络的表达能力,究竟有多强大?

来源&#xff1a;AI科技评论作者 | Mr Bear编辑 | 丛 末近年来&#xff0c;随着图神经网络在各个领域的火热应用&#xff0c;越来越多的学者试图从图论的角度对图神经网络的表达能力进行理论分析&#xff0c;并基于这些理论分析开发出了性能强大的模型。然而&#xff0c;在实际…

android studio 调试c/c++代码小记

使用的android studio3.0.1版本&#xff0c;sdk 27. 新建的测试程序&#xff0c;勾选了c支持&#xff0c;默认有native_lib.cpp。 1.在cpp中添加了测试的native代码&#xff0c;提示No implementation found for错误&#xff0c;怎么看都跟之前的默认函数没啥区别啊&#xff…

在Mac(OS X)中使用GitHub的超详细攻略(20170706)

转自&#xff1a;http://blog.csdn.net/baimafujinji/article/details/74533992 GitHub是一个面向开源及私有软件项目的托管平台、开源代码库以及版本控制系统&#xff0c;因为只支持 Git 作为唯一的版本库格式进行托管&#xff0c;故名 GitHub。通常在Windows下使用GitHub的教…

低时延AI完美适配工业场景,边缘智能如何构建数字工业新生态?

物联网智库 原创二次转载请联系原作者今年年初爆发的新冠疫情迫使居民的生活、学习、工作由线下向线上大规模迁移&#xff0c;令各行各业意识到了数字化升级的重要性&#xff0c;纷纷踏上转型之路。联网设备数量也随着物联网技术的快速发展而不断飙升&#xff0c;越来越多的应用…

AndroidStudio 3.4更新了啥?(转载)

版权声明&#xff1a;本文为原博主收集的资料&#xff0c;欢迎参考。未经本人允许&#xff0c;禁止转载。 原博文地址&#xff1a;https://blog.csdn.net/z302766296/article/details/89468726 每次到AndroidStudio新版本发布的时候&#xff0c;都忍不住想更新一波&#xff0c;…

lintcode12 带最小值操作的栈

实现一个带有取最小值min方法的栈&#xff0c;min方法将返回当前栈中的最小值。 你实现的栈将支持push&#xff0c;pop 和 min 操作&#xff0c;所有操作要求都在O(1)时间内完成。 建一个栈helpStack&#xff0c;用来存放从开始到目前位置的最小值&#xff0c; 1 /**2 * lintc…