cuDNN——核心概念

news2024/11/23 19:17:56

在讨论graph和legacy API的细节之前,这一部分先介绍两者共同的核心概念。

cuDNN Handle

cuDNN库暴露了一系列主机API,但是假设所有用到GPU的op,其必要的数据都可以直接从设备上访问。

使用cuDNN的应用必须先调用cudnnCreate()来初始化句柄。这个句柄会被显示传递给后续操作GPU数据的函数。应用可以通过调用cudnnDestroy()来释放句柄关联的资源。这中方法允许用户在使用多个主机线程、多个GPU或多个CUDA流时显示控制cuDNN库的功能。

例如,一个应用可以使用cudaSetDevice(在创建cuDNN句柄之前)在不同的主机线程里关联不同的设备,然后再每个主机线程里,创建一个唯一的cuDNN句柄,用于指定该线程中所有的cuDNN API调用都作用于该线程关联的设备。这种情况下,使用不同句柄的cuDNN库调用将自动运行在不同的设备上。

cuDNN假定在cudnnCreate()创建句柄后,直到调用cudnnDestroy()销毁句柄之前,句柄所关联的设备保持不变。如果要在同一个主机线程中使用不同的设备,应用必须通过cudaSetDevice设定新设备,然后重新使用cudnnCreate()创建一个cuDNN句柄,这个句柄会关联到新设备。

Tensors and Layouts

无论使用graph API还是legacy API,cuDNN操作都会使用tensors作为输入,并产生tensors作为输出。

Tensor Descriptor

cuDNN库使用一个通用的n-D Tensor描述符来描述数据。可以通过如下参数来定义一个Tensor描述符:

  • 数据的维度(3-8维)
  • 数据类型(32-bit 浮点,64-bit 浮点,16-bit 浮点…)
  • 一个定义每个维度值的整型数组
  • 一个定义每个维度跨距的整型数组(例如:获取当前维度下一个元素所需要跨越的元素数)

这种tensor定义允许某些维度数据相互重叠,例如,当前维度的跨距 < 下一个维度值 * 下一个维度的跨距(举例:nchw = [1, 2, 3, 4],假设w的跨距是1,当h的跨距为w,也就是4 * 1,就没有重叠,但是当h的跨距是2,也就是2 < 4 * 1,h维度和w维度就存在重叠)。在cuDNN里,除非另外指定,所有执行前向传播的函数中,输入tensor允许overlapping,所有输出tensor不支持overlapping。虽然Tensor描述支持负跨距(对数据镜像很有用),但除非另有规定,否则cuDNN函数不支持具有负跨距的Tensor。

WXYZ Tensor Descriptor

tensor的格式可以使用各个维度的缩写来标识(例如:NHWC),在cuDNN文档中,使用这种描述方法意味着:

  • 所有的跨距都是正的
  • 字母对应维度的跨距按降序排列(例如:NHWC排列的tensor,n_stride >= h_stride >= w_stride >= c_stride)
3-D Tensor Descriptor

一个3-D tensor通常用于矩阵乘法。具有三个维度:B,M,N。B代表batch size(对于单batch的GEMM,设置为1),M和N分别代表矩阵的行列数。更多信息可以参考CUDNN_BACKEND_OPERATION_MATMUL_DESCRIPTORop(cuDNN graph API)。

4-D Tensor Descriptor

4-D tensor descriptor使用4个字母(N,C,H,W)表示多batch的2D图像,N,C,H,W分别代表batch size,特征图数量,图像高度,图像宽度。以跨距值来降序排列这4个字母。最常用的4-D tensor格式是:

  • NCHW
  • NHWC
  • CHWN
5-D Tensor Descriptor

5-D tensor descriptor使用5个字母(N,C,D,H,W)表示多batch的3D图像,N,C,D,H,W分别代表batch size,特征图数量,图像深度,图像高度,图像宽度。以跨距值来降序排列这5个字母。最常用的5-D tensor格式是:

  • NCDHW
  • NDHWC
  • CDHWN
Fully-Packed Tensors

一个tensor只有满足如下条件时,才被定义为XYZ-fully-packed

  • tensor的维度数等于fully-packed前面的字母数(例如:NCHW-full-packed,则此tensor的维度数必须为4。)
  • i维度的跨距必须等于第i+1维度值乘以第i+1维度的跨距
  • 最后一个维度的跨距必须是1

例如:一个格式是NHWC的tensor,假设N,H,W,C分别是1,2,3,4,则根据第三条,最后一个维度C的跨距必须是1,然后循环使用第2条,则可以得到W的跨距必须是1 * 4(C维度的值) = 4H的跨距必须是3(W维度值) * 4(W的跨距) = 12N的跨距必须是2(H维度值) * 12(H的跨距) = 24。同时,根据第一条,此tensor的维度数是4(只包含NHWC 4个维度),则这个tensor才是NHWC-full-packed

