CUDA和CUDNN版本切換

天地辽阔發表於2024-04-27

0 背景

在用不同框架做深度學習時,難免會遇到需要不同版本的cuda和cudnn版本的情況,如果把原來版本的解除安裝掉重新安裝新版本,則會影響其它框架的使用,最好的方法是在主機上安裝多個版本的cuda和cudnn,需要用到哪種就切換到哪種,這樣就免去了重複解除安裝安裝的工作。

cuda:由NVIDIA推出的通用平行計算架構,包含了CUDA指令集架構(ISA)以及GPU內部的平行計算引擎。 利用CUDA編寫出的程式可以在NVIDIA顯示卡上跑的飛起。進行CUDA開發需要依次安裝驅動、toolkit、SDK三個軟體。深度學習翫家通常只需要安裝顯示卡驅動和toolkit即可。[可參考]

cudnn:用於加速DL的運算元庫。安裝時只需要下載對應的tar包,解壓後將標頭檔案(include/cudnn*.h)和庫(lib64/libcudnn*)複製到cuda對應資料夾下即可。

1 安裝目錄和版本檢視

安裝的cuda一般在 /usr/local/ ,通常建立一個軟連結,將cuda連結到需要的版本。

CUDA和CUDNN版本切換

進入cuda,可見include和lib64分別連結到實際使用的標頭檔案目錄和庫目錄。

CUDA和CUDNN版本切換

舊版的/usr/local/cuda/ 路徑下一般有一個version.txt文件,裡面記錄了cuda的版本資訊,因此可用cat /usr/local/cuda/version.txt 命令檢視版本資訊【新版的改為version.json,所以可直接檢視該檔案,或者使用 nvcc -V 命令】

如果安裝了多個cuda,實際使用的可能不是/usr/local/cuda/下邊的版本,這個時候可以使用nvcc -V指令來檢視實際使用的cuda版本。

同理,cudnn的資訊在其標頭檔案 cudnn_version.h 裡。

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2          #舊版
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2  #新版

3 cuda環境變數和版本切換

3.1 ~/.bashrc中環境變數

在~/.bashrc中,通常按照下面習慣1來設定環境變數,但這個程式碼存在一個BUG,即在LD_LIBRARY_PATH不存在時,LD_LIBRARY_PATH會被賦值為":/usr/local/cuda/lib64"而不是"/usr/local/cuda/lib64",有一個冒號的區別。這個BUG對於pytorch來說無所謂,哪怕不加,pytorch也會透過/usr/local/cuda找到外部的CUDA(pytorch查詢CUDA的過程)。但對於一些相容性沒那麼好的程式碼而言,環境變數是最重要的。因此最好使用習慣2來新增環境變數。【可參考

## 設定習慣1,有bug
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

## 設定習慣2,推薦
if [ $LD_LIBRARY_PATH ]; then
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
else
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64
fi

if [ $PATH ]; then
    export PATH=$PATH:/usr/local/cuda/bin
else
    export PATH=/usr/local/cuda/bin
fi

if [ $CUDA_HOME ]; then
    export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
else
    export CUDA_HOME=/usr/local/cuda
fi
  1. 注意Linux中PATH、 LIBRARY_PATH、 LD_LIBRARY_PATH變數的區別;
  2. 可用 echo $CUDA_HOME 命令來檢視該變數的實際值【之前的設定果然中招了】;

3.2 cuda版本切換

方法一:如果只修改自己使用者的CUDA版本,則只需要修改環境變數即可,開啟~/.bashrc檔案,找到cuda的環境變數,將cuda的路徑改為自己需要的cuda版本路徑,然後 source ~/.bashrc 使之生效。這樣的好處是隻改了當前使用者的cuda版本,其它使用者還可以用他們需要的cuda版本,互不影響。

## 可參照3.1的習慣2修改
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-11.3/lib64
export PATH=$PATH:/usr/local/cuda-11.3/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-11.3

方法二:如果想要把伺服器上多使用者的CUDA版本都切換了,則刪除原有連結,建立新的軟連結即可,這樣伺服器上每個使用者的版本都切換了。

sudo rm -rf /usr/local/cuda #刪除之前建立的軟連結
sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda #建立新 cuda 的軟連結,注意修改自己對應的版本
# 可以使用 ls -l 檢視軟連結情況,帶 -> 符號的表明是軟連結

4 cudnn版本切換

安裝cudnn的方法,就是下載一個對應版本的tar包, 官網下載地址

解壓:tar zxvf xxx.tgz

然後將所有標頭檔案(include/cudnn*.h)和庫(lib64/libcudnn*)複製到cuda對應目錄下面。

## 先將原來的cudnn移到指定位置,以便日後恢復
sudo mv /usr/local/cuda-10.0/include/cudnn*   temp/include
sudo mv /usr/local/cuda-10.0/lib64/libcudnn*  temp/lib

## 將所有標頭檔案和庫複製到cuda對應目錄下
sudo cp include/cudnn*  /usr/local/cuda/include/
sudo cp lib64/libcudnn* /usr/local/cuda/lib64/
  1. cudnn標頭檔案都是以cudnn開頭,庫檔案都是以libcudnn開頭,放到cuda中就可以用;

參考:
https://blog.csdn.net/zong596568821xp/article/details/80880204
https://qiyuan-z.github.io/2022/01/04/Ubuntu多版本cuda安裝與切換/

相關文章