欢迎光临散文网 会员登陆 & 注册

使用TensorFlow的C++接口

2022-02-22 20:09 作者:纪一希  | 我要投稿

之前编译的是python package,然后我在docs项目下找教程找不着,直接在里面搜了一下hello world,意外的看到了 docs/site/en/r1/guide/extend/cc.md

这篇讲的是直接调用tf的c++接口,很明显更符合我的需求,于是我就按照这篇操作了一下。


按教程里面说的,这是一个依赖tensorflow项目本体的bazel编译的方式,并非把它当成了纯粹的第三方库,目前还符合我的需要,而且操作很简单,于是就先按这个方式操作。

首先在源码文件夹创建 tensorflow/cc/example/example.cc,然后把md里面的代码直接贴进去,接下来在相同的位置放一个BUILD文件,把下面那段再贴进去,准备工作就完成了。

接下来在源码根目录跑(这份源码要运行过./configure,用的是之前的devel docker)

等他自己编译完成就好了。

如果从零开编的话,相对于pip_package只需要花三分之一的时间。


===== 其实到这儿就结束了,接下来都是我踩的坑。 =====

这次吸取了教训,人家的文档写的明明白白的!!一定要逐行阅读!!

我看到这份c++代码就头脑一热自己拿去编译,鼓捣了半天,只在解压后的whl包里搞到了include头文件,但即使把whl里所有的so都link上去依旧显示有undefined reference。

无奈之下我又在源码文件夹里搜索"libtensorflow"出现的位置,意外的看到了这么几个文件

简单看一下得出这三个是从下到上引用的关系,直接运行第三个脚本即可,然而并不能成功,报错显示找不到cuda,可我明明要编译的是cpu版本,中间打了个日志也确定它判断出的SUFFIX值的确是“-cpu-linux-”,可是编译的命令里还是可以搜索到"-gpu"等等,我怀疑这个脚本并不能直接调用,还是需要依赖bazel,就像build_pip_package其实也是个shell脚本,由bazel管理了依赖,直接调用会缺少一些环境变量之类的。可是代码里没搜到哪个BUILD文件里有cpu_libtensorflow。


接下来是个大坑,有一个很类似我要找的东西

里面提供了编译出libtensorflow.tar.gz的功能,不管怎么看都是我需要的东西,于是我兴高采烈的编译了起来,这次到没有报错,我却发现它从头开始编译了,当时我就抱怨这bazel怎么这么蠢,换个target它就不能复用一下,就这样又等了8h。

得到的tar.gz解压一看,里面有两个文件夹,include和lib,非常完美,拉去编译,又不行,打开一看,这include里虽然有一堆头文件,但是跟源码里的结构都不沾边儿。

根据include/tensorflow/cc/c_api.h的注释,这一套接口甚至全是以TF_开头的,肯定不是我需要的东西,干脆放弃了这条路。

中间我又按下了build_pip_package,过了几秒钟就后悔了,既然都要从头编译,我应该新开个文件夹,万一这个lib_package以后需要呢,于是我把它掐了之后,抱着试一试的心态又重编了libtensorflow.tar.gz,意外发现两分钟就编好了,这时我才想到,其实bazel不蠢,大概是因为宏的问题导致它确实是需要触发集体重编的。这更加印证了我根本不需要这个lib_package。


还有个很蠢的文档问题。不知道为什么科学上网之后依旧打不开官网文档,当时感觉我们遭到了技术封锁...

docs下的md我还知道怎么看,但是还有一类ipynb的文件,打开一看全是类似json的东西,一般我就直接关上了,以为是配置文件之类的用于编译文档的,后来才想到干嘛不搜一下呢,一搜才想起这原来是notebook的格式,装一个jupyter notebook就能看了,然后根据 docs/site/en/guide/_toc.yaml,就可以知道文档的阅读顺序,当时兴奋的觉得自己有了重大突破。

后来突然在想,这东西咋没人研究呢,害我捣鼓半天(因为中间研究了下怎么把文档编译出来,发现根本没人提这茬),后来我突然想到干嘛不直接百度呢,百度一搜,焯,原来是官网文档的地址变了,tensorflow.org是死活打不开的,但是tensorflow.google.cn甚至直接就能打开,流畅的一匹,感觉这波叫做聪明反被聪明误,不知道为什么用他们自家搜索网站搜出来的都是老地址。


最后的最后我才好好读了一下最开头的cc.md,发现自己净瞎走弯路,实在是太蠢了。

使用TensorFlow的C++接口的评论 (共 条)

分享到微博请遵守国家法律