linux在非root用户之下安装多个版本的CUDA和cudnn,并且自由切换

linux在非root用户之下安装多个版本的CUDA和cudnn,并且自由切换_第1张图片

前言:

前面讲解过Windows下面如何安装多个不同版本的CUDA,参考:

windows下同一个显卡配置多个CUDA工具包以及它们之间的切换

普通用户不使用sudo安装多个版本CUDA和cuDNN确定安装的软件版本下载CUDA Toolkit下载cuDNN安装CUDA配置cuDNN配置用户环境变量安装多个版本的CUDA,然后在不同的CUDA版本之下进行切换。
 

一、确定安装的软件版本

安装前需先确定显卡驱动、CUDA、cuDNN等之间的对应关系。由于我的帐户没有管理员权限,不能安装显卡驱动,只能根据现有驱动的版本来选择CUDA版本,输入指令:

cat /proc/driver/nvidia/version  

查看当前服务器上的Nvidia的显卡驱动版本号:

不同版本cuda对应的NVIDIA驱动版本

linux在非root用户之下安装多个版本的CUDA和cudnn,并且自由切换_第2张图片

我的Linux服务器显卡驱动版本是384.130,大致能安装CUDA 7.0~CUDA 9.0,这里以CUDA 8.0为例进行安装。
cuda8.0与Linux系统以及GCC的对应关系

在这里插入图片描述

1.1 下载CUDA Toolkit
cuda的下载地址: https://developer.nvidia.com/cuda-toolkit-archive

这里我选择的是CUDA 8.0,其他参数选择如下图所示:

在这里插入图片描述

注意Installer Type这里选择runfile (local)。

1.2 下载cuDNN
cuDNN的下载: https://developer.nvidia.com/rdp/cudnn-archive
随便选择一个与CUDA 8.0对应的版本,这里以cuDNN v7.1.3为例:

在这里插入图片描述

选择以.tgz为后缀的Linux包,这里选择第一个:

在这里插入图片描述


二、安装CUDA

在安装包所在目录下输入指令sh XXX进行安装,

2.1 安装CUDA

#先执行下面的命令安装相关依赖,
#否则会出现`Missing recommended library`错误
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev 


sudo sh cuda_8.0.61_375.26_linux.run #开始安装

#..一堆协议说明...
#直接按q退出协议说明.
zerozone@zerozone: accept/decline/quit: accept  #接受协议

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 375.26? 
y)es/(n)o/(q)uit: n  #是否显卡驱动包,由于已经安装显卡驱动,选择n

Install the CUDA 8.0 Toolkit?
(y)es/(n)o/(q)uit: y #是否安装工具包,选择y

Enter Toolkit Location
[ default is /usr/local/cuda-8.0 ]: #工具包安装地址,默认回车即可

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y #添加链接**注意这个连接,如果你之前安装过另一个版本的cuda,除非你确定想要用这个新版本的cuda,否则这里就建议选no,因为指定该链接后会将cuda指向这个新的版本**

Install the CUDA 8.0 Samples?
(y)es/(n)o/(q)uit: y #安装样例

Enter CUDA Samples Location
 [ default is /root ]:  #样例安装地址默认即可

# ***安装信息***
Installing the CUDA Toolkit in /usr/local/cuda-8.0 ...

Missing recommended library: libXi.so
Missing recommended library: libXmu.so
#注意,这里出现了Missing recommended library错误,
#是因为博主在第一次安装时,没有添加最开始的那条安装相关依赖的指令,
#之后我添加了依赖后,再次安装,就没有Missing错误了

Installing the CUDA Samples in /root ...
Copying samples to /root/NVIDIA_CUDA-8.0_Samples now...
Finished copying samples.

===========
= Summary =
===========
Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-8.0
Samples:  Installed in /root, but missing recommended libraries

Please make sure that
 -   PATH includes /usr/local/cuda-8.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-8.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 8.0 functionality to work.

To install the driver using this installer, run the following command, replacing  with the name of this run file:

    sudo .run -silent -driver

Logfile is /tmp/cuda_install_6388.log   
# ***安装完成***

注意点:在安装CUDA的过程中,最重要的是涉及到“软连接”是否需要配置,有位后面多个CUDA版本的切换正是通过这个软连接来选择的。

2.2 配置cuDNN——实际上就是文件拷贝

使用指令tar -xzvf /home/zb/cuda/cudnn-8.0-linux-x64-v7.1.tgz -C /home/zb/cuda/tem/ 将cuDNN解压到tem文件夹并执行以下指令:

cp /home/zb/cuda/tem/cuda/include/cudnn.h  /home/zb/cuda/cuda-8.0/include/  
cp /home/zb/cuda/tem/cuda/lib64/libcudnn*  /home/zb/cuda/cuda-8.0/lib64
chmod a+r /home/zb/cuda/cuda-8.0/include/cudnn.h  /home/zb/cuda/cuda-8.0/lib64/libcudnn*


2.3 配置用户环境变量

Tensorflow官方安装历程要求注意的是:配置PATH和LD_LIBRARY_PATH和CUDA_HOME环境变量.

vim ~/.bashrc #修改配置文件(如果你用的是zsh,则需要修改 ~/.zshrc文件)

