安装cuda
(1)介绍
CUDA(Compute Unified Device Architecture)
-
是 NVIDIA 推出的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA GPU(图形处理器)的强大计算能力进行通用计算,而不仅仅局限于图形渲染。eg:大量的矩阵运算等计算密集型任务
-
CUDA 提供了一套完整的开发工具,包括编译器、调试器等,使程序员能够编写在 GPU 上运行的代码。这些代码可以用 C/C++ 等编程语言编写,并通过 CUDA 的特定扩展语法来调用 GPU 的功能。例如,通过 CUDA 可以将数据从 CPU 内存传输到 GPU 内存,然后在 GPU 上启动大量的线程来并行处理数据
cuDNN(CUDA Deep Neural Network library)
-
cuDNN 是 NVIDIA 专门为深度学习任务设计的库,它构建在 CUDA 之上
-
它提供了高度优化的深度学习原语,如卷积、池化、归一化等操作的实现。以卷积神经网络(CNN)为例,卷积操作是其核心操作之一,cuDNN 对卷积操作进行了专门的优化,能够极大地提高卷积计算的速度。
-
例如,它可以根据 GPU 的架构特点(如不同的流处理器数量、内存带宽等)来调整计算策略,以达到最佳性能
- CUDA 提供了通用的 GPU 计算功能,是一个比较基础的平台。而 cuDNN 是在 CUDA 的基础上,针对深度学习领域进行了更高层次的抽象和优化。
(2)一些疑问
问1:cuDNN是python库吗?
答1:cuDNN不是Python库。cuDNN 本质上是一个用 C/C++ 编写的库。
-
虽然 cuDNN 本身不是 Python 库,但是在 Python 的深度学习框架(如 TensorFlow、PyTorch 等)中提供了 Python 接口来调用 cuDNN
-
例如,当安装了支持 cuDNN 的 PyTorch 版本并且系统正确安装了 cuDNN 和 CUDA 后,PyTorch 会在底层自动利用 cuDNN 来加速深度学习操作。具体来说,在执行卷积神经网络的训练或推理过程中,像卷积层的前向传播和反向传播等操作会调用 cuDNN 中经过优化的卷积函数来提高计算速度。
问2:安装 CUDA 时会自带安装 cuDNN 吗?
答2:安装 CUDA 时并不会自带安装 cuDNN,二者需要分别进行安装
-
只有在系统中先安装好 CUDA 后,才能安装和使用 cuDNN
-
下载时需要根据已安装的 CUDA 版本选择对应的 cuDNN 版本,然后将下载的文件解压并复制到 CUDA 的安装目录下相应的文件夹中,还需要进行一些环境变量的配置等操作才能使用
(3)在ubuntu上安装cuda/cuDNN
如图所示,本机已经有cuda11.5和cuda12.4两个版本。
现在由于实验环境需要,要下载 cuda11.8 版本以及其配套的 cuDNN
1.查看本机的一些信息
查看系统架构:uname -m
命令或arch
命令
系统架构是指一个系统的基本结构和组织方式,它描述了系统的各个组成部分以及这些部分之间如何相互关联和交互。
- 硬件架构
- x86架构:
- 这是一种常见的计算机微处理器架构,由英特尔(Intel)开发。x86架构有32位(如i686)和64位(如x86_64)版本。它广泛应用于个人计算机、服务器等。其特点是具有强大的计算能力和丰富的软件生态系统。
- ARM架构:
- ARM架构最初由ARM公司设计,常用于移动设备(如智能手机、平板电脑)和嵌入式系统。ARM架构有多种变体,如arm64 - sbsa(基于服务器的标准引导架构)和aarch64 - jetson(NVIDIA Jetson系列开发板使用的架构)。ARM架构的优点是功耗低,适合电池供电设备。
- x86架构:
- 软件架构
- 包括操作系统架构(如Linux内核架构、Windows NT架构)和应用程序架构(如三层架构、微服务架构)。
- 例如,Linux内核采用了模块化的架构,它由进程管理、内存管理、文件系统、设备驱动等模块组成,各个模块之间通过系统调用等机制相互通信和协作。
- 包括操作系统架构(如Linux内核架构、Windows NT架构)和应用程序架构(如三层架构、微服务架构)。
系统架构的设计需要考虑性能、可靠性、可扩展性、安全性等多个因素,不同的架构适用于不同的应用场景。例如,对于高性能计算场景,可能会选择x86架构的服务器;而对于物联网设备,通常会选择低功耗的ARM架构。
2.下载cuda安装包并安装
根据官网给出的命令下载cuda11.8安装包:
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
wget 命令在尝试下载 CUDA 安装包时遇到了“Permission denied”(权限被拒绝)的错误。
可以在 wget 命令前加上 sudo,这样你就可以以超级用户权限下载文件:
sudo wget https://developer.download.nvidia.cn/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
安装包下载成功后,开始安装:
sudo sh cuda_11.8.0_520.61.05_linux.run
之后,又遇到提示“A symlink already exists at /usr/local/cuda. Update to this installation?”
因为在 /usr/local 目录下已经存在一个指向 CUDA 安装目录的符号链接(symlink)。这个符号链接通常指向你之前安装的 CUDA 版本,选择yes会将现有的符号链接更新为指向新安装的 CUDA 版本。
安装好后,检查确认环境变量配置确实连接到了cuda11.8版本:使用命令nvcc --version
查看cuda版本是否是11.8版本
3.下载安装对应版本的cuDNN
cuDNN安装方式
-
官网下载
- 优势:官网提供的cuDNN版本齐全,且能够确保下载到的是正版、未经篡改的软件,与NVIDIA的CUDA等相关技术具有最佳的兼容性,适合追求稳定性和兼容性的用户.
- 劣势:下载速度可能较慢,且注册和问卷调查等流程相对繁琐.
-
pip工具下载
- 命令示例:在Windows系统中,要安装对应CUDA 12的cuDNN,可以在命令行中输入
py -m pip install nvidia-cudnn-cu12
;如果要安装对应CUDA 11的cuDNN,则输入py -m pip install nvidia-cudnn-cu11
。若要安装指定版本的cuDNN,如cuDNN 9.x.y.z for CUDA 12,则运行py -m pip install nvidia-cudnn-cu12==9.x.y.z
;安装cuDNN 9.x.y.z for CUDA 11,则运行py -m pip install nvidia-cudnn-cu11==9.x.y.z
. - 优势:使用pip下载cuDNN较为便捷,无需手动查找和下载对应的安装包,再进行复杂的配置和安装,能够自动处理依赖关系,简化了安装过程,适合希望快速安装和使用cuDNN的用户.
- 劣势:可选择的cuDNN版本相对有限,且可能存在与系统中已安装的其他软件或库的版本冲突问题,需要用户自行解决。
- 命令示例:在Windows系统中,要安装对应CUDA 12的cuDNN,可以在命令行中输入
cuDNN安装路径:
-
官网下载:安装有默认的目录,但是也可以自定义安装目录,只要配置好对应的系统变量即可正确调用。
-
pip工具下载:在 Linux 系统中,如果是在虚拟环境下使用 pip 安装 cuDNN,文件通常会被安装到虚拟环境中的lib/python[版本号]/site-packages目录。对于配置问题有以下两种情况:
- Python深度学习框架场景下:
- 在很多情况下,如果仅在Python虚拟环境中使用cuDNN,并且是结合如TensorFlow、PyTorch等深度学习框架使用,这些框架在设计上通常会自动检测虚拟环境中cuDNN的安装路径。
- 例如,当在虚拟环境中正确安装了TensorFlow - GPU版本(其依赖cuDNN),在导入TensorFlow库时,它会尝试在虚拟环境下查找cuDNN相关的库文件和头文件路径。如果安装过程没有出现异常,且遵循了正常的pip安装流程,框架自身可以处理好路径查找的问题,此时可能不需要手动配置环境变量。
- 非深度学习框架相关的C/C++等语言场景下:
- 即使是在虚拟环境中,如果要在C/C++程序中使用cuDNN,还是可能需要配置环境变量。
- 因为在编译C/C++程序时,编译器需要知道cuDNN头文件的位置,通过
-I
(指定头文件路径)和-L
(指定库文件路径)选项来编译。例如,在Linux系统下,虚拟环境中安装的cuDNN头文件可能在/home/user/venv/lib/python[版本号]/site-packages/cudnn/include
,库文件可能在/home/user/venv/lib/python[版本号]/site-packages/cudnn/lib
,在编译程序时需要将这些路径通过-I
和-L
选项告知编译器,这类似于手动配置了一种临时的“编译环境变量”。 - 在运行C/C++程序时,在Linux系统下还需要确保
LD_LIBRARY_PATH
环境变量包含了库文件所在目录,否则程序可能无法找到库文件而导致运行错误。在Windows系统下,需要确保PATH
环境变量包含库文件所在目录,以便正确加载动态链接库。
- Python深度学习框架场景下:
使用pip工具下载cuDNN
CUDA 11.8 兼容的 cuDNN 版本主要有 cuDNN 8.x 系列,eg:cuDNN 8.9 cuDNN 8.8,由于实验的需要,这里使用8.7版本
先激活虚拟环境,再使用pip工具下载对应的包即可nvidia-cudnn-cu11==8.7.0.84
具体版本根据实验和本机的cuda版本来确定
(具体安装特定版本遇到的问题可参考:https://www.cnblogs.com/kakafa/p/18576875 里的内容)
另外,还可以用一种更简便的方法,如果硬件环境操作系统等都一致,可以直接用conda虚拟环境打包的功能,把整个环境复制到另一台机子上。具体操作课查询chatgpt
(4)测试
在配好所有环境后,运行实验代码测试是否可行,发现报错如下:
File "/home/ubuntu/anaconda3/envs/unc_env/lib/python3.9/site-packages/torch/backends/cudnn/__init__.py", line 58, in _init
raise RuntimeError(
RuntimeError: cuDNN version incompatibility: PyTorch was compiled against (8, 7, 0) but found runtime version (8, 3, 0). PyTorch already comes bundled with cuDNN. One option to resolving this error is to ensure PyTorch can find the bundled cuDNN. Looks like your LD_LIBRARY_PATH contains incompatible version of cudnn. Please either remove it from the path or install cudnn (8, 7, 0)
-
即运行时找不到对应的cuDNN8.7.0版本,只能找到8.3.0版本(本机不限于当前的虚拟环境有多个版本的cudnn)。
-
在检查了环境变量的配置没问题后,查找对应的文件是否存在。(应该来说,pytorch是不需要配置环境变量,也能自己查找到cuDNN的对应目录的,做这一步只是为了排除这种可能性)
-
pytorch应该是会自动查找cudnn的头文件和库,但是通过find命令查找后,发现本机只有8.3.0的对应文件而没有8.7.0的对应文件。
当然文件名也可能是libcudnn.so.8 但是任仍然没有看到本虚拟环境unc_env目录下的libcudnn.so.8文件
- 接着查看头文件,发现依旧没有unc_env目录下的cudnn.h文件,但是发现了其他虚拟环境中有这个文件,并且他们的cudnn版本也是8.7.0 因此可以得出问题出在了cudnn的安装上
- 原因:应该是pip指定的某个源下载的nvidia-cudnn-cu11==8.7.0.84版本有问题,因此换了一个pip镜像源下载,就下载正常了,实验也可以正常运行了。
参考链接:https://blog.csdn.net/weixin_44573410/article/details/119735565