这里是目录
写作背景
在很久之前搭建pytorch环境中,看网上的教程都说需要先下载cuda才能让pytorch使用gpu加速,后来我自己在新机子上没有安装cuda,也能让pytorch使用gpu加速,这让我很困惑。并且,与cuda相关的名词有很多,比如cuda driver api,cuda runtime api,以及cudatoolkit,这些名词之间的关系和区别是什么也一直困扰着我。这次,就一次性搞清楚吧!!!
什么是CUDA
CUDA是由NVIDIA公司为GPU上的通用计算开发的并行计算平台和编程模型。有了CUDA,开发人员能像使用CPU一样,通过编程的方式充分利用GPU强大的并行计算能力,而不仅仅是用于图形渲染。它允许通过编写代码来使用GPU进行计算,从而显著加速某些计算密集型任务,如机器学习、图像处理和科学计算。CUDA不仅体现在软件层面,在硬件层面上也要符合cuda的标准,因此目前只有NVIDIA才有cuda:CUDA的底层实现是基于NVIDIA GPU的硬件架构的。其他公司的GPU虽然也支持GPGPU(general-purpose computing on GPUs)计算,但通常有自己的编程接口和生态系统。
CUDA只是一个概念上的模型,定义了如何在GPU上执行任务,而CUDA Toolkit是实现CUDA这一平台的工具集合,为C和C++的开发人员构建使用GPU的应用提供了全面的开发环境,包括了:
- nvcc:这是一个 CUDA 编译器,它可以将 CUDA C/C++ 源代码编译成可以在 NVIDIA GPU 上运行的二进制代码;
- 库函数:例如 cuBLAS、cuFFT、thrust 等,这些库提供了常用的数学运算、线性代数、傅立叶变换等功能;
- 开发工具:例如 Nsight Visual Studio Edition、Nsight Systems 等调试工具;
- API:用于管理内存、启动内核等操作的函数。
Runtime API & Driver API
CUDA有两种API,并且每一个都有其独有的版本,并不是说两个API的版本要是一样的:
- 一种是底层的API叫做CUDA driver API,提供了低级别的接口,使得开发者可以直接控制GPU资源,主要用于更细粒度的应用场景。
- 另一种是在高层的API叫作CUDA runtime API,是在CUDA driver API之上实现的更高级别的应用程序接口。提供了更高层次的抽象,简化了开发者的工作。
- CUDA driver API的必要支持由GPU driver安装,会在安装显卡的驱动程序(NVIDIA driver)时安装。
- 运行时(Runtime)指的是程序在执行过程中所需要的所有支持系统,或是程序正在被执行的那个时间段内的环境,包括内存管理、任务调度、输入输出等。运行时环境的作用是确保程序在运行时所需的资源和功能能够正常运作,提供给程序运行时所需要的环境。有时它会是一个程序(例如Python解释器),有时它会是一个虚拟机(例如JVM),运行时还可能包括操作系统内核、硬件驱动程序等。 运行时可以分为多个层次,例如,操作系统内核是最底层的运行时,而虚拟机则是在操作系统之上的一层运行时。它与编译期相对应,编译期是程序在实际运行之前将源代码转换为可执行代码的阶段。CUDA Runtime API是 专门为CUDA程序提供运行时支持的一组库函数。这些函数负责管理GPU资源、分配内存、调度内核等任务,从而为CUDA程序提供一个运行的环境。
- CUDA Runtime API的必要支持由CUDA toolkit安装,其可能还捆绑了GPU驱动程序安装,即安装Runtime API时有可能将nvidia driver和cuda driver一起安装上。
这些API相互排斥,应用程序应当使用其中一个。尽管 CUDA Runtime API 是基于 CUDA Driver API 构建的,但由于它们在初始化、资源管理和错误处理方面的不同约定,因此在同一个应用程序中使用它们可能会导致混乱。因此,建议在一个应用程序中只使用其中一个 API,以避免潜在的问题。
总的来说,Runtime API是对driver API的封装,并且不需要二者的版本是一样的。但是,二者的版本差异有可能产生问题。我们还是希望能够查看一下两个API的版本。
nvidia-smi
工具是由GPU driver安装程序安装的,通常只显示 GPU 驱动程序,而不会显示 CUDA 工具包安装程序所安装的任何内容,即只会提供driver API的版本。
nvcc
则是由CUDA toolkit安装的编译工具,始终报告其内置的可识别的CUDA Runtime API的版本,它也不知道GPU driver和CUDA driver的信息,甚至不知道是否安装了GPU驱动程序。因此,这两个东西的版本并不一定匹配,因为它们反映的是两件不同的事情。但CUDA driver是向后兼容的,即新的CUDA driver一般可以支持比较旧的CUDA runtime。这是因为 NVIDIA 的驱动设计考虑了这种兼容性,以便开发者不必频繁更新驱动即可运行新旧不同版本的 CUDA 程序。所以当CUDA runtime的版本比CUDA driver更高时可能会调用一些 driver 尚不支持的功能或优化。这种情况下,程序可能会出现错误或无法运行,因为 driver 不支持该 runtime 调用的某些新特性。因此,一般建议尽量保持CUDA driver API为最新版本*,这样可以兼容较旧的 CUDA runtime,也可以避免由于 driver 版本过低导致的错误。所以,最好安装最新的NVIDIA驱动,并选择一个不高于NVIDIA驱动所支持的CUDA版本的runtime版本。
接着我们讨论如何安装CUDA runtime和CUDA driver。对于CUDA driver来说,直接安装NVIDIA最新的驱动即可。而对于CUDA runtime来说,如果使用CUDA的目的是使用pytorch或tensorflow等框架进行深度学习的话,除了通过安装CUDA toolkit来获得cuda runtime之外,还可以通过conda来安装cuda runtime,或者使用pip。
# CUDA 10.2
conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=10.2 -c pytorch
# CUDA 11.3
conda install pytorch==1.9.0 torchvision==0.10.0 torchaudio==0.9.0 cudatoolkit=11.3 -c pytorch -c conda-forge
# CUDA 11.1
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
# CUDA 10.2
pip install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
如上所示,在安装pytorch时,如果使用conda的话,会显式地安装cudatoolkit
,这里的cudatoolkit
并不是我们说的CUDA Toolkit,而是CUDA Runtime。而使用pip的话,我们发现并没有显式地安装和cuda相关的东西,但是torch上体现了和cuda相关的东西,例如torch==1.9.0+cu102
会同时下载pytorch和版本为10.2的CUDA Runtime。通过conda或pip安装了包含CUDA Runtime的PyTorch等深度学习框架后,通常不需要再单独安装NVIDIA提供的完整的CUDA Toolkit。并且,pytorch自带cudnn,无需专门安装。因此,我们只需要安装最新的驱动,并通过conda或pip就可以配置好一个pytorch的深度学习环境了。
随后我们将安装不同的cuda runtime环境和不同的pytorch环境来验证这一点。
深度学习框架如何是使用CUDA的
在深度学习中,对于CUDA的调用通常是使用更高的封装实现的,如下图所示,开发者会利用例如Pytorch等框架直接编写代码,而Pytorch则会调用一些runtime API的封装库,例如libcublas.so,然后这些封装库会调用runtime API,开发者也可能直接调用driver API,但通常会是runtime API调用driver API实现与显卡的交互。
使用Conda管理不同的cuda版本和pytorch版本
接下来我们展示如何使用conda来同时创建多个含有不同cuda版本和pytorch版本的环境。通过下述实例展示了使用conda是可以管理多个不同cuda版本和pytorch的,但是pytorch和python之间的兼容性,以及显卡和cuda runtime的兼容性导致我们不能使用随意的python版本来安装pytorch,以及使用某个显卡需要安装最低版本的cuda runtime。
首先,查看我们当前的cuda driver版本,是12.4,根据上述的内容,我们可以安装版本12.4之下的cuda runtime,实际上截止到目前,pytorch还没有对应的超过12.4的cuda runtime版本。
(base) admin123@admin123-Super-Server:~$ nvidia-smi
Sat Oct 26 20:55:56 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.107.02 Driver Version: 550.107.02 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|==================