一文讲清楚CUDA、CUDA toolkit、CUDNN、NVCC关系

主要参考

一、CUDA/cudnn/CUDA Toolkit/NVCC区别简介

参考 Pytorch 使用不同版本的 cuda

  • CUDA:为“GPU通用计算”构建的运算平台。
  • cudnn:为深度学习计算设计的软件库。
  • 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。

二、CUDA Toolkit具体组成

参考 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么
参考 一个文件夹内含有bin lib include 三个文件,该咋使用啊

在这里插入图片描述
一般的结构中,include 包含头文件,bin 包含可执行文件,lib 包含程序实现文件编译生成的library,src包含源代码,doc或help包含文档,samples包含例子。

  • Compiler:NVCC
  • Tools:分析器profiler、调试器debuggers等
  • Libraries:科学库和实用程序库
  • CUDA Samples:CUDA和library API的代码示例
  • CUDA Driver:驱动,需要与“有CUDA功能的GPU”和“CUDA”都兼容。CUDA工具包都对应一个最低版本的CUDA Driver,CUDA Driver向后兼容。

三、NVCC简介

参考 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么
参考 CUDA nvcc编译步骤简单讲解(转摘)

  • nvcc其实就是CUDA的编译器,cuda程序有两种代码, 在cpu上的host代码和在gpu上的device代码。
  • .cu后缀:cuda源文件,包括host和device代码
  • nvcc编译例子
nvcc –cuda x.cu –keep
# x.cudafe1.gpu
# x.cudafe2.gpu
# x.cudafe1.cpp

四、版本管理

参考 Pytorch 使用不同版本的 cuda
参考 conda安装的cudatoolkit, cudnn与在主机上安装的cuda, cudnn有何关系?
参考 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么

1、pytorch运行时的CUDA版本

(1)查看cuda 运行版本 和 编译时的版本

# Pytorch 实际使用的运行时的 cuda 目录
import torch.utils.cpp_extension
torch.utils.cpp_extension.CUDA_HOME
# 编译该 Pytorch release 版本时使用的 cuda 版本
import torch
torch.version.cuda 

(2)pytorch寻找可用CUDA的过程:

  • 查找可用的cuda路径
    1、环境变量CUDA_HOME 或 CUDA_PATH
    2、/usr/local/cuda
    3、which nvcc的上级上级目录
    (which nvcc 会在环境变量PATH中找)
    4、如果上述都不存在,则torch.utils.cpp_extension.CUDA_HOME为None,会使用conda安装的cudatoolkit,其路径为cudart 库文件目录的上级目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的)。
    测试过程(1):改掉默认可以的搜索路径
CUDA_HOME=''
cd /usr/local
sudo mv cuda cuda_old
which nvcc
# 此时which nvcc应无返回值

测试过程(2):测试torch.utils.cpp_extension.CUDA_HOME路径和torch.version.cuda 版本

conda list | grep cudatoolkit
# 记录下这个版本,可能和 /usr/local下的版本是不一致的,本文中/usr/local下为11.2,但conda安装pytorch1.3时,编译pytorch1.3的release版本为10.0,所以这里看到是10.0
python
import torch.utils.cpp_extension
torch.utils.cpp_extension.CUDA_HOME
# 为None
import torch
torch.version.cuda 
# 为conda list下的cudatoolkit版本10.0

测试过程(3):把上述修改的路径改回去

#改回去:
cd /usr/local
sudo mv  cuda_old cuda
  • 在确定好使用的 cuda 路径后,基于 cuda 的 Pytorch 拓展即会使用确定好的 cuda 目录中的可执行文件( /bin )、头文件( /include )和库文件( /lib64 )完成所需的编译过程。

2、conda下的cudatoolkit

通过 conda 安装 cudatoolkit 包含的库文件在 ~/miniconda3/lib 中,或者在miniconda3/pkgs/cudatoolkit-xxx/lib 中查看)

cd ~/miniconda3/lib
ls | grep -E 'libcu|libnpp|libnv'
cd ~/miniconda3/pkgs/cudatoolkit-xxx/lib
# xxx对应不同版本的文件夹的不同名字,自行查看
ls | grep -E 'libcu|libnpp|libnv'

conda 的 cudatoolkit只包含pytorch或其他框架( tensorflow、xgboost、Cupy)会使用到的so库文件。

3、nvidia-smi和nvcc显示的CUDA版本

nvidia-smi

在这里插入图片描述

nvcc -V

在这里插入图片描述

CUDA主要有两个API:runtime API、driver API

  • 用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。
  • 用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的。
    nvidia-smi属于driver API、nvcc属于runtime API。
    nvcc属于CUDA compiler-driver tool,只知道runtime API版本,甚至不知道是否安装了GPU driver。

4、使用环境变量查找CUDA

  • 一般的安装CUDA时,大家都会在~/.bashrc中添加如下内容
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
  • 上述这个代码存在一个BUG,即在LD_LIBRARY_PATH不存在时,LD_LIBRARY_PATH会被赋值为":/usr/local/cuda/lib64"而不是"/usr/local/cuda/lib64",有一个冒号的区别。这个BUG对于pytorch来说,是无所谓的,哪怕不加,pytorch也会通过/usr/local/cuda找到外部的CUDA。但对于一些兼容性没那么好的代码而言,环境变量是最重要的,在~/.bashrc中,应使用这段代码来添加环境变量
if [ $LD_LIBRARY_PATH ]; then
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
else
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64
fi

if [ $PATH ]; then
    export PATH=$PATH:/usr/local/cuda/bin
else
    export PATH=/usr/local/cuda/bin
fi

if [ $CUDA_HOME ]; then
    export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
else
    export CUDA_HOME=/usr/local/cuda
fi
  • 183
    点赞
  • 669
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值