CUDA环境详解

CUDA环境详解

本文主要介绍 CUDA 环境,这一堆东西网上有很多博客介绍过了,我再来一篇:),参考前辈们的文章,看能不能写的更清楚一点。读后仍有问题,欢迎留言交流。

CUDA APIs

CUDA是由NVIDIA推出的通用并行计算架构,通过一些CUDA库提供了一系列API供应用程序调用。开发者可调用这些API充分利用GPU来处理图像,视频解码等。

CUDA 的 API 其实是可以分层次来理解的,这也造成了有时会出现 nvcc -V 显示的 CUDA 版本和 nvidia-smi 显示的 CUDA 版本不一致的情况,其实这就是由于它们根本就是不同层次的 API,因此并不一定是一起安装的,也就不一定是同一个版本的。

CUDA API体系包括:CUDA函数库(CUDA Libraries),CUDA运行时API(CUDA Runtime API),CUDA驱动API(CUDA Driver API),结构图如下:

在这里插入图片描述

图1:CUDA API体系结构,图源:[1]

CUDA Driver API

GPU设备的抽象层,通过提供一系列接口来操作GPU设备,性能最好,但编程难度高,一般不会使用该方式开发应用程序。

用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。 我么你常用的 nvidia-smi就属于这一类API。

CUDA Runtime API

对CUDA Driver API进行了一定的封装,调用该类API可简化编程过程,降低开发难度。

用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的。

CUDA Toolkit Installer:有时可能会集成了GPU driver Installer。nvcc是与CUDA Toolkit一起安装的CUDA compiler-driver tool,即 CUDA 的编译器,它只知道它自身构建时的 CUDA runtime版本。它不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver。

CUDA Libraries

是对CUDA Runtime API更高一层的封装,通常是一些成熟的高效函数库,开发者也可以自己封装一些函数库便于使用。

比如常见的 cuFFT、cuBLAS 库。

关系

应用程序可调用CUDA Libraries或者CUDA Runtime API来实现功能,当调用CUDA Libraries时,CUDA Libraries会调用相应的CUDA Runtime API,CUDA Runtime API再调用CUDA Driver API,CUDA Driver API再操作GPU设备。

cudatoolkit

几个概念辨析

  • 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。

完整版cudatoolkit内容

一般的结构中,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向后兼容。

conda下的cudatoolkit

通过 conda 安装 cudatoolkit 包含的库文件在 ~/anaconda3/lib 中,或者在 ~/anaconda3/pkgs/cudatoolkit-xxx/lib 中查看,grep 一下 libcu、libnpp、libnv 这几个名字查看即可,当然这样 grep 出来的也不一定确实 cudatoolkit 的文件,可能有 libcurl 之类的,只是初步过滤。

ls ~/anaconda3/lib/ | egrep  'libcu|libnpp|libnv'
ls ~/anaconda3/pkgs/cudatoolkit-11.0.221-h6bb024c_0/lib/ | egrep  'libcu|libnpp|libnv'
# 这里的11.0.221-h6bb024c_0z是笔者的版本。大家的可能不同,请自行查看确认

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

本机CUDA多版本管理

修改软连接

我们安装的不同版本的 CUDA Runtime API 一般都会在 /usr/local 目录下。

我们可以通过:

ls -l /usr/local | grep cuda

来查看自己的机器上有多少个cuda版本,通常不带版本号的 cuda 会是其他带版本号的cuda-x.x的软链接。即像下面这样:

lrwxrwxrwx  1 root root    21 12月 10  2020 cuda -> /usr/local/cuda-11.1/

而我们只要把我们使用cuda时都指向这个软链接 /usr/local/cuda,并在需要切换版本时切换这个软链接的指向即可。

sudo rm -rf cuda
sudo ln -s /usr/local/cuda-9.0 /usr/local/cuda

修改环境变量

注意此时如果nvcc -V的输出还是更改之前的CUDA版本的话, 可能是环境变量中直接指定了 CUDA 版本路径,比如在 ~/.bashrc 中有类似以下的语句:

export PATH=/usr/local/cuda-11.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH

此时我们要修改环境变量为(在命令行中执行仅当前终端生效,修改 ~/.bashrc 永久生效):

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

就可以愉快地用指向 /usr/local/cuda 的软链接来控制本机的 CUDA 版本了。

附:几个环境变量的含义

PATH

PATH是可执行文件路径,是三个中我们最常接触到的,因为我们命令行中的每句能运行的命令,如ls、top、ps等,都是系统通过PATH找到了这个命令执行文件的所在位置,再run这个命令(可执行文件)。 比如说,在用户的目录~/mycode/下有一个bin文件夹,里面放了有可执行的二进制文件、shell脚本等。如果想要在任意目录下都能运行上述bin文件夹的可执行文件,那么只需要把这个bin的路径添加到PATH即可,方法如下:

# vim ~/.bashrc
PATH=~/mycode/bin:$PATH

LIBRARY_PATH和LD_LIBRARY_PATH