Partially-Packed Tensors

一个 WXYZ tensor只有满足如下条件时,才被定义为XYZ-packed

  • 不在-packed中的维度的跨距必须大于或等于下一个维度值和下一个维度跨距的乘积。
  • -packed中的维度,第i维度的跨距必须等于第i+1维度值和第i+1维度跨距的乘积。
  • 如果最后一个维度在-packed中,则它的跨距必须是1。

例如:一个4-D tensor的格式是NCHW,N,C,H,W分别是1,2,3,4,若其是CH-packed,则根据第三条,最后一个维度W不在CH-packed中,其跨距可以不为1,假设其跨距是2,同时,假设H的跨距是3(随意设置的值,为了证明CH是否packed与W维度无关,故意没有设置为4(W维度值) * 2(W维度跨距) = 8),则根据第二条,HCH-packed中,则C的跨距必须等于3(H维度值) * 3(H维度跨距) = 9,根据第一条,N的跨距必须大于等于2(C维度值) * 9(C维度跨距) = 18,这样才能说这个tensor是CH-packed

Spatially Packed Tensors

Spatially-packed tensors被定义为在空间维度上packed的partially-packed tensor。也就是说对于spatially-packed 4D tensor,意味着无论是NCHW tensor还是CNHW tensor,都是HW-packed。

Overlapping Tensors

如果在整个维度范围内迭代时,多次取到相同的地址,则该tensor被定义为overlapping tensor。实践中,overlapping tensors意味着,对于某些维度i(在[1, nbDims]区间内),会存在stride[i-1] < stride[i] * dim[i]

Data Layout Formats

这一部分用几个tensor layout formats描述cuDNN tensors的内存排布。

指定tensor layout format的推荐方式是指定各个维度的strides。但是为了和v7系列API兼容,cuDNN也支持通过cudnnTensorFormat_t 枚举类型来设置常用的几个tensor layout format。这个枚举类型仅用于历史兼容性,已经被标记为deprecated。

Example Tensor

假设存在一个batch的图像,尺寸如下:

  • batch size N是1;
  • feature maps(通道数)C是64;
  • 图像高H是5;
  • 图像宽W是4;

为了保持示例简单,图像像素值用整型序列(0,1,2,3等)表示。
请添加图片描述

下面的部分开始讲解几种不同的layout format下,上面的tensor是如何排布的。

Convolution Layouts

cuDNN中,卷积支持如下几种不同的layout。

NCHW Memory Layout

上面的4D tensor如果按照NCHW排布,其内存描述如下:

  1. 首先排第一个通道(c=0),这个通道的HW按照row-major序(行主序)进行排布。
  2. 继续排布第二个通道及后续通道,直至所有通道都排布完成。
  3. 按照上面2步的排布继续排下一个batch(N > 1时)
    请添加图片描述
NHWC Memory Layout

对于NHWC memory layout,C通道的元素首先被排布,具体排布如下:

  1. 首先排0号通道的第一个元素,然后排1号通道的第一个元素,以此类推,直到所有通道的第一个元素都排完。
  2. 其次,排布0号通道的第二个元素,然后排1号通道的第二个元素,以此类推,直到所有通道的第二个元素都排完。
  3. 以raw-major(行主序)重复上面两步,直至元素全部排完。
  4. 排布下一个batch(N > 1时)。
    请添加图片描述
NC/32HW32 Memory Layout

NC/32HW32 layout和NHWC layout类似,但是有一个关键的不同点。NC/32HW32 layout下,64个通道被分为两组,每组32个通道,第一组排布c0-c31,第二组排布c32-c63。每组内的排布和NHWC排布相同。
请添加图片描述

对于通用的NC/xHWx layout,以下结论是适用的:

  • 只有C维度(通道)被分组,每组包含x个通道。
  • x = 1时,每组只有一个通道,因此,排当前组也就是排当前通道,排下一个组,也就是排下一个通道,这也就是NCHW foramt。
  • x = C时,NC/xHWx就是NHWC,也就是说,所有通道C被排到同一个组里了。x = C也可以理解为所有C维度被向量化,放入一个巨大的vector中。就像NHWC一样。
  • cudnnTensorFormat_t里面的枚举值也可以用如下的方式进行解释——NCHW INT8x32 format实际上是N x (C/32) x H x W x 32(每个W包含32个C),NCHW INT8x4就是N x (C/4) x H x W x 4(每个W包含4个C)。因此,VECT_C表示每个W由一个C的向量组成。
MatMul Layouts

