Intorduction:
跑深度学习需要用到GPU,而CUDA就是GPU和程序(如python)之间的桥梁。CUDA的环境依赖错综复杂,环境配置成为深度学习初学者的拦路虎。
同时网上教程大多为解决某个具体环境配置报错,或者分别讲解CUDA、CUDA toolkit(CUDA工具包)、CUDNN、NVCC等概念,并没有从计算机体系结构的角度将其层次化。故做此文,旨在帮助深度学习入门者从宏观上建立一个CUDA体系,而不是仅仅停留在报错才去了解的摸黑阶段。
本文尽可能采用自顶向下的金字塔式讲解,使得文章抓住主干,逻辑层次清晰。
先介绍CUDA是什么:
官方定义:CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。 开发人员可以使用C语言来为CUDA™架构编写程序,所编写出的程序可以在支持CUDA™的处理器上以超高性能运行。
https://baike.baidu.com/item/CUDA/1186262?fr=aladdin
通俗解释:CUDA就是让python等程序语言可以同时在CPU和GPU上跑的一个平台。
首先通过图来感受CUDA在体系结构中所在的层次。
图一
https://github.com/NVIDIA/nvidia-container-toolkit
我们可以清晰看到,绿色部分的CUDA,就是起了承上启下的作用。CUDA就是由CUDA驱动和CUDA工具包组成。
CUDA Toolkit在容器内部,而CUDA Driver在操作系统层。
CUDA Toolkit (nvidia): CUDA完整的工具安装包,其中提供了 Nvidia 驱动程序、开发 CUDA 程序相关的开发工具包等可供安装的选项。包括 CUDA 程序的编译器、IDE、调试器等,CUDA 程序所对应的各式库文件以及它们的头文件。
CUDA Driver: 运行CUDA应用程序需要系统至少有一个具有CUDA功能的GPU和与CUDA工具包兼容的驱动程序。每个版本的CUDA工具包都对应一个最低版本的CUDA Driver,也就是说如果你安装的CUDA Driver版本比官方推荐的还低,那么很可能会无法正常运行。CUDA Driver是向后兼容的,这意味着根据CUDA的特定版本编译的应用程序将继续在后续发布的Driver上也能继续工作。通常为了方便,在安装CUDA Toolkit的时候会默认安装CUDA Driver。在开发阶段可以选择默认安装Driver,但是对于像Tesla GPU这样的商用情况时,建议在官方安装最新版本的Driver。
原文链接:https://blog.csdn.net/zjy1175044232/article/details/120887377
我们单独拿出CUDA的结构:
图二
图三
图二图三将CUDA划分成三部分结构,最底层依然是CUDA Driver,而驱动之上的是CUDA Runtime和CUDA Libraries,则我们结合图一可以推断出,CUDA toolkit由CUDA Runtime和CUDA Libraries组成。
图二和图三还说明程序可以直接调用CUDA开发库、CUDA runtime ,CUDA驱动三部分。图四就是表达应用程序通过调用API来进行GPU上的计算。
https://cloud.tencent.com/developer/article/1496697
https://www.cnblogs.com/marsggbo/p/11838823.html
NVCC:NVCC是CUDA的编译器,属于runtime层,当然也属于CUDA toolkit。
cuDNN:cuDNN的全称为NVIDIA CUDA® Deep Neural Network library,是NVIDIA专门针对深度神经网络中的基础操作而设计基于GPU的加速库。cuDNN为深度神经网络中的标准流程提供了高度优化的实现方式,例如convolution、pooling、normalization以及activation layers的前向以及后向过程。
CUDA这个平台一开始并没有安装cuDNN库,当开发者们需要用到深度学习GPU加速时才安装cuDNN库,工作速度相较CPU快很多。
安装pytorch时会选择Compute platfrom,这里的如果选择CUDA系列,会安装cuDNN和不完整的CUDA Toolkit。
CUDA Toolkit (nvidia): CUDA完整的工具安装包,其中提供了 Nvidia 驱动程序、开发 CUDA 程序相关的开发工具包等可供安装的选项。包括 CUDA 程序的编译器、IDE、调试器等,CUDA 程序所对应的各式库文件以及它们的头文件。
CUDA Toolkit (Pytorch): CUDA不完整的工具安装包,其主要包含在使用 CUDA 相关的功能时所依赖的动态链接库。不会安装驱动程序。
(NVCC 是CUDA的编译器,只是 CUDA Toolkit 中的一部分)
注:CUDA Toolkit 完整和不完整的区别:在安装了CUDA Toolkit (Pytorch)后,只要系统上存在与当前的 cudatoolkit 所兼容的 Nvidia 驱动,则已经编译好的 CUDA 相关的程序就可以直接运行,不需要重新进行编译过程。如需要为 Pytorch 框架添加 CUDA 相关的拓展时(Custom C++ and CUDA Extensions),需要对编写的 CUDA 相关的程序进行编译等操作,则需安装完整的 Nvidia 官方提供的 CUDA Toolkit。
https://zhuanlan.zhihu.com/p/542319274
也就是说,pytorch带的CUDA不会安装runtime层和以下的层,包括nvcc和CUDA driver。
https://developer.nvidia.com/zh-cn/blog/gpu-containers-runtime/
这个图是在容器内部搭建操作系统,创造一个从CUDA Driver到应用程序都完全独立的容器。说明我们可以唉不同的层次进行容器的封装,可以从runtime以上封装容器(通常虚拟环境是runtime以上的),也可以直接从操作系统开始封装。