[转][基础]Deep Learning常用工具的相关概念

下列大部分内容转载自:

https://zhuanlan.zhihu.com/p/91334380

硬件设备及软件库概念

显卡(GPU),是可以执行并行运算的硬件设备

显卡驱动,通常指 NVIDIA driver,是软件驱动,封装对底层硬件设备的操作,向外提供上层运算API

  • GPU架构:Tesla、Fermi、Kepler、Maxwell、Pascal,指的是芯片
  • 芯片型号:GT200、GK210、GM104、GF104等
  • 显卡系列:GeForce、Quadro、Tesla
  • GeForce显卡型号:G/GS、GT、GTS、GTX

GPU架构指的是硬件的设计方式,例如流处理器簇中有多少个 core、是否有L1 or L2缓存、是否有双精度计算单元等等。每一代的架构是一种思想,如何去更好完成并行的思想

芯片就是对上述 GPU 架构思想的实现,例如芯片型号 GT200 中第二个字母代表是哪一代架构,有时会有100和200代的芯片,它们基本设计思路是跟这一代的架构一致,只是在细节上做了一些改变,例如GK210比GK110的寄存器就多一倍。有时候一张显卡里面可能有两张芯片,Tesla k80用了两块 GK210 芯片。这里第一代的 GPU 架构的命名也是 Tesla ,但现在基本已经没有这种设计的卡了,下文如果提到了会用 Tesla 架构和 Tesla 系列来进行区分。

而显卡系列在本质上并没有什么区别,只是 NVIDIA 希望区分成三种选择,GeFore 用于家庭娱乐,Quadro 用于工作站,Tesla 系列用于服务器。Tesla 的 k 型号卡为了高性能科学计算而设计,比较突出的优点是双精度浮点运算能力高并且支持 ECC 内存,但是双精度能力好在深度学习训练上并没有什么卵用,所以 Tesla 系列又推出了 M 型号来做专门的训练深度学习网络的显卡。需要注意的是 Tesla 系列没有显示输出接口,它专注于数据计算而不是图形显示。

最后一个 GeForce 的显卡型号是不同的硬件定制,越往后性能越好,时钟频率越高显存越大,即 G/GS < GT < GTS < GTX。


CUDA 英文全称是Compute Unified Device Architecture,是显卡厂商 NVIDIA 推出的运算平台。 CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。按照官方的说法是,CUDA是一个并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅

CUDA Toolkit由以下组件组成:

  • Compiler: CUDA-C 和 CUDA-C++ 编译器NVCC位于bin/目录中。它建立在NVVM优化器之上,而NVVM优化器本身构建在LLVM编译器基础结构之上。因此开发人员可以使用nvm/目录下的Compiler SDK来直接针对NVVM进行开发。

  • Tools: 提供一些像profiler,debuggers等工具,这些工具可以从bin/目录中获取

  • Libraries: 下面列出的部分科学库和实用程序库可以在lib/目录中使用(Windows上的DLL位于bin/中),它们的接口在include/目录中可获取。

    • cudart: CUDA Runtime

    • cudadevrt: CUDA device runtime

    • cupti: CUDA profiling tools interface

    • nvml: NVIDIA management library

    • nvrtc: CUDA runtime compilation

    • cublas: BLAS (Basic Linear Algebra Subprograms,基础线性代数程序集)

    • cublas_device: BLAS kernel interface

    • ...

  • CUDA Samples: 演示如何使用各种CUDA和library API的代码示例。可在Linux和Mac上的samples/目录中获得,Windows上的路径是C:\ProgramData\NVIDIA Corporation\CUDA Samples中。在Linux和Mac上,samples/目录是只读的,如果要对它们进行修改,则必须将这些示例复制到另一个位置。

  • CUDA Driver: 运行CUDA应用程序需要系统至少有一个具有CUDA功能的GPU与CUDA工具包兼容的驱动程序。每个版本的CUDA工具包都对应一个最低版本的CUDA Driver,也就是说如果你安装的CUDA Driver版本比官方推荐的还低,那么很可能会无法正常运行。CUDA Driver是向后兼容的,这意味着根据CUDA的特定版本编译的应用程序将继续在后续发布的Driver上也能继续工作。通常为了方便,在安装CUDA Toolkit的时候会默认安装CUDA Driver。在开发阶段可以选择默认安装Driver,但是对于像Tesla GPU这样的商用情况时,建议在官方安装最新版本的Driver。

conda 安装的 cudatoolkit V.S. 直接在NVIDIA官网安装的 cuda

原生安装的 cuda 是 conda-cudatoolkit 的超集,可以自己尝试这两种安装,然后肉眼比对,差别一目了然。再有不懂的,去 nvidia 官网看文档,慢慢的,就懂了。

调用哪个 cuda 库要看生成 tensorflow / pytorch 库的时候,设置的链接库寻找目录,以 pytorch 为例,项目根目录下的 setup.py 中指定链接库的搜索目录,其中 cuda 的根目录 CUDA_HOME在 tool.setup_helpers.cuda 中有获取逻辑,大概过程是:

  1. 先取默认 cuda 安装目录 /usr/local/cuda
  2. 如默认目录不存在(例如安装原生 cuda 到其他自定义位置),那么搜索 nvcc 所在的目录
  3. 如果 nvcc 不存在,那么直接寻找 cudart 库文件目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的),库文件目录的上级目录就作为 CUDA_HOME
  4. 如果最终未能得到 CUDA_HOME,那么生成的 pytorch 将不使用 CUDA。

(以上过程的 pytorch 源码版本 '1.3.0')

详细的可去看 pytorch 源码。tensorflow 源码我没看过,不过思路应该差不多。

然后,通过 conda 安装 cudatoolkit 包含的库文件均在 miniconda3/lib 中可以找到(或者直接在 miniconda3 / pkgs / cudatoolkit-10.x.xxx /lib 中查看),

ls -al libcu*
ls -al libnpp*
ls -al libnv*

参考:

https://zhuanlan.zhihu.com/p/91334380

https://leimao.github.io/blog/CUDA-Driver-VS-CUDA-Runtime/

https://www.zhihu.com/question/344950161

posted @ 2021-02-04 17:12  lunaY  阅读(156)  评论(0编辑  收藏  举报