上周在一台服务器上配环境配了两天才配好,踩坑同时也发现自己对于GPU与并行计算的基础知识所知甚少,因此学习总结一下。
这篇文章写的非常详细,值得仔细阅读,显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn区别?,下面结合自己的理解总结一下。
官方定义:CUDA是NVIDIA创建的一个并行计算平台和编程模型,它不是编程语言,也不是一种API。
CUDA is a parallel computing platform and programming model created by NVIDIA.
Some people confuse CUDA, launched in 2006, for a programming language — or maybe an API.
官方定义: NVIDIA CUDA®深度神经网络库(cuDNN)是一个用于深度神经网络的GPU加速库。cuDNN为标准例程(如前向和后向卷积、池化、归一化和激活层)提供了高度优化的实现。
The NVIDIA CUDA® Deep Neural Network library (cuDNN) is a GPU-accelerated library of primitives for deep neural networks. cuDNN provides highly tuned implementations for standard routines such as forward and backward convolution, pooling, normalization, and activation layers.
但深度学习训练的时候不装CUDNN也能训练(此处存疑,我没有装但是还可以正常训练,也可能是系统原本装好了)。
NVCC就是cuda编译器,类似于gcc是C++的编译器一样。
nvidia-smi -L
**CUDA Toolkit可以认为是一个软件安装包,**它可以安装cuda driver,nvcc(编译器),libraries, CUDA Samples。
传统上,安装 NVIDIA Driver 和 CUDA Toolkit 的步骤是分开的,但实际上我们可以直接安装 CUDA Toolkit,系统将自动安装与其版本匹配的 NVIDIA Driver。下面我们讲述安装 CUDA Toolkit 的方法。
安装方式:下载CUDA Toolkit 安装CUDA和cuDNN到指定目录
sh cuda_11.1.1_455.32.00_linux.run --silent --toolkit --toolkitpath=path_to_install
export PATH="~/cuda-11.1/bin:$PATH"
export LD_LIBRARY_PATH="~/cuda-11.1/lib64:$LD_LIBRARY_PATH"
nvcc
和nvidia-smi
显示的CUDA版本不同 (参看stackoverflow,很清晰)CUDA有两个主要的API:runtime(运行时) API和driver API,这两个API都有对应的CUDA版本。
driver API是通过GPU driver installer安装的,可理解为系统出场安装的默认驱动,nvidia-sim显示的是 driver API。
runtime API是通过CUDA toolkit安装的,可理解为用户自己安装的驱动,nvcc显示的是runtime API。
因此,在设计层面这两个数字就不一定匹配,因为它们反映了两种不同的事物。
Therefore, by design, these two numbers don’t necessarily match, as they are reflective of two different things.
The version reported by
nvcc
andnvidia-smi
may not match, and that is expected behavior and in most cases quite normal.
通常情况下,这两个显示都是不一样的,不过不用担心,只要driver API比runtime API高,一般都没问题。但是我自己的例子却证明了版本差太多是有问题的,我遇到的问题见下面问题7。
driver API 和runtime API关系如下图:
经过上面的基础知识学习,安装过程中的遇到的种种问题就解释通了。
这里的cuda11.4 driver就是系统默认的drvier API,但是位置不在/usr/local下。
用CUDA toolkit这个安装包去安装 CUDA runtime driver,cuDNN我没有装,但是还能正常跑起来。
如conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=11.1 -c pytorch -c conda-forge
,不会安装NVCC编译器,只会安装一些运行时的库,完整版的驱动还是需要通过下载CUDA toolkit安装包安装。
centerNet不需要ncvv来编译,而MMDetection3D是需要用NVCC编译。
/usr/local
,需自定义安装位置)安装CUDA和cuDNN到指定目录
别人装过了,生成了/tmp/cuda-installer.log,把这个文件删了就好了。参考链接
**原因:cuda runtime driver与driver API版本相差太大。**分析如下:
服务器是RTX 3090,nvidia smi显示有cuda driver驱动且版本是cuda11.4。
先是通过CUDA Toolkit安装cuda runtime driver 10.2,MMDetection3D可编译安装成功,但是训练PointPliiar会启动不起来。
然后通过CUDA Toolkit安装cuda driver 11.1后,就可以正常训练了。
由此可以说明两个driver应该不能差一个大版本。一个同事也跟我说RTX 3090不支持cuda10.2,这个不支持应该指的就是驱动不匹配。
共勉!