#在文件结尾处添加
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以及CUDA切换

如果要安装多个共存的CUDA版本则重复上面的步骤,挑选相对应且系统支持的CUDA、cuDNN进行类似的安装,但是安装了多个不同版本的CUDA之后,如何进行切换呢?有两种方式:

(1)每次都直接修改.bashrc

安装好两个版本的cuda之后,我们需要修改.bashrc文件,和官方说明的一样,我们在.bashrc文件中添加配置路径,一般来说如果我们按照cuda-9.1需要这样写:

export PATH=/usr/local/cuda-9.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

如果我们同时安装了cuda-9.1cuda-9.2,cuda-10.1的时候,可能想到是这样写:

export PATH=/usr/local/cuda-9.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

export PATH=/usr/local/cuda-9.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}这样写

export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}这样写

这样写当然没什么问题,我需要使用哪个版本的CUDA,我就将PARH,LD_LIBRARY_PATH,CUDA_HOME这三个环境变量指向他,我们需要优先使用哪一个cuda版本,我们就将对应的哪个版本的这两句话放在最前面,实际上就是保证在环境变量PATH和LD_LIBRARY_PATH中哪一个版本在前面,哪一个在后面,在最前面的就是优先使用的CUDA,但是这样比较麻烦,每次要调整上面这两句话的顺序来交换。

(2)直接通过软连接来实现

我们可以通过一个文件夹的软连接来实现,将这个软连接指向cuda的安装位置,每次使用的时候改变软连接的指向就可以了。

比如我们首先建立一个cuda-9.0的软链接如下:

ln -sf /usr/local/cuda-9.1 /usr/local/cuda
# -s 表示符号链接symbolic
# -f 表示如果这个软连接文件cuda不存在,则创建一个

创建软连接之后,我们发现 /usr/local/  下面多了一个cuda文件,它类似于一个快捷方式,直接双击,发现进入了 /usr/local/ cuda-9.0文件夹,说明成功了。

注意:这个软连接文件的位置当然不固定,名称也不固定,很多人说tensorflow是默认通过/usr/local/cuda来寻找cuda的,这是一种错误的说法,所以软连接可以使任意的位置。如我的是在:

ln -sf /home/cuda-9.1 /home/cuda

因为我没有root权限,所以我的cuda是安装在用户目录之下,软连接也安装在用户目录之下。

现在我们就不需要在用户环境变量中添加几个,只需要添加一次,而且不用再反反复复更改顺序了即可。

所以我们通过建立一个/usr/local/cuda 到任何一个版本的 /usr/local/cuda-version 的软连接就可以了啊。如下所示

export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

这样我们在切换软连接的时候,系统就可以自动根据我们的软连接查找相应的路径了。所以我们每次需要使用不同的CUDA版本的时候,只需要更改/usr/local/cuda/这个软连接就可以了。

如下:

ln -s /usr/local/cuda-9.2 /uer/local/cuda    # 为9.2创建软连接

ln -s /usr/local/cuda-9.0 /uer/local/cuda    # 为9.0创建软连接

ln -s /usr/local/cuda-10.0 /uer/local/cuda    # 为10.0创建软连接

ln -s /usr/local/cuda-10.1 /uer/local/cuda    # 为10.1创建软连接

所以每次只需要更改这个软连接就可以让我们的PARH,LD_LIBRARY_PATH,CUDA_HOME这三个关键的环境变量指向不同的目录

另外每次给同一个软连接制定不同的源文件夹,可能会出现问题,所以最好的方式每次更改之前,删除原来的软连接,然后在创建一个新的软连接,如下:

rm /uer/local/cuda    # 删除原来的软连接
ln -sf /usr/local/cuda-10.1 /uer/local/cuda    # 为10.1创建新的软连接

补充:另外我们一般说通过命令 nvcc -V 就可以查看我们所使用的CUDA的版本信息,这个命令实际上就来自于相对应的cuda版本的bin目录之下,所以,PATH中,哪一个版本的cuda在前面就是哪一个。

(3)对于有管理员权限的用户

可以使用 ld.so.conf 以及  ld.so.conf.d 配合 软连接来实现多个CUDA版本切换

  • 第一步:创建一个软连接  /usr/local/cuda  指向  /usr/local/cuda-xx.x  (任何一个cuda版本),这是相同的道理;
  • 第二步:在 etc/ld.so.conf.d在中建立一个 cuda.conf 文件,然后在里面添加如下内容:
  • /usr/local/cuda/lib64   # cuda实际上是软连接,可以不断改变切换的
  • 第三步:然后再etc/ld.so.conf使用 include 导入所有的 etc/ld.so.conf.d 中的路径,即
  • include /etc/ld.so.conf.d/*.conf
  • 第四步:再使用ldconfig产生 etc/ld.so.cache 缓存文件
     

当然上面的操作也是需要每次改变软连接cuda指向不同的cuda版本来切换,还需要有root权限才行,具体参考我的另外一篇文章

Linux中关于动态(共享)库的设置

 


 

你可能感兴趣的:(python,深度学习,Linux,Linux的CUDA安装,CUDA_PATH,LO_LIBRARY_PATH,多个不同版本的CUDA,Linux的CUDA配置,CUDA软连接)