天天看點

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

在學習DL中,複現經典論文是很好的學習方式,但是論文和代碼通常是數年前釋出的,用最新版本的架構、程式設計語言和編譯器等,無法與之前的論文代碼相容。

安裝舊版本的包及程式設計語言可以通過conda虛拟環境實作,但是安裝不同版本gcc、CUDA、cuDNN實作共存和切換則比較複雜,經曆了多次系統崩潰,重裝系統,踏過許多天坑(浪費超多時間), 特此總結記錄一下。

文章結構大緻如下:

一、建立虛拟環境

二、安裝不同版本的gcc, g++

三、配置不同CUDA、cuDNN

一、建立虛拟環境

通常可以為一篇文章或項目配置一個單獨的虛拟環境,推薦使用conda。檢視文章的github或者首頁,可以獲得python的版本。

conda 
           

使用該指令建立一個名為Alexnet的虛拟環境,并指定python版本為2.7

二、安裝不同版本的gcc, g++

檢視官方或别人複現的文檔,也可以檢視使用的深度學習架構的版本。以tensorflow為例,明确需要的版本後,前往 GPU支援 檢視tensorflow版本對應的gcc版本。

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

以安裝tensorflow_gpu-1.14.0為例,則需要gcc-4.8和CUDA10.0, cuDNN7.4(文章後面安裝中均使用該方案)。

gcc --version #檢視目前版本的gcc
           
cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

可以看見目前gcc版本為7.5.0, 我們希望在降級的同時,也儲存原版本,随時切換,這樣跑新代碼和舊代碼都很友善。

1.安裝低版本的gcc,g++

sudo apt-get install gcc-4.8
sudo apt-get install g++-4.8
           

2.将低版本的gcc,g++加入到gcc清單中,分别設定優先級(例如将舊的設定為10,新的設定為20)

# set for old version
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10

# set for high version
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 20
           

3.若需要切換gcc、g++的版本,輸入以下指令後選擇版本,便可以實作不同版本gcc之間的切換。(注意gcc、g++要同時切換,保持版本一緻), 測試結果如下:

sudo 
           
cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

三、配置合适CUDA、cuDNN(

CUDA=10.0, cuDNN=7.4

1.檢視本機已經安裝的CUDA、cuDNN

在上一篇文章中已經介紹了安裝最新CUDA和cuDNN,可以輸入指令查詢本機版本。

https://zhuanlan.zhihu.com/p/157339074​zhuanlan.zhihu.com

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...
nvcc --version #檢視目前cuda版本,為10.1
           
cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...
cat 
           
cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

通過測試,可以知道已經安裝的CUDA, cuDNN不是需要的版本,故需要安裝低版本。

2.選擇合适driver版本

我們需要安裝低版本的CUDA和cuDNN,它們版本和Nvidia驅動版本是相輔相成的,通過官方文檔可檢視不同CUDA版本對應的驅動。( CUDA版本驅動 )

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

查詢得到需安裝的驅動版本為: >=410.48

nvidia-smi #檢視目前顯示卡驅動
           
cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

這裡可以知道,本機目前driver版本為440。細心的朋友可能發現,CUDA版本與已經安裝的版本并不相同,具體原因可見這裡,以 nvcc --version 輸出的結果為準。

這裡有一個大坑!!

雖然官方文檔寫明了CUDA10.0對應的driver>=410.48, 但是我之前試過了基于driver450安裝呢CUDA10.0,結果系統崩了,試了很多方法調式都沒有效果,不得不又重裝了一次系統。嘗試搜尋了解了一下原因,對于tesla的驅動而言:

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

一些高版本的驅動能支援不同版本的CUDA,但是N/A的意思是官方也不知道能不能支援,這tm怎麼玩...我推薦的做法是:

a.如果之前沒有安裝nvidia驅動,則安裝418版本驅動,它支援CUDA10.0到11(經網友測試支援CUDA10.0)

b.如果已經安裝nvidia驅動,可以google關鍵詞,如"nvidia driver xx CUDA10.0 cuDNN7.4"檢視是否有成功安裝的例子(例如我找到了driver440能夠相容CUDA10.0)

c. 若搜不到相關的案例,建立重新安裝合适的driver,避免之後可能出現的系統崩潰

3.安裝低版本的CUDA、cuDNN

首先明确cuDNN是基于CUDA的深度學習GPU加速庫,有了它才能在GPU上完成深度學習的計算。cuDNN采用了簡單的

插入式設計

, 隻用把cuDNN檔案複制到CUDA的對應檔案夾裡就可以。

是以實作不同版本的CUDA流程是: 分别安裝不同版本的CUDA,把不同版本的cuDNN下載下傳複制到對應CUDA檔案中,利用

軟連結

實作CUDA版本的切換。

以安裝CUDA10.0, cuDNN7.4為例,在官網選擇合适版本的CUDA版本:下載下傳對應的runfile和更新檔

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

進入下載下傳路徑,安裝runfile

sudo sh cuda_10.0.130_410.48_linux.run
           

安裝過程需注意兩點:

a. 由于已經安裝了顯示卡驅動,不安裝顯示卡驅動

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

b. 希望多個版本的CUDA共存,不選擇安裝軟連接配接

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

c.安裝完成後會提示沒有加入環境導緻不成功,沒有關系,之後會通過軟連結完成配置

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

d. 安裝CUDA更新檔

sudo sh cuda_10.0.130.1_linux.run
           

e. 進入官網下載下傳cuDNN(需新增賬號)

切換到下載下傳目錄,解壓cuDNN

tar zxvf cudnn-10.0-linux-x64-v7.4.2.24.tgz
           
解壓後可以得到一個cuda檔案夾,切換至該目錄

,将cuDNN 的對應檔案複制到

對應cuda的庫

中(在檔案包目錄下)

sudo cp lib64/* /usr/local/cuda-10.0/lib64/
sudo cp include/cudnn.h /usr/local/cuda-10.0/include/
           

f. 配置環境變量

打開.bashrc檔案并修改環境變量,若安裝其他版本CUDA時候設定過PATH, 将其注釋掉。

sudo gedit ~/.bashrc

#在bashrc末尾添加(如下圖)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
           
cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...
#儲存退出後,source一下
source ~/.bashrc
           

g. 利用軟連結切換CUDA版本

切換到usr/local目錄,檢視目前CUDA連結的版本

cd /usr/local
stat cuda
           
cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

可以看見目前cuda連結到的版本是10.1,通過以下指令切換軟連結到CUDA10.0(需要切換回10.1采取同樣操作)

sudo rm -rf cuda
sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda
## 切換CUDA版本後,需要重新開機電腦
           

重新開機後,可以看見CUDA, cuDNN已成功切換為10.0和7.4.2:

cuda nvcc版本不一緻_深度學習環境搭建(二): Ubuntu不同版本gcc,CUDA,cuDNN共存,切換解決方案...

不同版本的gcc,g++,CUDA,cuDNN的共存和友好切換終于實作了!!!

繼續閱讀