ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【人工智能技术应用学习笔记02】CUDA与cuDNN到底是什么?为什么NVIDIA GPU深度学习环境经常用到它们?

【人工智能技术应用学习笔记02】CUDA与cuDNN到底是什么?为什么NVIDIA GPU深度学习环境经常用到它们? 【人工智能技术应用学习笔记02】CUDA 与 cuDNN 到底是什么为什么 NVIDIA GPU 深度学习环境经常用到它们系列《人工智能技术应用学习笔记》**第 2 篇**CUDA 与 cuDNN 到底是什么上一篇主要记录了 Windows 环境下 NVIDIA 驱动、CUDA、cuDNN 和 TensorRT 的配置过程。这一篇不再继续讨论“怎么安装”而是重点弄明白CUDA 和 cuDNN 到底是什么它们为什么会频繁出现在 NVIDIA GPU 深度学习环境中文章摘要本文从 NVIDIA GPU 深度学习环境出发介绍 CUDA 与 cuDNN 的基本概念、主要作用以及二者之间的区别并进一步梳理 NVIDIA Driver、CUDA、cuDNN、PyTorch 和 TensorRT 之间的关系。同时说明nvidia-smi与nvcc所显示 CUDA 信息的区别以及使用 PyTorch 时是否必须单独安装 CUDA Toolkit 和 cuDNN帮助初学者建立更加准确的 GPU 深度学习环境认识。一、前言第一次配置深度学习环境时经常会看到下面这些名词NVIDIA Driver CUDA cuDNN PyTorch TensorFlow TensorRT刚开始接触时很容易产生几个疑问CUDA 到底是什么 CUDA 是不是显卡驱动 cuDNN 又是什么 已经有 CUDA 了为什么还需要 cuDNN PyTorch 为什么能够调用 NVIDIA GPU TensorRT 和它们又是什么关系如果只按照网上教程一步一步安装可能最后环境能够运行但是并不一定真正理解每个组件的作用。所以这一篇就专门把这些概念梳理清楚。二、先说结论如果只想先建立一个最基本的认识可以先记住CUDA 提供使用 NVIDIA GPU 进行通用并行计算的平台和编程模型而 cuDNN 提供针对深度神经网络常见计算进行优化的 GPU 加速实现。简单来说CUDA主要解决如何让程序利用 NVIDIA GPU 进行通用计算。而cuDNN主要解决如何让深度神经网络中的常见计算在 NVIDIA GPU 上更加高效。两者并不是同一个东西。三、为什么深度学习经常使用 GPU在深度学习模型中会进行大量数学计算例如矩阵乘法 向量运算 卷积 Attention 梯度计算这些计算中的很多操作都具有较强的并行性。GPU 拥有大量可以同时工作的计算单元因此比较适合处理这种规模大 计算量高 并行度高的任务。可以简单理解为CPU 更擅长复杂逻辑和通用任务 GPU 更擅长大量并行数值计算不过需要注意GPU 并不是任何情况下都一定比 CPU 快。如果计算规模很小GPU 的数据传输、任务调度等开销可能反而比较明显。因此更加准确的说法应该是GPU 特别适合大规模、并行度较高的计算任务而深度学习中正好存在大量这样的计算。四、有 NVIDIA GPU为什么还需要 CUDA假设电脑中已经安装了一张 NVIDIA GPU例如GeForce RTX 系列显卡是不是 Python 程序就可以直接让 GPU 开始进行深度学习计算实际上并不是这么简单。程序需要完成很多底层操作例如申请 GPU 显存 把数据传输到 GPU 启动 GPU 计算任务 等待 GPU 完成计算 读取计算结果程序需要一套软件平台和接口来完成这些操作。这就是 CUDA 发挥作用的地方。五、CUDA 到底是什么CUDA 全称Compute Unified Device ArchitectureCUDA 是 NVIDIA 推出的并行计算平台和编程模型。它允许开发者使用 NVIDIA GPU 执行通用计算任务。GPU 最早主要用于游戏画面 3D 图形 图像渲染而通过 CUDAGPU 还可以参与人工智能 科学计算 图像处理 视频处理 高性能计算等任务。因此需要注意CUDA 并不是专门为深度学习设计的。它是一个更加通用的 GPU 计算平台而深度学习只是它非常重要的应用领域之一。六、如何理解 CUDA如果把 NVIDIA GPU 比作一个计算工厂NVIDIA GPU 计算工厂那么 CUDA 可以简单理解成开发接口 运行环境 编程模型 开发工具应用程序可以通过 CUDA 完成申请 GPU 资源 ↓ 传输数据 ↓ 启动计算 ↓ 等待计算完成 ↓ 读取结果当然这只是为了方便理解。实际 CUDA 的体系要复杂得多。七、CUDA Toolkit 又是什么我们平时从 NVIDIA 官网下载并安装的通常是CUDA ToolkitCUDA Toolkit 是一套 GPU 开发工具集合。里面包含CUDA 编译器 CUDA Runtime 开发库 头文件 调试工具 性能分析工具其中比较常见的就是nvcc例如上一篇环境配置中使用nvcc-V或者nvcc--version查看 CUDA 编译器版本。nvcc是 CUDA Toolkit 中的 CUDA 编译器驱动。如果nvcc-V能够正常执行通常说明系统能够找到本地安装的 CUDA Toolkit。八、CUDA 和 NVIDIA Driver 是一回事吗不是。这是刚开始配置环境时特别容易混淆的一个问题。NVIDIA DriverNVIDIA Driver也就是 NVIDIA 显卡驱动主要负责让操作系统识别 GPU 让应用程序与 GPU 通信 提供底层 GPU 驱动支持CUDA ToolkitCUDA Toolkit 则主要提供CUDA 编译器 开发工具 运行库 开发库等 GPU 开发环境。可以简单理解成应用程序 ↓ CUDA Runtime / CUDA相关库 ↓ NVIDIA Driver ↓ NVIDIA GPU所以安装了 NVIDIA Driver并不代表已经安装了 CUDA Toolkit。这也是为什么有时候nvidia-smi能够正常执行但是nvcc-V却提示命令不存在。九、nvidia-smi 中的 CUDA Version 到底是什么执行nvidia-smi以后通常能够看到CUDA Version例如CUDA Version: 13.x这里特别容易产生误解。很多人会认为电脑已经安装了 CUDA Toolkit 13.x。实际上并不能这样判断。nvidia-smi中显示的 CUDA Version更准确地说代表当前 NVIDIA Driver 能够支持的最高 CUDA 版本。而本地 CUDA Toolkit 的版本可以通过nvcc-V进行检查。所以完全可能出现nvidia-smi 显示 CUDA 13.x但是nvcc -V 显示 CUDA 12.x甚至nvcc 命令不存在这些情况并不一定互相矛盾。十、有 CUDA 以后为什么还需要 cuDNN现在已经知道CUDA 提供 NVIDIA GPU 通用计算能力。但是 CUDA 的应用范围非常广。除了深度学习它还可以用于科学计算 图像处理 工程计算 视频处理 高性能计算而在深度神经网络中有一些计算会反复出现。例如卷积 矩阵乘法 Pooling Normalization Attention如果每一个深度学习框架都自己从头实现并优化这些 GPU 运算会增加大量开发工作。因此 NVIDIA 又提供了一个专门针对深度神经网络计算进行优化的库cuDNN十一、cuDNN 到底是什么cuDNN 全称CUDA Deep Neural Network library它是 NVIDIA 提供的面向深度神经网络的高性能 GPU 加速库。cuDNN 为很多深度学习常见操作提供优化实现例如卷积 Attention 矩阵乘法 Pooling Normalization因此CUDA更加偏向GPU 通用计算基础。而cuDNN更加偏向深度神经网络常见计算的高性能实现。十二、CUDA 和 cuDNN 有什么区别可以通过下面的表格理解。对比项目CUDAcuDNN开发者NVIDIANVIDIA定位并行计算平台和编程模型深度神经网络 GPU 加速库应用范围通用 GPU 计算主要面向深度学习典型功能GPU 编程、运行时、开发工具卷积、Attention、Pooling、Normalization 等使用场景AI、科学计算、图像处理、高性能计算深度学习训练和推理核心作用提供 NVIDIA GPU 通用计算能力优化常见神经网络计算最简单的理解就是CUDA 让程序能够利用 NVIDIA GPU 进行通用计算 cuDNN 让部分深度神经网络运算在 NVIDIA GPU 上更加高效十三、PyTorch 和 CUDA 是什么关系我们平时使用 PyTorch 时并不需要自己编写大量底层 CUDA 代码。例如importtorchprint(torch.cuda.is_available())torch.cuda.is_available()会返回一个布尔值用来判断当前 PyTorch 环境是否可以使用 CUDA。如果输出True说明当前 PyTorch 可以使用 CUDA。还可以查看 GPU 名称importtorchiftorch.cuda.is_available():print(torch.cuda.get_device_name(0))如果环境正常就会输出对应 NVIDIA GPU 的名称。十四、Python 是怎么把数据放到 GPU 上的先创建一个 Tensorimporttorch atorch.tensor([1,2,3],dtypetorch.float32)默认情况下这个 Tensor 通常位于 CPU。可以创建一个设备对象devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)然后aa.to(device)完整代码如下importtorch devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)print(当前设备,device)atorch.tensor([1,2,3],dtypetorch.float32)aa.to(device)print(a)如果 CUDA 可用可能输出当前设备cuda这里需要注意Python 本身并不是直接控制 GPU。实际背后还有PyTorch CUDA相关运行库 NVIDIA Driver NVIDIA GPU等多个软件层共同工作。十五、PyTorch 的所有 GPU 运算都会经过 cuDNN 吗不会。这一点非常重要。如果简单画成PyTorch ↓ cuDNN ↓ CUDA ↓ GPU虽然比较容易理解但并不完全准确。实际情况下PyTorch 的 GPU 运算可能会使用cuDNN cuBLAS 自定义 CUDA Kernel 其他 CUDA 相关库例如部分卷积等操作可以使用 cuDNN。但是并不是 PyTorch 的所有 GPU 运算都必须经过 cuDNN。更加准确的理解可以写成┌── cuDNN │ PyTorch ────────┼── cuBLAS │ └── 自定义 CUDA Kernel ↓ NVIDIA Driver ↓ NVIDIA GPU因此cuDNN 是 PyTorch GPU 计算中的重要组件之一但并不是所有 GPU 运算的唯一通道。十六、如何查看 PyTorch 中的 cuDNN可以使用importtorchprint(torch.backends.cudnn.is_available())检查当前 PyTorch 是否可以使用 cuDNN。还可以查看 cuDNN 版本print(torch.backends.cudnn.version())完整代码importtorchprint(CUDA是否可用,torch.cuda.is_available())print(cuDNN是否可用,torch.backends.cudnn.is_available())print(cuDNN版本,torch.backends.cudnn.version())通过这些代码可以快速了解当前 PyTorch GPU 环境的基本情况。十七、使用 PyTorch 一定要自己安装 CUDA Toolkit 和 cuDNN 吗答案是不一定。这是现在学习 PyTorch 时非常容易产生的一个误区。如果使用 PyTorch 官方提供的预编译安装包对应的 CUDA 运行时依赖通常会随着 PyTorch 软件包一起提供。这种情况下普通用户运行 PyTorch GPU 程序时不一定需要自己单独安装完整的 CUDA Toolkit但是仍然需要支持 CUDA 的 NVIDIA GPU 兼容的 NVIDIA Driver如果需要进行编写并编译 CUDA 程序 编译 PyTorch CUDA 扩展 从源码编译 PyTorch 使用 nvcc这类开发工作本地 CUDA Toolkit 通常就会变得很重要。所以不能简单认为使用 PyTorch GPU 必须手动安装 CUDA Toolkit cuDNN是否需要手动安装要根据实际使用场景判断。十八、那为什么还需要了解 CUDA 和 cuDNN既然 PyTorch 已经替我们处理了很多底层问题为什么还需要学习 CUDA 和 cuDNN因为实际开发过程中经常会遇到CUDA 不可用 驱动版本不兼容 CUDA Runtime Error cuDNN 相关错误 GPU 显存不足 CUDA 扩展编译失败如果完全不了解底层环境就很难判断问题到底出现在哪一层。简单整理NVIDIA GPU 真正执行计算的硬件 NVIDIA Driver 负责驱动 GPU 并提供底层接口 CUDA 提供 NVIDIA GPU 通用并行计算能力 cuDNN 为深度神经网络常见计算提供优化实现 PyTorch 提供更加方便的深度学习开发接口理解这些层级以后排查问题就会容易很多。十九、cuDNN 为什么能够提高深度学习性能深度神经网络中会频繁出现卷积 矩阵乘法 Attention Pooling Normalization不同的GPU 型号 数据类型 Tensor 形状 网络结构 运算参数可能适合不同的计算方式。cuDNN 对这些常见深度学习计算进行了高度优化。因此可以把 cuDNN 简单理解为NVIDIA 为深度神经网络准备的一套高性能计算库。PyTorch 等框架可以直接利用这些已经优化过的实现而不需要每次从底层重新开发。二十、深度学习是不是一定离不开 CUDA 和 cuDNN不是。这一点一定要区分清楚。CUDA 属于NVIDIA GPU 计算生态如果使用CPU AMD GPU Apple Silicon 其他 AI 加速硬件可能会使用其他完全不同的计算平台。因此更加准确的说法应该是CUDA 和 cuDNN 是 NVIDIA GPU 深度学习生态中的重要基础组件。而不是所有深度学习都必须使用 CUDA 和 cuDNN。这篇文章讨论的范围主要是NVIDIA GPU 深度学习环境二十一、TensorRT 又处于什么位置上一篇学习笔记主要配置的是TensorRTTensorRT 同样属于 NVIDIA 的人工智能软件生态。如果进行一个非常简化的区分PyTorch更加常见于模型开发 模型训练 实验验证而TensorRT更加关注模型推理优化 高性能推理 模型部署例如一种常见流程是PyTorch ↓ 训练完成的模型 ↓ ONNX ↓ TensorRT 优化 ↓ NVIDIA GPU 推理需要注意这只是常见部署路线之一并不是所有 TensorRT 项目都必须完全按照这个流程进行。二十二、为什么版本兼容这么重要深度学习环境中非常常见的问题就是版本兼容通常可能涉及NVIDIA Driver CUDA Runtime / Toolkit cuDNN PyTorch TensorRT Python这些组件之间存在一定的兼容要求。因此并不能简单认为所有组件都安装最新版 整个环境一定可以正常运行实际开发中版本兼容通常比单纯追求最新版本更加重要。配置环境之前最好先查看框架官方安装说明 NVIDIA 官方兼容性说明 项目本身的版本需求再确定最终环境。二十三、几个常见误区1. 有 NVIDIA 显卡就等于安装了 CUDA Toolkit错误。有 NVIDIA GPU 和 NVIDIA Driver并不代表已经安装 CUDA Toolkit。可以分别检查nvidia-smi和nvcc-V2. nvidia-smi 显示的 CUDA Version 就是 Toolkit 版本错误。nvidia-smi中的 CUDA Version 主要表示当前 NVIDIA Driver 支持的最高 CUDA 版本。本地 CUDA Toolkit 可以通过nvcc-V检查。3. CUDA 就是 cuDNN错误。CUDA 是GPU 并行计算平台和编程模型cuDNN 是深度神经网络 GPU 加速库它们处于不同的层次。4. PyTorch 所有 GPU 运算都会经过 cuDNN错误。PyTorch GPU 计算可能使用cuDNN cuBLAS 自定义 CUDA Kernel 其他 CUDA 库cuDNN 只是其中的重要组成部分之一。5. 使用 PyTorch GPU 必须自己安装 CUDA Toolkit不一定。对于官方预编译 PyTorch 软件包普通 GPU 使用场景并不一定要求用户额外安装完整 CUDA Toolkit。但如果需要编译 CUDA 程序 开发 CUDA 扩展 使用 nvcc则本地 CUDA Toolkit 通常会非常重要。6. CUDA 版本越高越好不一定。实际更应该关注硬件支持 驱动兼容 框架支持 项目需求而不是单纯追求更高版本。二十四、这次学习最大的收获上一篇配置 TensorRT 时我更多是在按照Driver ↓ CUDA ↓ cuDNN ↓ TensorRT一步一步完成环境配置。当时主要关注怎么让环境成功运行但是理解这些组件以后我发现环境配置并不是简单地“安装几个软件”。它们实际上分别负责不同的工作。可以简单总结为NVIDIA GPU 真正执行计算的硬件 NVIDIA Driver 负责驱动 GPU 和提供底层接口 CUDA NVIDIA GPU 通用并行计算平台 cuDNN 深度神经网络高性能计算库 PyTorch 深度学习开发框架 TensorRT 面向 NVIDIA GPU 的高性能推理 SDK理解这些关系以后再遇到CUDA 不可用 cuDNN 错误 PyTorch 找不到 GPU TensorRT 版本冲突等问题时就可以根据软件层级逐步排查而不是不断重新安装环境。二十五、总结这篇主要整理了两个核心概念。CUDA 是什么CUDA 是 NVIDIA 推出的并行计算平台和编程模型。它使开发者能够利用 NVIDIA GPU 执行通用计算任务。它不仅可以用于深度学习还可以用于科学计算 高性能计算 图像处理 视频处理等领域。cuDNN 是什么cuDNN 是 NVIDIA 提供的面向深度神经网络的 GPU 加速库。它为卷积 Attention 矩阵乘法 Pooling Normalization等常见神经网络计算提供经过优化的实现。两者之间可以简单概括为CUDA NVIDIA GPU 通用计算基础 cuDNN 针对深度神经网络计算提供优化而在实际 PyTorch GPU 环境中PyTorch会根据不同计算任务使用cuDNN cuBLAS CUDA Kernel 其他 GPU 计算库最终通过 NVIDIA 的软件栈使用 GPU。因此与其简单记住深度学习必须安装 CUDA 和 cuDNN。更加准确的理解应该是CUDA 和 cuDNN 是 NVIDIA GPU 深度学习生态中的重要组成部分但用户是否需要手动安装它们要根据所使用的框架、安装方式和开发需求判断。下一篇预告【人工智能技术应用学习笔记03】PyTorch 是怎么调用 GPU 的CPU 和 GPU 运行有什么区别下一篇准备通过 Python 代码实际使用torch.cuda.is_available()以及tensor.to(cuda)进一步理解CPU GPU CUDA PyTorch之间是怎样配合工作的。同时尝试通过简单 Tensor 计算进一步理解 CPU 和 GPU 两种计算设备的使用方式。这是《人工智能技术应用学习笔记》系列第 2 篇。目前已经完成01 Windows 环境下 TensorRT 配置记录 02 CUDA 与 cuDNN 到底是什么后续准备继续整理03 PyTorch 与 GPU 04 CPU 与 GPU 计算 05 TensorRT 为什么能够加速模型 06 ONNX 是什么 07 PyTorch 模型转 ONNX 08 TensorRT 模型部署 09 FP32、FP16 与 INT8 10 大模型基础与部署实践希望通过持续记录把学习过程中原本零散的人工智能知识逐渐连接起来形成更加完整的技术知识体系。系列《人工智能技术应用学习笔记》**第 2 篇**CUDA 与 cuDNN 到底是什么**关键词**CUDA、cuDNN、NVIDIA、GPU、PyTorch、TensorRT、深度学习、人工智能
返回列表