最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

在ubuntu上編譯TensorFlow源碼

2022-02-17 15:11 作者:紀(jì)一希  | 我要投稿

記錄一下三個(gè)下午的勞動(dòng)成果。

系統(tǒng)是ubuntu18.04,在win10上用hyper-v裝的虛擬機(jī),tf用的是最新的master


首先獲取源碼

這沒啥可說的,但是目前出于不可抗力,連官方文檔都打不開了,我記得以前是可以的,于是只能從git上再整一個(gè)文檔源碼來看

這個(gè)文檔似乎是可以編譯成好看的格式的,沒研究明白咋搞,我看都是md格式的,于是直接用自己的md編輯器打開來看了,關(guān)于從源碼編譯參考

這個(gè)文檔的前半部分都講的是裝環(huán)境然后編譯,但后面講了用docker的方法,我感覺更加簡(jiǎn)單一些。

說來慚愧,一直都有聽說docker,但這次才真的看了一下到底是個(gè)什么東西,以前一直理解為了虛擬機(jī),現(xiàn)在才發(fā)現(xiàn)它更像是頭文件,為你提供一個(gè)只讀的環(huán)境來幫你運(yùn)行代碼,用它來編譯就可以避免各種依賴的安裝和版本不對(duì)的問題,還是蠻不錯(cuò)的。

同級(jí)目錄下還有個(gè)docker.md,但是這個(gè)側(cè)重于使用docker直接運(yùn)行你的tf代碼,關(guān)于編譯源碼這部分還是source.md里說的更清楚


接下來是安裝docker,tf文檔指向的docker文檔鏈接有點(diǎn)問題,docker那邊似乎在推廣一個(gè)桌面版本(有ui的那種),所以目錄層級(jí)變了,現(xiàn)在shell下的安裝教程位于?https://docs.docker.com/engine/install/ubuntu/

docker官方說的還是挺清楚的,照做就行不需要取舍,這里就不貼了。

唯一的問題是這套操作需要root權(quán)限,不過我感覺真到需要的場(chǎng)景下是可以讓管理員給裝的,所以就不研究怎么在用戶權(quán)限下整了。

但是裝好之后,docker每次運(yùn)行都要sudo權(quán)限,這就很蛋疼了,關(guān)于這個(gè)問題官方文檔也有講?https://docs.docker.com/engine/install/linux-postinstall/

我在這個(gè)問題卡了好久,一開始是沒找到官方的說明,博客上說的都差不多,但是照做之后全都不好使,后來仔細(xì)看了官方的才發(fā)現(xiàn)我一直漏了第三步,用戶組搞完之后一定得重啟一下,可能由于我這是桌面版ubuntu,不是光重啟shell就行,整個(gè)機(jī)器重啟之后就可以了。


docker搞定之后就到tf了,首先是下載官方提供的編譯環(huán)境

這里pull的devel版本就是專門為了編譯源碼用的,它內(nèi)部甚至并沒有一個(gè)編好的tf,而是直接放了源碼進(jìn)去,但由于docker鏡像是只讀的,按我理解,他自己的源碼編了也是白編,重啟就沒了(指中間結(jié)果),好在tf文檔提供了另一種更合理的方法(不懂為什么更合理的放在第二個(gè)說)

這里就是把你自己的源碼文件夾掛載進(jìn)container的/tensorflow位置,這樣直接用docker的環(huán)境編譯你自己的代碼就好了,docker開著的時(shí)候外面還可以用IDE改代碼,非常合理。

除了掛載了源碼,這里還掛載了一個(gè)當(dāng)前文件夾,是我新建的空文件夾,放到了container的/root/.cache,文檔里使用的是mnt,原本目的是讓編譯出來的whl文件有個(gè)去處。

但是在我成功編譯完第一次之后,再進(jìn)入docker發(fā)現(xiàn)并不是按我想象中的改哪編哪,而是直接從頭開始編譯了,研究半天發(fā)現(xiàn),bazel在編譯的時(shí)候會(huì)將他生成的文件(下載的、編譯的、以及最終結(jié)果)放在"bazel-"開頭的文件夾里,這些文件夾看似在代碼目錄下(這里就是/tensorflow),實(shí)際上是軟鏈到了/root/.cache/bazel/下,于是docker一關(guān)閉東西就都無啦,白編譯了8h焯。

我懶得找怎么給bazel替換臨時(shí)地址了,直接把我的工作環(huán)境目錄(也就是新建的文件夾)掛載成了.cache文件夾(檢查過了docker本身并沒有這個(gè)地址),問題就解決了,后續(xù)編譯的結(jié)果也往這里放就可以了。


現(xiàn)在我們就打開了一個(gè)環(huán)境極度舒適的bash,然后按照普通的編譯方法直接操作就好了(最終結(jié)果不能往/mnt放了)。