正如上面描述的3-D Tensor Descriptor,矩阵乘使用3D tensors,使用BMN描述。其layout可以使用strides描述。下面展示了两个推荐的layouts:

  • Packed Row-major:维度值 [B, M, N],跨距strides是 [MN, N, 1];
  • Packed Column-major:纬度值 [B, M, N],跨距strides是 [MN, 1, M]

对于3-D tensor来说,Unpacked layout也是支持的,但是支持的不是很好。

Tensor Core Operations

从cuDNN v7开始,cuDNN对计算密集型函数,在受支持的GPU SM版本上,引入了Tensor Core硬件支持。Tensor Core操作从NVIDIA Volta GPU开始受支持。

Tensor Core操作加速矩阵的数学操作;cuDNN使用Tensor Core操作,用于加速FP16,FP32以及INT32的运算。通过cudnnMathType_t枚举类型将math mode设置为CUDNN_TENSOR_OP_MATH,则表示让cuDNN使用Tensor Core操作。

默认的math mode是CUDNN_DEFAULT_MATH,这个值表示cuDNN不会使用Tensor Core操作。CUDNN_TENSOR_OP_MATH会使用Tensor Core操作,这两种模式的计算时许不同,可能导致浮点数运算的结果有些许差异。

例如:使用Tensor Core操作进行两个矩阵相乘的操作,其结果与顺序进行的标量浮点运算产生的结果非常接近,但并不总是相同的。

然而,训练常见的深度学习模型,通过最终网络精度和网络收敛时的迭代次数来对比,使用Tensor Core运算和标量浮点运算之间的差异可以忽略不计。因此,cuDNN将这两种模式视为在功能上不可区分,并允许在Tensor Core操作不适于使用的条件下,回退到标量运算上。

以下深度学习kernel可用Tensor Core运算:

  • Convolutions
  • RNNs
  • Multihead Attention

可以访问NVIDIA Training with Mixed Precision获取更多信息。

对于深度学习编译器,以下是关键指南:

  • 若要确保卷积操作符合Tensor Core的使用条件,就要避免使用大尺寸的padding和大尺寸的filter,两者的任意组合都不行。
  • 将inputs和filters都转化为NHWC格式,并且将channel和batch size都填充为8的倍数。
  • 确保所有用户提供的tensors,workspace,以及reserve space都对齐到128-bit边界。注意1024-bit对齐可以产生更好的性能。

Notes on Tensor Core Precision

对于FP16的数据,Tensor Core操作FP16的输入,产生FP16的输出,可能使用FP16和FP32进行累加。对于使用FP32累加,产生FP16输出的运算,输出值将会down-converted为FP16。通常,累加类型和输出类型具有相同精度或更高精度。
请添加图片描述
最新文章和代码都放在github master-cudnn上,期待star。

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

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

相关文章

【C/C++】C++中的四种强制类型转换

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

USART发送各种数据类型数据的原理及程序实现

硬件接线&#xff1a; 显示屏的SCA接在B11&#xff0c;SCL接在B10&#xff0c;串口的RX连接A9&#xff0c;TX连接A10。 新建Serial.c和Serial.h文件 在Serial.c文件中&#xff0c;实现初始化函数&#xff0c;等需要的函数&#xff0c;首先对串口进行初始化&#xff0c;只需要…

信创实力进阶,Smartbi再获华为云鲲鹏技术认证

日前&#xff0c;经华为技术有限公司评测&#xff0c;思迈特商业智能与数据分析软件Smartbi Insight V11与华为技术有限公司Kunpeng 920 Taishan 200完成并通过相互兼容性测试认证&#xff0c;成功再获华为云鲲鹏技术认证书&#xff0c;标志着Smartbi与华为云鲲鹏产业生态合作更…

http模块—http请求练习

题目要求&#xff1a;搭建如下http服务&#xff1a; 1.当浏览器向我们的服务器发送请求时&#xff0c;当请求类型是get请求&#xff0c;请求的url路径地址是/login。响应体结果是登录页面 2.当浏览器向我们的服务器发送请求时&#xff0c;当请求类型是get请求&#xff0c;请求…

物流智能蓝牙锁控设计方案

一、行业背景与需求分析 物流行业作为全球贸易和供应链管理的关键环节&#xff0c;其安全性和效率对整个经济体系的运作至关重要。随着电子商务的兴起和全球市场的一体化&#xff0c;物流行业正面临着前所未有的挑战&#xff0c;尤其是在货物安全、运输效率、成本控制和信息管…

C#学生信息成绩管理系统

一、系统功能描述 本系统包括两类用户&#xff1a;学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息&#xff1b;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等&#xff0c;而学生则可以通过系统来选择课…

干货分享:品牌如何通过社媒激发年轻人消费力?

