极智开发 | 解读英伟达软件生态 深度神经网络库cuDNN

361 阅读4分钟

欢迎关注我的公众号 [极智视界],获取我的更多经验分享

大家好,我是极智视界,本文来介绍一下 解读英伟达软件生态 深度神经网络库cuDNN。

邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:t.zsxq.com/0aiNxERDq

cuDNN,全称为 NVIDIA CUDA Deep Neural Network Library,是深度神经网络算子层级 GPU 加速库集合,提供了深度学习算法中常见算子的高效实现,所以也直接成为了很多上层推理引擎底层调优的算子备选实现,比如 TensorRT、比如 TVM。再换个角度理解,之前我在这个系列的开篇 "解读英伟达软件生态之 CUDA" 中介绍了 GPU 的编程语言 CUDA C,用 CUDA C 其实就是为了写一些 Kernel,而这里的 cuDNN 则是提供了一系列已经写好的高效的 CUDA C Kernel 的集合。同级别的概念还有 cuBLAS、cuRAND、cuFFT,区别就在于它们面向的应用场景不同,这里的 cuDNN 就是面向深度神经网络算子的高效实现。

cuDNN 中常见的高效算子实现包括:

  • 前向和反向卷积;
  • 矩阵乘;
  • 前向和反向池化;
  • 前向和反向 Softmax;
  • 前向和反向神经网络激活算子,比如 relu、tanh、sigmoid、rlu、gelu、softplus、swish;
  • 前向和反向归一化计算,比如 BN、IN、LN、LRN、LCN;
  • 基础数学逐点计算;
  • 张量变换计算;

前面提到,cuDNN 已经成为了很多上层推理引擎的底层调优算子实现的备选,来解释一下。比如在 TVM 这种 Code-Gen 类型的编译优化框架中,它会先采用 Program Sampler 生成一个大的搜索空间,然后采用 Performance Tuner 进行调优超参搜索生成高性能的算子实现,然后如果 Backend 是 GPU 则会把 cuDNN 的性能作为标杆进行对比,要是比 cuDNN 效率高呢,那就万事大吉说明编译优化起效果了,要是比 cuDNN 效率低呢,那就直接回退到 cuDNN 的实现。这种回退机制其实是比较常见的,比如在异构编程中,在 NPU 实现没有的情况下,一般妥协的做法就是回退到 CPU 实现。

回到 cuDNN 本身,cuDNN 从架构上是采用 C 语言 Handle 的接口封装设计,Handle 的接口设计对于 C 语言来说,也是我比较推崇的,在 21 年的时候写过一篇文章介绍可供参考《极智开发 | 用 handle 形式设计 C 语言接口》。cuDNN 作为一个底层库,对于 Tensors、对于 Layouts 的控制也会十分精细,比如会有 3-D Tensor、4-D Tensor 甚至是 5-D Tensor,又比如 4-D Tensor 会涉及咱们很常见的一些 Layouts,比如 NCHW、NHWC、CHWN,而 Layouts 其实跟上层深度学习框架和底层硬件架构都会比较相关,比如主流的 Pytorch 更喜欢用 NCHW 等。

另外,cuDNN 要发挥出高性能,肯定还离不开 "操控" Tensor Core。解释一下 Tensor Core 哈,GPU 的计算单元主要分为 CUDA Core 和 Tensor Core,CUDA Core 主要使能于标量计算、矢量计算这些,而 Tensor Core 则主要使能于矩阵计算。而且那些各种 "稀奇古怪" 的精度,比如 FP16、TF32、FP8、INT4 之类的,其实主要都是存在于 Tensor Core。所以 cuDNN 一些的高性能算子实现,不管是高性能卷积还是高性能矩阵乘的优化甚至现在 Transformer 中高性能的 Multi-Head Attention,都离不开对于 Tensor Core 的优化。

总之,说白了 cuDNN 就是一个已经是英伟达专家人工优化得很好了的深度学习网络算子库的集合,它就在那儿,可以作为你优化 Kernel 的 "备选",也可以作为你写 Kernel 的 "刚需",它就在那儿,就看你用不用了。

好了,以上分享了 解读英伟达软件生态 深度神经网络库cuDNN,希望我的分享能对你的学习有一点帮助。



 【公众号传送】

《极智开发 | 解读英伟达软件生态 深度神经网络库cuDNN》


畅享人工智能的科技魅力,让好玩的AI项目不难玩。邀请您加入我的知识星球, 星球内我精心整备了大量好玩的AI项目,皆以工程源码形式开放使用,涵盖人脸、检测、分割、多模态、AIGC、自动驾驶、工业等。一定会对你学习有所帮助,也一定非常好玩,并持续更新更加有趣的项目。 t.zsxq.com/0aiNxERDq

logo_show.gif