在configure的時(shí)候額外功能我一律選No,如果需要gpu版或者其他功能的話,在下載docker的時(shí)候就得選對(duì)應(yīng)的版本,關(guān)于后綴在docker.md里有詳細(xì)說明,或者直接去docker網(wǎng)站上看列表(hub.docker.com/r/tensorflow/tensorflow/tags/),我這里只編譯了純cpu版本。

第二步的編譯是最耗時(shí)的,我用家用機(jī)器(i9-9900k)需要編8h,編譯的時(shí)候看cpu消耗感覺它只用了單核,查了下可以加"--jobs 4",但是我的虛擬機(jī)創(chuàng)建的時(shí)候只有一個(gè)核emmm,大意了,反正是一次性的就干等好了。

第二步這里經(jīng)常會(huì)失敗退出,原因是bazel在編譯的時(shí)候需要聯(lián)網(wǎng)下載依賴,大部分依賴來源都是github,然而出于某種神奇原因,這網(wǎng)站經(jīng)常連不上,連外國(guó)人也連不上,所以tf自己整了個(gè)鏡像網(wǎng)址,可以從自家倉庫下載這些東西,只是這個(gè)鏡像網(wǎng)址我們自然是訪問不了的了,第一次fetch得到404之后,tf會(huì)貼心的幫我們重新嘗試github,于是連不連得上就得看命了,失敗了就反復(fù)重試,早晚會(huì)好的,畢竟下載的過程不占大頭,可以人盯一會(huì)兒,等開始編cc文件了就可以掛機(jī)了。

只要編成功了第一次,以后就快了,即便重啟docker也沒有問題。


第三步執(zhí)行過后,我們就得到了tf的whl包,正常來說直接拿到需要的地方去pip install就好了,但是作為開發(fā)來說,我需要改代碼然后重復(fù)編譯,不太想每次用pip去搞本機(jī)環(huán)境,于是就想著再回到docker里去運(yùn)行。

然而奇葩的問題是,負(fù)責(zé)編譯的devel鏡像是沒法執(zhí)行的,缺少一些依賴的python庫,而負(fù)責(zé)運(yùn)行的其他鏡像又沒有bazel沒法編譯,所以這兩個(gè)操作只能搞兩個(gè)鏡像了,因?yàn)榫幾g的是master,所以我又搞了個(gè)nightly的docker環(huán)境。

whl包其實(shí)就是個(gè)壓縮文件,可以原地解壓縮打開

解壓得到的tensorflow文件夾就是可以直接用來import的python包了,嘗試修改tensorflow/__init__.py里的__version__變量,再嘗試print(tf.__version__)是可以看到變化的。

雖說nightly環(huán)境里是自帶編譯好的tf的,但是import會(huì)優(yōu)先本地文件,所以只要處在當(dāng)前目錄,就可以保證使用的是測(cè)試代碼。

一個(gè)小問題就是,這個(gè)whl包如果是由docker來unzip,那么對(duì)于host環(huán)境(使用IDE的地方)來說這些文件是只讀的,每次改動(dòng)都需要給權(quán)限,如果是在host下unzip就沒事,不過編譯和運(yùn)行都是在docker的,unzip還要再單開一個(gè)就太麻煩了,好在時(shí)常需要改動(dòng)的并不是打包后的這些文件,所以可以容忍這個(gè)問題。

我這里忽略了文檔里的chown這步,不加上的話,外面依舊可以解壓可以改動(dòng),在docker里加上了在里面解壓外面依舊改不了,所以不大懂原本這個(gè)chown是干嘛用的,既然不需要chown了,外面也就不用傳$HOST_PERMS了。


最終留下了這么幾個(gè)腳本

啟動(dòng)編譯環(huán)境(改了進(jìn)docker后的位置)

編譯(第二次開始大概需要一兩分鐘,對(duì)于這么大個(gè)項(xiàng)目來說還可以了,以后需要頻繁修改某個(gè)特定文件的時(shí)候可以直接cp)

啟動(dòng)運(yùn)行環(huán)境

在運(yùn)行環(huán)境跑自己的代碼(docker里的python是python3.8.10)


在ubuntu上編譯TensorFlow源碼的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
沽源县| 梓潼县| 封丘县| 宁都县| 郴州市| 新邵县| 娄烦县| 喀喇沁旗| 邯郸县| 唐山市| 徐州市| 易门县| 察隅县| 城固县| 阿拉善右旗| 台北市| 平邑县| 陇西县| 霍城县| 千阳县| 陕西省| 宁武县| 正宁县| 隆德县| 彰化县| 新丰县| 宝坻区| 合江县| 闽清县| 乳山市| 宜宾县| 垣曲县| 泾川县| 河南省| 甘孜县| 衡山县| 禹城市| 霍林郭勒市| 聂拉木县| 玛纳斯县| 赤壁市|