这两个路径可以放在一起讨论,

  • LIBRARY_PATH程序编译期间查找动态链接库时指定查找共享库的路径
  • LD_LIBRARY_PATH程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径

两者的共同点是库,库是这两个路径和PATH路径的区别,PATH是可执行文件。

两者的差异点是使用时间不一样。一个是编译期,对应的是开发阶段,如gcc编译;一个是加载运行期,对应的是程序已交付的使用阶段。

配置方法也是类似:

export LD_LIBRARY_PATH=XXXX:$LD_LIBRARY_PATH

Pytorch CUDA版本相关的几个常用的变量

我们通常考察 Pytorch 中的以下几个变量来确定当前 Pytorch 的 CUDA 信息:

  • torch.cuda.is_available(),CUDA 是否可用。
  • torch.version.cuda,CUDA 版本。
  • torch.utils.cpp_extension.CUDA_HOME, CUDA 路径 CUDA_HOME。

可以通过下面这一句来在命令行中查看上述三个变量信息:

python -c "import torch; from torch.utils.cpp_extension import CUDA_HOME; print(torch.cuda.is_available(), torch.version.cuda, CUDA_HOME)"

Pytorch用的到底是哪个版本的CUDA?

其实就是看 CUDA_HOME 环境变量到底被指定为什么。

Pytorch 搜索 CUDA_HOME 的顺序如下:

  1. 显式指定的环境变量 CUDA_HOME

    即如:

    export CUDA_HOME=/usr/local/cuda11.5
    

    即直接指定 /usr/local/cuda11.5 路径下的 CUDA 为使用的 CUDA。

  2. 默认搜索的路径 /usr/local/cuda

    我们之前也提到过本机 CUDA 多版本管理通常是通过改变上述路径的软链接来实现,这也是 Pytorch 一个默认会搜索的路径。

  3. nvcc 的所在目录

    which nvcc 的上级目录,之前提到过,nvcc 是 CUDA 的编译器,但是,他对于 Pytorch 并不是必须的,即可能 nvcc 并不存在,但是 Pytorch 还是可以正常通过 cudatoolkit 来调用 GPU,即下一条。

  4. cudatoolkit

    如果上述都不存在,则 torch.utils.cpp_extension.CUDA_HOME 会被设置为 None。然后 Pytorch 会使用 conda 安装的 cudatoolkit,其路径为cudart 库文件目录的上级目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的)。

Ref:

[1]:NVIDIA Docker CUDA容器化原理分析

[2]:怎么在docker中使用nvidia显卡

