使用TensorFlow的C++接口
之前編譯的是python package,然后我在docs項(xiàng)目下找教程找不著,直接在里面搜了一下hello world,意外的看到了 docs/site/en/r1/guide/extend/cc.md
這篇講的是直接調(diào)用tf的c++接口,很明顯更符合我的需求,于是我就按照這篇操作了一下。
按教程里面說(shuō)的,這是一個(gè)依賴tensorflow項(xiàng)目本體的bazel編譯的方式,并非把它當(dāng)成了純粹的第三方庫(kù),目前還符合我的需要,而且操作很簡(jiǎn)單,于是就先按這個(gè)方式操作。
首先在源碼文件夾創(chuàng)建 tensorflow/cc/example/example.cc,然后把md里面的代碼直接貼進(jìn)去,接下來(lái)在相同的位置放一個(gè)BUILD文件,把下面那段再貼進(jìn)去,準(zhǔn)備工作就完成了。
接下來(lái)在源碼根目錄跑(這份源碼要運(yùn)行過(guò)./configure,用的是之前的devel docker)
等他自己編譯完成就好了。
如果從零開(kāi)編的話,相對(duì)于pip_package只需要花三分之一的時(shí)間。
===== 其實(shí)到這兒就結(jié)束了,接下來(lái)都是我踩的坑。 =====
這次吸取了教訓(xùn),人家的文檔寫(xiě)的明明白白的!!一定要逐行閱讀!!
我看到這份c++代碼就頭腦一熱自己拿去編譯,鼓搗了半天,只在解壓后的whl包里搞到了include頭文件,但即使把whl里所有的so都link上去依舊顯示有undefined reference。
無(wú)奈之下我又在源碼文件夾里搜索"libtensorflow"出現(xiàn)的位置,意外的看到了這么幾個(gè)文件
簡(jiǎn)單看一下得出這三個(gè)是從下到上引用的關(guān)系,直接運(yùn)行第三個(gè)腳本即可,然而并不能成功,報(bào)錯(cuò)顯示找不到cuda,可我明明要編譯的是cpu版本,中間打了個(gè)日志也確定它判斷出的SUFFIX值的確是“-cpu-linux-”,可是編譯的命令里還是可以搜索到"-gpu"等等,我懷疑這個(gè)腳本并不能直接調(diào)用,還是需要依賴bazel,就像build_pip_package其實(shí)也是個(gè)shell腳本,由bazel管理了依賴,直接調(diào)用會(huì)缺少一些環(huán)境變量之類(lèi)的??墒谴a里沒(méi)搜到哪個(gè)BUILD文件里有cpu_libtensorflow。
接下來(lái)是個(gè)大坑,有一個(gè)很類(lèi)似我要找的東西
里面提供了編譯出libtensorflow.tar.gz的功能,不管怎么看都是我需要的東西,于是我興高采烈的編譯了起來(lái),這次到?jīng)]有報(bào)錯(cuò),我卻發(fā)現(xiàn)它從頭開(kāi)始編譯了,當(dāng)時(shí)我就抱怨這bazel怎么這么蠢,換個(gè)target它就不能復(fù)用一下,就這樣又等了8h。
得到的tar.gz解壓一看,里面有兩個(gè)文件夾,include和lib,非常完美,拉去編譯,又不行,打開(kāi)一看,這include里雖然有一堆頭文件,但是跟源碼里的結(jié)構(gòu)都不沾邊兒。
根據(jù)include/tensorflow/cc/c_api.h的注釋,這一套接口甚至全是以TF_開(kāi)頭的,肯定不是我需要的東西,干脆放棄了這條路。
中間我又按下了build_pip_package,過(guò)了幾秒鐘就后悔了,既然都要從頭編譯,我應(yīng)該新開(kāi)個(gè)文件夾,萬(wàn)一這個(gè)lib_package以后需要呢,于是我把它掐了之后,抱著試一試的心態(tài)又重編了libtensorflow.tar.gz,意外發(fā)現(xiàn)兩分鐘就編好了,這時(shí)我才想到,其實(shí)bazel不蠢,大概是因?yàn)楹甑膯?wèn)題導(dǎo)致它確實(shí)是需要觸發(fā)集體重編的。這更加印證了我根本不需要這個(gè)lib_package。
還有個(gè)很蠢的文檔問(wèn)題。不知道為什么科學(xué)上網(wǎng)之后依舊打不開(kāi)官網(wǎng)文檔,當(dāng)時(shí)感覺(jué)我們?cè)獾搅思夹g(shù)封鎖...
docs下的md我還知道怎么看,但是還有一類(lèi)ipynb的文件,打開(kāi)一看全是類(lèi)似json的東西,一般我就直接關(guān)上了,以為是配置文件之類(lèi)的用于編譯文檔的,后來(lái)才想到干嘛不搜一下呢,一搜才想起這原來(lái)是notebook的格式,裝一個(gè)jupyter notebook就能看了,然后根據(jù) docs/site/en/guide/_toc.yaml,就可以知道文檔的閱讀順序,當(dāng)時(shí)興奮的覺(jué)得自己有了重大突破。
后來(lái)突然在想,這東西咋沒(méi)人研究呢,害我搗鼓半天(因?yàn)橹虚g研究了下怎么把文檔編譯出來(lái),發(fā)現(xiàn)根本沒(méi)人提這茬),后來(lái)我突然想到干嘛不直接百度呢,百度一搜,焯,原來(lái)是官網(wǎng)文檔的地址變了,tensorflow.org是死活打不開(kāi)的,但是tensorflow.google.cn甚至直接就能打開(kāi),流暢的一匹,感覺(jué)這波叫做聰明反被聰明誤,不知道為什么用他們自家搜索網(wǎng)站搜出來(lái)的都是老地址。
最后的最后我才好好讀了一下最開(kāi)頭的cc.md,發(fā)現(xiàn)自己凈瞎走彎路,實(shí)在是太蠢了。