Date: 2020/11/22
Coder: CW
Foreword:
CW 近日在自己的機子上發(fā)現(xiàn)右锨,nvcc --version 和 nvidia-smi 顯示出來的CUDA版本不一致瞧筛,其中前者顯示的版本是10.2,而后者是11.0抹估,但是深度學(xué)習(xí)相關(guān)的程序是能正常跑的,期間GPU也確實有在使用(通過nvidia-smi可以看出)弄兜。
由于個人一貫以來的“居安思我撸”風(fēng)格,擔(dān)心這種情況會埋坑替饿,于是查閱了相關(guān)資料進行了解语泽,正好也彌補了這部分知識的空白。本文會先解釋下 nvcc --version 和 nvidia-smi 各自顯示出來的版本號的意義视卢,然后分享下多版本CUDA切換的經(jīng)驗踱卵,最后再補充下如何正確選擇與CUDA版本匹配的Pytorch。
nvcc & nvidia-smi
nvcc 屬于CUDA的編譯器腾夯,將程序編譯成可執(zhí)行的二進制文件颊埃,nvidia-smi 全稱是 NVIDIA System Management Interface ,是一種命令行實用工具蝶俱,旨在幫助管理和監(jiān)控NVIDIA GPU設(shè)備班利。
CUDA有 runtime api 和 driver api,兩者都有對應(yīng)的CUDA版本榨呆, nvcc --version 顯示的就是前者對應(yīng)的CUDA版本罗标,而 nvidia-smi顯示的是后者對應(yīng)的CUDA版本。
用于支持driver api的必要文件由?GPU driver installer?安裝积蜻,nvidia-smi就屬于這一類API闯割;而用于支持runtime api的必要文件是由?CUDA Toolkit installer?安裝的。nvcc是與CUDA Toolkit一起安裝的CUDA compiler-driver tool竿拆,它只知道它自身構(gòu)建時的CUDA runtime版本宙拉,并不知道安裝了什么版本的GPU driver,甚至不知道是否安裝了GPU driver丙笋。
CUDA Toolkit Installer通常會集成了GPU driver Installer谢澈,如果你的CUDA均通過CUDA Tooklkit Installer來安裝煌贴,那么runtime api 和 driver api的版本應(yīng)該是一致的,也就是說锥忿, nvcc --version 和 nvidia-smi 顯示的版本應(yīng)該一樣牛郑。否則,你可能使用了單獨的GPU driver installer來安裝GPU dirver敬鬓,這樣就會導(dǎo)致 nvidia-smi 和 nvcc --version 顯示的版本不一致了淹朋。
通常,driver api的版本能向下兼容runtime api的版本钉答,即 nvidia-smi 顯示的版本大于nvcc --version 的版本通常不會出現(xiàn)大問題础芍。
多版本CUDA切換
進入以上鏈接下載指定版本的CUDA,這里以?CUDA Toolkit 11.0 Update 1?為例:
選擇自己的操作系統(tǒng)数尿、架構(gòu)以及對應(yīng)的安裝類型者甲。
安裝類型建議選擇 runfile 安裝,使用deb的方式可能會將已安裝的較新的顯卡驅(qū)動替換掉砌创。
選擇完畢后根據(jù)提示的命令進行安裝。
接下來會出現(xiàn)窗口進行一些安裝選項的選擇鲫懒,若你本地已經(jīng)有了Driver并且你不想替換掉嫩实,那么可以不選擇Driver進行安裝。
安裝完畢后窥岩,會在 /usr/local/ 目錄下出現(xiàn)相應(yīng)版本的cuda文件夾甲献,我這里是 /usr/local/cuda-11.0/。在前言中提到颂翼,我 nvcc --version 的版本是10.2晃洒,現(xiàn)在我要將其替換為剛下載的11.0,那么可以:
1. 編輯 ~/.bashrc 文件
2. 更改 PATH 和 LD_LIBRARY_PATH 環(huán)境變量:
export PATH=/usr/local/cuda-11.0:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH
3. 保存內(nèi)容退出朦乏,使其生效:source ~/.bashrc
現(xiàn)在球及,使用 nvcc --version 可以看到顯示的版本已經(jīng)是11.0了,與 nvidia-smi 的一致呻疹。
在這種方式下吃引,每次我想使用其它CUDA版本的runtime api時,都需要更改~/.bashrc文件刽锤,這里再介紹另一種避免更改環(huán)境變量的方式:
i). 首先確保 PATH 和 LD_LIBRARY_PATH 中含有 /usr/local/cuda 路徑镊尺,注意是/cuda而不是/cuda-xxx
ii).?刪除之前創(chuàng)建的軟鏈接:rm -rf /usr/local/cuda
iii). 建立新的軟鏈接:sudo ln -s/usr/local/cuda-10.2/ /usr/local/cuda/ (此處代表我想使用10.2版本)
這樣之后,通過 nvcc --version 可以看到CUDA runtime api的版本又切換回10.2了并思。
如何選擇與CUDA版本匹配的Pytorch
那么 nvcc --version 與 nvidia-smi 的版本不一致的情況下庐氮,有些朋友可能就會懵了:我該如何選擇與CUDA版本匹配的Pytorch呢?(煉個丹也太南了吧~K伪恕)
其實弄砍,只要上去Pytorch官網(wǎng)瞄瞄仙畦,細(xì)心的你應(yīng)該能夠發(fā)現(xiàn)在命令中指定CUDA版本時,用的是?cudatoolkit输枯,而 nvcc --version 顯示的版本就是通過CUDA Toolkit Installer在安裝時決定的议泵,因此,我們應(yīng)該選擇與 nvcc --version 對應(yīng)的CUDA版本匹配的Pytorch桃熄。
相對而言先口,nvidia-smi 顯示的是driver api對應(yīng)的CUDA版本,若使用了單獨的GPU driver Installer來安裝驅(qū)動瞳收,那么nvidia-smi顯示的版本與CUDA Toolkit所安裝的版本就很可能不一致了碉京。
END
許多煉丹愛好者可能都只注重花里胡哨的深度學(xué)習(xí)知識, 選擇性地?zé)o視了關(guān)于硬件螟深、GPU谐宙、計算芯片等方面的知識,這樣界弧,自己的短板就未免過于明顯了凡蜻。雖然不要求洋洋精通,但只要是與你從業(yè)領(lǐng)域相關(guān)的知識都應(yīng)或多或少有所涉獵垢箕,這樣做起事來才能得心應(yīng)手划栓。
另外,關(guān)于GPU與CUDA的知識可參考這篇文章?GPU與CUDA知識揭秘?条获,內(nèi)容全面同時也敘述簡潔忠荞,非常棒,感恩樂于分享知識的朋友帅掘!