[3]:[docker gpu报错Error response from daemon: could not select device driver ““ with capabilities: [[gpu]]](https://blog.csdn.net/weixin_44966641/article/details/123760614)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对Docker镜像layer的理解

对Docker镜像layer的理解 转自:https://blog.csdn.net/u011069294/article/details/105583522 FROM python:3.6.1-alpine RUN pip install flask CMD [“python”,“app.py”] COPY app.py /app.py上面是一个Dockerfile的例子,每一行都会生成一个新的l…

机器学习系统:设计与实现 计算图

机器学习系统:设计与实现 计算图 转自:https://openmlsys.github.io/chapter_computational_graph/index.html 在上一章节中,我们展示了用户利用机器学习框架所编写的程序。这些用户程序包含了对于训练数据,模型和训练过程的定义。然而为了…

常见浮点数格式梳理

常见浮点数格式梳理 IEEE 754 标准 浮点数转换网站:https://www.h-schmidt.net/FloatConverter/IEEE754.html IEEE二进制浮点数算术标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值&am…

混合精度训练

混合精度训练 转自:https://zhuanlan.zhihu.com/p/441591808 通常我们训练神经网络模型的时候默认使用的数据类型为单精度FP32。近年来,为了加快训练时间、减少网络训练时候所占用的内存,并且保存训练出来的模型精度持平的条件下&#xff0…

C++面试常考题——编译内存相关

C面试常考题——编译内存相关 转自:https://leetcode-cn.com/leetbook/read/cpp-interview-highlights/e4ns5g/ C程序编译过程 编译过程分为四个过程:编译(编译预处理、编译、优化),汇编,链接。 编译预处…

关键字库函数

关键字库函数 转自&#xff1a;https://leetcode-cn.com/leetbook/read/cpp-interview-highlights/ej3mx1/ sizeof和strlen的区别 strlen 是头文件<cstring> 中的函数&#xff0c;sizeof 是 C 中的运算符。 strlen 测量的是字符串的实际长度&#xff08;其源代码如下&…

memcpy和memmove的区别以及内存重叠问题

memcpy和memmove的区别以及内存重叠问题 转自&#xff1a;https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数&#xff0c;在头文件 string.h 中&#xff0c;作用是拷贝一定长度的内存的内容&#xff0c;原型分别如下&#xff1a; void…

从头搭建一个深度学习框架

从头搭建一个深度学习框架 转自&#xff1a;Build a Deep Learning Framework From Scratch 代码&#xff1a;https://github.com/borgwang/tinynn 当前深度学习框架越来越成熟&#xff0c;对于使用者而言封装程度越来越高&#xff0c;好处就是现在可以非常快速地将这些框架作为…

Docker概念理解

Docker概念理解 本文非Docker命令大全&#xff0c;而是对Docker的概念、原理等作说明&#xff0c;适合有一定实操经验后来加深理解。 转自&#xff1a;docker从入门到实践 Docker简介 本章将带领你进入 Docker 的世界。 什么是 Docker&#xff1f; 用它会带来什么样的好处&a…

Linux内存背后的那些神秘往事

Linux内存背后的那些神秘往事 作者&#xff1a;大白斯基&#xff08;公众号&#xff1a;后端研究所&#xff09; 转自&#xff1a;https://mp.weixin.qq.com/s/l_YdpyHht5Ayvrc7LFZNIA 前言 大家好&#xff0c;我的朋友们&#xff01; CPU、IO、磁盘、内存可以说是影响计算机…

精简CUDA教程——CUDA Driver API

精简CUDA教程——CUDA Driver API tensorRT从零起步迈向高性能工业级部署&#xff08;就业导向&#xff09; 课程笔记&#xff0c;讲师讲的不错&#xff0c;可以去看原视频支持下。 Driver API概述 CUDA 的多级 API CUDA 的 API 有多级&#xff08;下图&#xff09;&#xff…

CUDA编程入门极简教程

CUDA编程入门极简教程 转自&#xff1a;CUDA编程入门极简教程 作者&#xff1a;小小将 前言 2006年&#xff0c;NVIDIA公司发布了CUDA&#xff0c;CUDA是建立在NVIDIA的CPUs上的一个通用并行计算平台和编程模型&#xff0c;基于CUDA编程可以利用GPUs的并行计算引擎来更加高效地…

精简CUDA教程——CUDA Runtime API

精简CUDA教程——CUDA Runtime API tensorRT从零起步迈向高性能工业级部署&#xff08;就业导向&#xff09; 课程笔记&#xff0c;讲师讲的不错&#xff0c;可以去看原视频支持下。 Runtime API 概述 环境 图中可以看到&#xff0c;Runtime API 是基于 Driver API 之上开发的…

TensorRT ONNX 基础

TensorRT ONNX 基础 tensorRT从零起步迈向高性能工业级部署&#xff08;就业导向&#xff09; 课程笔记&#xff0c;讲师讲的不错&#xff0c;可以去看原视频支持下。 概述 TensorRT 的核心在于对模型算子的优化&#xff08;合并算子、利用当前 GPU 特性选择特定的核函数等多种…

mmdetection tools工具梳理

mmdetection tools工具梳理 mmdetection 是一个非常好用的开源目标检测框架&#xff0c;我们可以用它方便地训练自己的目标检测模型&#xff0c;mmdetection 项目仓库提供许多实用的工具来实现帮助我们进行各种测试。本篇将梳理以下 mmdetection 项目仓库 tools 目录下的各种实…

TensorRT ONNX 基础(续)

TensorRT ONNX 基础&#xff08;续&#xff09; PyTorch正确导出ONNX 几条推荐的原则&#xff0c;可以减少潜在的错误&#xff1a; 对于任何使用到 shape、size 返回值的参数时&#xff0c;例如 tensor.view(tensor.size(0), -1) 这类操作&#xff0c;避免直接使用 tensor.s…

frp实现内网穿透极简教程

frp实现内网穿透极简教程 本文是内网穿透极简教程&#xff0c;为求简洁&#xff0c;我们不介绍为什么内网穿透也不介绍其原理&#xff0c;这里假设各位读者都已经明确的知道自己的目的&#xff0c;本文仅介绍如何安装配置 frp 实现内网穿透。 简单来说&#xff0c;内网穿透就…

图像预处理之warpaffine与双线性插值及其高性能实现

图像预处理之warpaffine与双线性插值及其高性能实现 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ZU4y1A7EG 代码Repo&#xff1a;https://github.com/shouxieai/tensorRT_Pro 本文为视频讲解的个人笔记。 warpaffine矩阵变换 对于坐标点的变换&#xff0c;我们通…

sed 简明教程

sed 简明教程 转自&#xff1a;https://coolshell.cn/articles/9104.html awk于1977年出生&#xff0c;今年36岁本命年&#xff0c;sed比awk大2-3岁&#xff0c;awk就像林妹妹&#xff0c;sed就是宝玉哥哥了。所以 林妹妹跳了个Topless&#xff0c;他的哥哥sed坐不住了&#xf…

[深度][PyTorch] DDP系列第一篇:入门教程

[深度][PyTorch] DDP系列第一篇&#xff1a;入门教程 转自&#xff1a;[原创][深度][PyTorch] DDP系列第一篇&#xff1a;入门教程 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好&#xff1f;那你definitely需要这一篇&#xff01; No one knows DDP better than I…