一文讲清楚CUDA、CUDA toolkit、CUDNN、NVCC关系 您所在的位置:网站首页 anaconda各个版本区别更新说明 一文讲清楚CUDA、CUDA toolkit、CUDNN、NVCC关系

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

2023-09-28 22:58| 来源: 网络整理| 查看: 265

目录 主要参考一、CUDA/cudnn/CUDA Toolkit/NVCC区别简介二、CUDA Toolkit具体组成三、NVCC简介四、版本管理1、pytorch运行时的CUDA版本(1)查看cuda 运行版本 和 编译时的版本(2)pytorch寻找可用CUDA的过程: 2、conda下的cudatoolkit3、nvidia-smi和nvcc显示的CUDA版本4、使用环境变量查找CUDA

主要参考 显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn到底是什么 写的真的好Pytorch 使用不同版本的 cuda 写的也真的好 一、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:NVCCTools:分析器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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有