GPU、CUDA与深度学习环境配置
GPU、CUDA与深度学习环境配置

上周在一台服务器上配环境配了两天才配好,踩坑同时也发现自己对于GPU与并行计算的基础知识所知甚少,因此学习总结一下。
一、名词解释
这篇文章写的非常详细,值得仔细阅读,显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn区别?,下面结合自己的理解总结一下。
1 CUDA
官方定义: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.
2 CUDNN
官方定义: 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也能训练(此处存疑,我没有装但是还可以正常训练,也可能是系统原本装好了)。
3 NVCC
NVCC就是cuda编译器,类似于gcc是C++的编译器一样。
4 如何查看显卡版本
nvidia-smi -L
5 CUDA Toolkit和CUDA Driver的关系
**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"
6 为什么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
nvccandnvidia-smimay not match, and that is expected behavior and in most cases quite normal.
通常情况下,这两个显示都是不一样的,不过不用担心,只要driver API比runtime API高,一般都没问题。但是我自己的例子却证明了版本差太多是有问题的,我遇到的问题见下面问题7。
driver API 和runtime API关系如下图:

二、实践问题
经过上面的基础知识学习,安装过程中的遇到的种种问题就解释通了。
安装前问题
问题1 为什么nvidia smi显示有cuda驱动,而/usr/local下却没有cuda文件夹?
这里的cuda11.4 driver就是系统默认的drvier API,但是位置不在/usr/local下。
问题2 要装什么cuDNN、CUDA driver、CUDA toolkit这些都要装吗?
用CUDA toolkit这个安装包去安装 CUDA runtime driver,cuDNN我没有装,但是还能正常跑起来。
问题3 Conda安装的CUDA toolkit会装CUDA driver吗?
如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安装包安装。
问题4 为什么centerNet只通过conda安装了cuda toolkit就能正常训练?
centerNet不需要ncvv来编译,而MMDetection3D是需要用NVCC编译。
问题5 怎么安装到指定目录(由于没有服务器sudo权限,不能装到/usr/local,需自定义安装位置)
安装过程中问题
问题6 Log file not open. Segmentation fault (core dumped)
别人装过了,生成了/tmp/cuda-installer.log,把这个文件删了就好了。参考链接
问题7 驱动安装好了环境也配好了,训练不起来
**原因: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,这个不支持应该指的就是驱动不匹配。
共勉!
更多推荐



所有评论(0)