随着年轻人的消费愈发理性&#xff0c;年轻人在消费时更偏向于熟人种草场景下的信任决策&#xff0c;社交媒体成为品牌吸引用户的必争之地。今天媒介盒子就来和大家聊聊&#xff1a;品牌如何通过社媒激发年轻人消费力。 一、 激发用户共鸣&#xff0c;与用户产生情感连接。 虽…

Midjourney辞典AIGC中英双语图文辞典+Midjourney提示关键词

完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077 完整内容下载&#xff1a;https://download.csdn.net/download/u010564801/89042077

哈希表(hash_table) 哈希存储 算法相关知识 稳定性 时间复杂度

哈希存储(散列存储) 为了快速定位数据 哈希表 哈希冲突 / 哈希矛盾 关键字不一样&#xff0c;但是映射之后结果一样 如何避免 哈希矛盾&#xff1f; 1、重新设计哈希函数&#xff0c;尽可能均匀散列分布在哈希表 2、开放定址法&#xff1a;向下寻找未存储的位置进行存放数…

aardio - 【库】godking.plusSkin 设置plus样式

库名&#xff1a;godking.plusSkin 库文件下载工具&#xff1a;http://chengxu.online/show.asp?softid272 使用本库&#xff0c;可以快速设置plus样式。主要针对按钮样式进行快速批量设置。 部分用法如下&#xff1a; import win.ui; /*DSG{{*/ var winform win.form(tex…

C++初学者:如何优雅地写程序

我喜欢C语言的功能强大&#xff0c;简洁&#xff0c;我也喜欢C#的语法简单&#xff0c;清晰&#xff0c;写起来又方便好用。 一、为什么不用C语言写程序。 C语言用来做题目&#xff0c;考试研究是很方便的&#xff0c;但是用来写程序做软件&#xff0c;你就会发现&#xff0c…

Android中运动事件的处理

1.目录 目录 1.目录 2.前言 3.程序演示 4.第二种程序示例 5.扩展 2.前言 触摸屏&#xff08;TouchScreen&#xff09;和滚动球&#xff08;TrackBall&#xff09;是 Android 中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球&#xff0c;主要可以通过使用运动事…

[DS]Polar靶场web(一)

静以养心&#xff0c;宽以养气。 跟着Dream ZHO大神学专升安的一天 swp 直接dirb扫出.index.php.swp的目录 function jiuzhe($xdmtql){return preg_match(/sys.*nb/is,$xdmtql);//如果包含以 "sys" 开始&#xff0c;后跟任意字符直到 "nb" 的字符串&…

[XG] HTTP

我希望风起&#xff0c;而你好像更希望风停。 闲来无事&#xff0c;跟着Z3r4y-CSDN博客大神学一学web吧 [NewStarCTF 2023]Begin of HTTP 1.题目要求使用GET方式来给ctf参数传入任意值&#xff0c;那就传吧。 2.又让以POST方式来传递secert参数&#xff0c;并且要找一下参数…

python--字符串和常见的方法

1.字符串对象 字符串 " 字符串 " """ 字符串 """ 字符串 str() #全局函数&#xff0c;将一个类型转化为字符串 len(字符串) #获取字符串长度 while 和 for 循环&#xff0c;遍历字符串 案例一&#xff1a;查看字…

ubuntu系统下如何使用vscode编译和调试#小白入门#

编程环境&#xff1a;ubuntu系统为18.04.1&#xff0c;vscode版本为1.66.2 一、VSCode切换中文显示&#xff1a; 1、vscode安装完成后启动,在左侧externsions中搜索“简体中文”插件&#xff0c;并完成安装&#xff1a; 2、选择右下角齿轮形状的"Manage"&#xff…

记·汇编语言、C语言分别写并链接

电脑是64位的&#xff0c;汇编语言是AT&T风格。风格不同的汇编语言&#xff0c;汇编时的指令是不同的。在我学习过程中带来了挺多麻烦。 C语言内容。hello.c #include <stdio.h>//声明汇编编写的函数 extern void print_hello();int main() {// 调用汇编函数print_…

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

机器学习模型——KNN

KNN的基本概念&#xff1a; KNN(K-Nearest Neighbor)就是k个最近的邻居的意思&#xff0c;即每个样本都可以用它最接近的k个邻居来代表。KNN常用来处理分类问题&#xff0c;但也可以用来处理回归问题。 核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某…

好物视频素材哪里找,下面推荐几个好用给大家

想要创作出精彩的好物视频&#xff0c;离不开优质的素材。在这里&#xff0c;我将介绍一些提供免费好物视频素材的网站&#xff0c;让你轻松找到所需素材。 首先&#xff0c;蛙学网&#xff08;https://www.waxuewang.com&#xff09;是一个提供高质量视频素材的网站&#xff…