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

85 篇文章 260 订阅
14 篇文章 7 订阅

前言:

前面讲解过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服务器显卡驱动版本是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 <CudaInstaller> with the name of this run file:

    sudo <CudaInstaller>.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中关于动态(共享)库的设置

 


 

  • 12
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值