一文弄懂GPU环境配置(Ubuntu系统)¶
最近被nvidia的显卡驱动和CUDA折磨了很久,往上教程大多不讲背后原理,有些指令无脑运行会导致版本不匹配的情况,以致于环境乱成一锅粥。以下文章会从头梳理一下显卡驱动、CUDA、cuDNN、cudatoolkit等之间的关系,并且讲解不同需求下如何配置cuda环境。
一. 显卡驱动、CUDA、cuDNN和CUDA Toolkit之间的关系¶
-
显卡驱动:首先设想你有一台电脑,有个GPU跟电脑连接,但是这个时候GPU没法直接用,需要显卡驱动才行。一般自己装系统是需要手动下再显卡驱动的,但是如果租云服务器显卡驱动肯定是已经下好的。判断自己电脑是否有显卡驱动的快捷方式:输入
nvidia-smi
,看看有没有正常输出即可。 -
CUDA:当你的显卡驱动装好之后,你就可以开始使用GPU了。但是呢,想用pytorch等python库来调用GPU,你还得需要一个运算平台,而CUDA就是这样的一个运算平台。而这个运算平台下有很多工具,所有工具都集成在CUDA Toolkit里。CUDA Toolkit集成了GPU加速库、调试和优化工具、C\C++编译器、运行时链接库等多种运算工具。因此CUDA Toolkit非常庞大,而cuDNN就是其中GPU加速库。
二. 安装显卡驱动¶
先简单介绍一下安装显卡驱动,云服务器玩家可以跳过。ubuntu安装显卡驱动十分方便,但是要注意建议首先uname -r
可以查看linux内核版本,然后ubuntu-drivers devices
可以查看推荐安装的nvidia驱动版本,之后sudo apt install nvidia-driver-xxx
安装驱动,这里的xxx就是之前推荐安装的版本,比如我电脑是sudo apt install nvidia-driver-575
。运行完之后重启电脑nvidia-smi
检查是否安装成功。
三. 是否需要安装CUDA Toolkit?¶
正如前面所说,CUDA Toolkit非常庞大,如果正在使用conda环境,而每个环境都安装一个CUDA Toolkit,那这个存储开销就太大了,因此,当不需要编译.cu文件的时候,通常不需要安装完整的CUDA Toolkit。
举个例子,当我们再复现某些AI模型的时候,首先会conda创建虚拟环境,然后一通pip install,再pip list
之后,会发现咱们的虚拟环境中多了这么一些库(因为一般下载gpu版本的torch时,会自带下载这些库)。这些实际上就是cuda toolkit的子集,他其中就包含了cuDNN,有了这个cuDNN,我们就可以加速许多算子,比如matmul, attention, convolution
等等。有了cuDNN这个加速库之后,实际上就可以满足许多常用的GPU推理和训练了,因此没有必要下载完整的CUDA Toolkit
但是,有些开源代码他手写了cuda算子(比如一些三维推理加速的项目),或者我们自己想手写cuda算子,这个时候就需要编译这个cu文件,那么以上安装的这些库就不太够了,这时就建议安装一个完整的cuda toolkit。比如我写了一个gelu.cu
的算子文件,然后想加载并编译他(如下图),这个时候就需要cuda的编译和优化相关工具。
cuda_gelu_src = open("gelu.cu").read()
# C++ code: defines the gelu function
cpp_gelu_src = "torch::Tensor gelu(torch::Tensor x);"
module = load_inline(
cuda_sources=[cuda_gelu_src],
cpp_sources=[cpp_gelu_src],
functions=["gelu"],
extra_cflags=["-O2"],
verbose=True,
name="inline_gelu",
build_directory="var/cuda_gelu",
)
cuda_gelu = getattr(module, "gelu")
四. 安装CUDA Toolkit(全局环境安装)¶
这个安装CUDA Toolkit也是无比的阴间,这里是英伟达cuda toolkit的官网。首先要确定需要安装的版本,一般选择比自己显卡驱动对应的CUDA Version低一些就可以,但是如果驱动是12.x,不建议安装11.x的toolkit。
确定好版本之后,按照自己电脑实际情况进行选择,Installer type这里,我强烈建议选择runfile(local),因为这个deb (local)十分的阴间,他的sudo apt install cuda
命令,会导致自己显卡驱动本身安装的一些库被删掉,然后这个驱动就用不了了,所以别用他。
选择runfile (local)后,先按他说的wget下载.run文件,这里建议代理加速(export http_proxy=xx
,不懂的其他地方搜)。然后下一步很关键,不能直接sudo sh xx.run
,因为这样子sh之后,他会检测显卡驱动的版本,只要有一点点不匹配就会出现一些小问题(貌似是因为这个.run文件也会安装对应版本的显卡驱动)。所以我们在这个命令后面加一些参数,变成这样的形式:sudo sh cuda_12.9.0_575.51.03_linux.run --toolkit --silent --override
。加上这些参数,本质上就是让他只安装toolkit,别安装驱动也别鸟驱动。运行完之后toolkit就安装好了。
对于ubuntu系统,安装好之后cd /usr/local
,可以看到这个目录下面有cuda文件夹,这个文件夹里面就包含了所有工具。只要有cuda这个文件夹,百分之九十九是装好了,即使输入什么nvcc --version
显示nvcc没有,也不算因为cuda没装,而是没有设置环境变量的问题。因为打开cuda的bin文件夹,是可以看到nvcc这个文件的。后面运行代码凡是涉及到nvcc not found的问题,一律从环境变量来入手解决。
五. 能不能在conda虚拟环境中安装toolkit?¶
conda可以安装老版本的toolkit,比如使用命令conda install cuda-toolkit-dev
,但是通常有版本不匹配的问题,所以不建议这么做。
六. 后话¶
一般来说,linux内核--显卡驱动--cuda toolkit--pytorch都有相对的版本匹配关系,但是这个版本要求没那么严格,网上经常动不动遇到问题就说版本不匹配重装,大可不必,有的时候可能在代码里删去某些无用的import或者export一些链接库( export LD_LIBRARY_PATH=/home/fly/miniconda3/envs/env_name/...../lib:$LD_LIBRARY_PATH
)就可以解决了。除非这版本相差太大(比如一个12.x,一个11.x),不然很多时候没有重装的必要。torch和cuda toolkit都是大体量的库,所以安装需谨慎啊。