记录之使用3080ti运行tensorflow-gpu=1.x版本的源码
環(huán)境:Anaconda3,ubuntu18.04,RTX3080ti,python3.7
RTX3080ti顯卡是當(dāng)前市面上比較新的,算力比較強(qiáng)的顯卡,且這類顯卡采用了安培架構(gòu)僅支持cuda11.x及以上版本。關(guān)于tf-gpu,cuda,cudnn間的對應(yīng)關(guān)系,我們可以查看:從源代碼構(gòu)建 ?|? TensorFlow
關(guān)于驅(qū)動(dòng)和cuda,cudnn的對應(yīng)關(guān)系,我們可以查看:Release Notes :: CUDA Toolkit Documentation
?
##問題1:我的30系列卡的驅(qū)動(dòng)為450.x.x或更高,按照向下兼容的道理,那我是不是可以使用cuda10.x?
正常答案是不能,因?yàn)檎G闆r下30系列的卡只支持cuda11.x(非正常的答案也有,不過安裝起來比較麻煩,這里我們只討論正常情況,下面會(huì)給出這種情況的鏈接)。這個(gè)問題也是困擾我的問題,因?yàn)槲乙恢北种蛳录嫒莸牡览?#xff0c;相信我的3080ti支持cuda10.x,我在幾次測試時(shí)發(fā)現(xiàn),行不通。我們都知道,在使用conda安裝tf-gpu的時(shí)候,會(huì)自動(dòng)安裝對應(yīng)的cudatoolkit和cudnn,這也著實(shí)為我們省了不少麻煩。但是在安裝時(shí)發(fā)現(xiàn)conda可以search到的最高tensorflow-gpu版本為2.4.1,而其對應(yīng)的cudatoolkit是10.1.183,這種辦法裝好的環(huán)境,在使用tf.test.is_gpu_avaliable()時(shí)打印出的是True,但在實(shí)際跑代碼時(shí),會(huì)卡在奇怪的地方:
然后報(bào)最下面的一行錯(cuò),可以看到,cuda和cudnn雖正常打開,但是并沒辦法使用,就是因?yàn)?0系列的卡只支持cuda11.x,這也就意味低于tf-gpu=2.x版本的代碼是不能運(yùn)行的,tf-gpu=1.x的版本更不可以。怎么解決呢,繼續(xù)看問題2和3。
PS:非正常情況,因?yàn)镚eogle不再維護(hù)tf1.x,但是Nvidia公司有在維護(hù)一款tf-gpu=1.15.x,且可以運(yùn)行在30系列的卡,該方法需要科學(xué)上網(wǎng)和指定的ubuntu版本(ubuntu20.x),因此我就沒有嘗試,有興趣的可以一試,鏈接:https://blog.csdn.net/wu496963386/article/details/109583045)
##問題2:我虛擬環(huán)境中的tensorflow-gpu如果不使用conda自動(dòng)安裝的cudatoolkit和cudnn,直接使用大環(huán)境的CUDA和cudnn(前提是你的大環(huán)境已經(jīng)配置好)?
答案是可以,因?yàn)閏onda可以search到的最高tensorflow-gpu版本為2.4.1,而其對應(yīng)的cudatoolkit是10.1.183,我們的30卡不可以直接用。由于該tf-gpu和cudatoolkit,cudnn是捆綁安裝的,且卸載的時(shí)候是捆綁卸載的,所以我們不能使用conda來裝tf-gpu了。將原來conda裝的tf-gpu卸載,會(huì)一并卸載cudatoolkit和cudnn。如果環(huán)境中沒有cudatoolkit和cudnn,就會(huì)使用大環(huán)境中的cuda和cudnn,使用pip在虛擬環(huán)境中安裝tf-gpu,由于我的大環(huán)境cuda版本為11.2,因此我下載了tf-gpu=2.6.1。不少同學(xué)會(huì)問,可是我的代碼時(shí)1.x的怎么辦,接著看問題3。
##問題3:tf2.x和tf1.x相比,很多函數(shù)都變了,也舍棄了很多函數(shù),怎么辦?
根據(jù)問題1,我們已經(jīng)知道,tf-gpu=1.x的版本正常是無法在30系列的卡上運(yùn)行的,想調(diào)顯卡就必須使用tf-gpu=2.x,因此我們需要針對修改源碼,以讓其在tf-gpu=2.x下運(yùn)行,主要涉及的改動(dòng):
1.在import tensorflow 時(shí)使用:
import tensorflow.compat.v1 as tf ### tf.disable_v2_behavior()這種方式import的tf不包含contrib,因?yàn)閠f2.x丟棄了這個(gè)包
2.一些使用contrib包的初始化方式及函數(shù):
tf1.x: tf.contrib.layers.xavier_initializer()-->tf2.x: tf.keras.initializers.glorot_normal() tf1.x: tf.contrib.layers.l2_regularizer(0.01)) -->tf2.x: tf.keras.regularizers.l2(0.01))?大家在修改時(shí),要根據(jù)出現(xiàn)的報(bào)錯(cuò)修改,改動(dòng)應(yīng)該不會(huì)涉及太多。
最后給大家說一下,我當(dāng)前的配置:Nvidia-driver:465.31,tf-gpu=2.6.1,cuda=11.2(11.2.142), cudnn=8.1.1
最后還有一個(gè)問題:根據(jù)從源代碼構(gòu)建 ?|? TensorFlow這里查詢到的tf-gpu=2.4.0應(yīng)該是搭配cuda=11.0的,為什么conda里會(huì)搭配cudatoolkit=10.1.x呢?應(yīng)該是該網(wǎng)址給出的是已知能用的搭配,并不是所有搭配,想嘗試conda這組搭配可不可行的,可以使用20系列顯卡,安裝搭配cuda10.1的驅(qū)動(dòng)。
總結(jié)
以上是生活随笔為你收集整理的记录之使用3080ti运行tensorflow-gpu=1.x版本的源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录之关于tensoflow中使用Ada
- 下一篇: pytorch选出数据中的前k个最大(最