install pytorch is all you need
当你想要使用pytorch时,可能需要知道的东西:
gpu driver cuda cudnn cudatoolkit conda pip torch
摘要
文章实在是太长了,先上结论吧
安装cudatoolkit有两种方式:官网和conda
常说的安装cuda就是安装cudatoolkit
安装pytorch有两种方式:pip和conda
推荐的torch安装方式:使用conda同时安装torch和cudatoolkit
conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=11.3 -c pytorch -c conda-forge
注意:如果在conda和pip镜像源安装软件时,如果安装的版本和你指定的版本不一致,比如安装gpu版的torch,安装完之后却是cpu版的,那一定是你的镜像源出了问题,镜像和官网没有一致性同步导致的。可以直接打开对应的镜像源的网页,搜索你要安装的软件版本,查看对应的版本号,确保有可用的软件再进行安装。
更重要的是安装时不要无脑点yes,先看一下要下载的版本是否是自己想要的版本:
(图来自 zxz)
上图中的pytorch就是指定了cudatoolkit10.2还有cudnn的正确版本。
GPU driver
众所周知,跑深度学习需要一块GPU(硬件),而为了让这块硬件能够正常工作就需要安装GPU驱动(driver),一般来说服务器上的GPU都已经由管理员安装了显卡驱动,所以如果你是一个普通用户这步就不需要你操作了。如果你是服务器管理员,那么可以在英伟达官网下载对应的显卡驱动进行安装,CentOS7显卡驱动安装,在这里我们不再赘述。
- 那么如何知道我的显卡驱动版本呢?
使用 nvidia-smi 命令,查看详细的信息:
可以看到当前驱动的版本是455.32.00(特别感谢伟大的管理员为我们安装高版本的驱动),CUDA deriver api 版本是11.1 (一定要记住现在是cuda deriver)然后这台服务器有两张显卡可以使用,编号分别是0和1,这点一定要特别注意,显卡编号从0开始
CUDA
我们平时所说的安装cuda是其实是安装cuda toolkit,因为cuda仅仅是一种计算平台,而cuda toolkit才是我们真正要使用的程序。在第一步中,我们已经有了显卡驱动,cuda toolkit和显卡驱动版本是有非一一对应关系的。
-
cuda toolkit要求的最低显卡驱动版本对照表
我们以第一行为例:如果你要安装cuda 11.6,那么你的显卡驱动版本要>=450.80.02。也就是说如果现在你的显卡驱动版本>=450.80.02,那么你既可以安装cuda 11.6 也能安装 cuda 11.1 甚至是 cuda 10.2,所以你只要满足了最高版本的cuda显卡驱动要求,就能向下兼容所有的cuda 版本。并且这些cuda版本可以并存,只要我的驱动版本满足要求,我可以在服务器上安装多个cuda 。
CUDA有两个主要的API:runtime(运行时) API和driver API
当我们使用 nvidia-smi 命令时显示的就是driver API(这是安装显卡驱动时自带的cuda,这是一种更接近底层的接口,训练神经网络并不会用到),当我们使用 nvcc -V 命令时调用的是runtime(运行时) API,也就是你程序真正用到的cuda版本。
- 如何安装cuda toolkit 呢?(官网安装cuda toolkit)
参考:显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么?
1.下载
到 CUDA Toolkit Download 下载所需版本,以 cuda_9.0.176_384.81_linux.run为例(一般都建议下载.run结尾的文件,便于我们多版本切换):
2.安装
进入到放置 cuda_9.0.176_384.81_linux.run 的目录:
sudo chmod +x cuda_9.0.176_384.81_linux.run # 为 cuda_9.0.176_384.81_linux.run 添加可执行权限
./cuda_9.0.176_384.81_linux.run # 安装 cuda_9.0.176_384.81_linux.run
在安装过程中截取其中比较重要的几个选择:
Do you accept the previously read EULA?
accept/decline/quit: accept
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: n # 如果在这之前已经安装好更高版本的显卡驱动就不需要再重复安装,如果需要重复安装就选择 yes,此外还需要关闭图形界面。
Install the CUDA 9.0 Toolkit?
(y)es/(n)o/(q)uit: y
Enter Toolkit Location
[ default is /usr/local/cuda-9.0 ]: ~/cuda-9.0 # 一般选择安装在自己的家目录,因为你不是sudo没有其他位置的权限
~/cuda-9.0 is not writable.
Do you wish to run the installation with 'sudo'?
(y)es/(n)o: y
Please enter your password:
Do you want to install a symbolic link at /usr/local/cuda? # 是否将安装目录通过软连接的方式 link 到 /usr/local/cuda,取决于你是否使用 /usr/local/cuda 为默认的 cuda 目录。
(y)es/(n)o/(q)uit: n
Install the CUDA 9.0 Samples?
(y)es/(n)o/(q)uit: n #这仅仅是一个例子,不用装
#除了问你是否要安装Toolkit之外的都可以不安装
前面选择的一些汇总:
Driver: Not Selected
Toolkit: Installed in ~/cuda-9.0
Samples: Not Selected
Please make sure that
- PATH includes ~/cuda-9.0/bin
- LD_LIBRARY_PATH includes ~/cuda-9.0/lib64, or, add ~/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root
To uninstall the CUDA Toolkit, run the uninstall script in ~/cuda-9.0/lib64/bin
Please see CUDA_Installation_Guide_Linux.pdf in ~/cuda-9.0/lib64/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 384.00 is required for CUDA 9.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
安装完成后可以在 自己家 目录下看到:
cuda-9.0 # 刚刚安装的cuda-9.0
此时你已经有了一个cuda9.0,并且它的安装路径为~/cuda-9.0
3.安装cudnn
cudnn专门为深度学习计算设计的软件库,里面提供了很多专门的计算函数,如卷积等,如果你要训练神经网络,那么cudnn的安装时必不可少的。
cudnn的安装特别简单,下载对应cuda版本的cudnn(需要注册账号才能下载,一般一个cuda对应三个版本的cudnn,可以随意选择)压缩包,然后将解压后的内容复制到我们刚刚安装的cuda的文件对应路径当中去。
#解压
tar -xzvf cudnn-9.0-linux-x64-v7.1.tgz
#复制相关文件到cuda特定目录下
cp cuda/include/cudnn.h ~/cuda-9.0/include
cp cuda/lib64/libcudnn* ~/cuda-9.0/lib64
#修改文件权限
chmod a+r /usr/local/cuda-9.0/include/cudnn.h /usr/local/cuda-9.0/lib64/libcudnn*
这样cudnn就安装好了,是不是特别简单
4.多个版本的cuda切换
现在假定我们系统上有两个版本的cuda,第一个是刚刚我们自己安装的cuda-9.0,第二个是管理员为所有用户安装的cuda-11.1
如果你要切换对应版本的cuda,只需要在自己的~/.bashrc文件写入下面三句,并修改对应的路径即可
vim ~/.bashrc
#插入
export LD_LIBRARY_PATH=~/cuda-9.0/lib64:$LD_LIBRARY_PATH
export PATH=~/cuda-9.0/bin:$PATH
export CUDA_HOME=~/cuda-9.0:$CUDA_HOME
#CUDA_HOME是torch用来寻找可用cuda时的变量,如果不设置会先去系统里寻找
#退出
:wq!
更新
source ~/.bashrc
好,现在我们已经安装了cuda toolkit,并设置了环境变量,这样我们可以通过nvcc -V来查看当前正在使用的cuda版本
5.cuda toolkit中的显卡驱动
在刚刚安装cuda toolkit的过程中我们可以有一句是:
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
这是在问你是不是要安装显卡驱动,所以说显卡驱动可以单独在英伟达官网下载安装,也可以在安装cuda toolkit时配套安装,但往往我们更推荐前者,先在官网安装驱动,再安装cuda toolkit
CUDA Toolkit 版本中打包的开发 NVIDIA GPU 驱动程序的版本如下所示
也就说cuda toolkit中自带了显卡驱动,但我们就是不用,哎就是玩。
那么什么时候是cuda runtime API 什么时候是cuda driver API呢?
在装显卡驱动后,驱动自带就是cuda driver API,使用nvidia-smi 命令查看
在装cudatoolkit后,cudatoolkit对应路径下的就是cuda runtime API 使用 nvcc -V 查看
有了这样的概念后,当我们看到 nvcc -V 和 nvidia-smi 显示的 cuda 版本不一致是正常的,我们只用知道 nvcc -V 看到的是我们程序要用的就行了
安装pytorch
安装好了cuda也就是cuda toolkit后,我们就能安装pytorch了。
假定我们现在安装的cuda版本为11.1,也就是用nvcc -V 查看到的版本为11.1
1.虚拟环境
首先,使用conda创建一个虚拟环境
conda create -n my_env python=3.7
conda activate my_env
2.安装
可以看到官网有两种安装pytorch的方法:
第一种pip安装
# CUDA 11.1
pip install torch==1.8.0+cu111 torchvision==0.9.0+cu111 torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html
# CUDA 10.2
pip install torch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0
# CPU only
pip install torch==1.8.0+cpu torchvision==0.9.0+cpu torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html
可以看到如果你直接指定torch的版本,它安装的是对应cuda10.2版本的,而你系统使用的cuda版本为11.1,故而不配套,到时候用起来要出问题。所以我们应该选择第一条命令,和本地安装的cuda对应
第二种conda安装
# CUDA 10.2
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=10.2 -c pytorch
# CUDA 11.1
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge
# CPU Only
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cpuonly -c pytorch
可以看到用conda命令安装时包的名字叫pytorch,并且并且还有一个一起安装的包叫cudatoolkit(重点)
这时候有同学已经发现了,我们之前在系统上安装cuda时就是安装cudatoolkit,怎么这里还有一个cudatoolkit。这里不得不说conda的强大之处就在这里,conda是一个包管理工具,不仅仅可以用来安装和python程序有关的包,还能安装一些系统的包,比如gcc、cudatoolkit。所以在这里我们在安装pytorch的同时又额外安装了一个cudatoolkit,这里的cudatoolkit可以代替系统安装的cudatoolkit完成深度学习任务。
3.小结
- 使用pip和conda安装torch的区别
- 使用pip安装torch时,torch版本的选择要和我们系统安装的cuda toolkit的版本对应,也就是nvcc -V显示的版本 比如torch==1.8.0+cu111,这样的好处是速度快,依赖少
- 使用conda安装torch时,可以同时选择安装cudatoolkit,这样即使我们系统中没有安装这个版本的cudatoolkit,我们也能使用conda安装的cudatoolkit进行深度学习
- 当你系统中没有你想要版本的cudatoolkit时,比如用nvcc -V查看到的cuda版本为11.1,而你想安装对应10.2版本的torch时,你就可以使用 conda命令安装,并且同时指定conda安装时的cudatoolkit版本为10.2
- 如果你在安装tensorflow等对系统环境有要求的包时,你可以用conda单独安装cudatookit cudnn gcc等你需要的系统工具,只要设置对应的环境变量就可以独立于环境之外运行,这就是conda真正强大的地方
后记
既然一台机器上可以并存多种cuda,那么什么时候在用哪个呢?
conda安装的cudatoolkit, cudnn与在主机上安装的cuda, cudnn有何关系?
linux上的,多种安装方式产生的,多个cuda版本,以及执行顺序问题
conda安装的cudatoolkit与Nvidia官方提供的cudatoolkit的区别
调用哪个 cuda 库要看生成 tensorflow / pytorch 库的时候,设置的链接库寻找目录,以 pytorch 为例,项目根目录下的 setup.py 中指定链接库的搜索目录,其中 cuda 的根目录 CUDA_HOME在 tool.setup_helpers.cuda 中有获取逻辑,大概过程是:
- 先取默认 cuda 安装目录 /usr/local/cuda
- 如默认目录不存在(例如安装原生 cuda 到其他自定义位置),那么搜索 nvcc 所在的目录
- 如果 nvcc 不存在,那么直接寻找 cudart 库文件目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的),库文件目录的上级目录就作为 CUDA_HOME。
- 如果最终未能得到 CUDA_HOME,那么生成的 pytorch 将不使用 CUDA。
(以上过程的 pytorch 源码版本 ‘1.3.0’)
然后,通过 conda 安装 cudatoolkit 包含的库文件均在 miniconda3/lib 中可以找到(或者直接在 miniconda3 / pkgs / cudatoolkit-10.x.xxx /lib 中查看)
ls -al libcu*
ls -al libnpp*
ls -al libnv*
anaconda 的 cudatoolkit 不包含完整安装cuda的全部文件,只是包含了用于 tensorflow,pytorch,xgboost 和 Cupy 等所需要的共享库文件
验证一下上面的想法:
import torch
import torch.utils.cpp_extension
#torch安装时的编译版本
print(torch.version.cuda)
#torch使用时搜索CDUA_HOME变量的路径
print(torch.utils.cpp_extension.CUDA_HOME)
从上面看来,不管是用系统的cuda toolkit还是conda安装的cuda toolkit在调用时都是在搜寻CUDA_HOME路径,当CUDA_HOME路径未设置时会去 /usr/local/cuda 下找系统的cuda,这样一来使用conda中cuda toolkit安装的pytorch岂不是会没法正常用?
但事实好像并非这样,如果使用 conda 安装 pytorch 并且同时安装 cuda toolkit 是不管你是否安装了系统级的cuda toolkit都可以正常使用的,因为他使用时只需要去加载动态链接库,而使用conda安装的cuda toolkit动态链接库是存放在当前环境的lib目录下的,具有较高优先级,可以正常使用。
综上:可以将conda安装的cuda toolkit路径加入LD_LIBRARY_PATH,从而达到在环境外使用当前环境中的cuda toolkit