0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何测量各种工作负载和GPU配置下收缩操作的性能

星星科技指导员 来源:NVIDIA 作者:Markus Hoehnerbach 2022-04-20 10:46 次阅读

张量收缩是机器学习、计算化学和量子计算中许多重要工作的核心。随着科学家和工程师们对不断增长的问题的研究,基础数据变得越来越大,计算时间也越来越长。

当张量收缩不再适合单个 GPU 时,或者如果在单个 GPU 上花费的时间太长,自然下一步是将收缩分布到多个 GPU 上。我们一直在用这个新功能扩展 cuTENSOR ,并将其作为一个名为 cuTENSORMg (多 GPU )的新库发布。它在块循环分布张量上提供单进程多 GPU 功能。

cuTENSORMg 的copy和contraction操作大致分为句柄、张量描述符和描述符。在这篇文章中,我们将解释句柄和张量描述符,以及复制操作是如何工作的,并演示如何执行张量收缩。然后,我们将展示如何测量各种工作负载和 GPU 配置下收缩操作的性能。

库把手

库句柄表示参与计算的设备集。句柄还包含跨调用重用的数据和资源。通过将设备列表传递给cutensorMgCreate函数,可以创建库句柄:

cutensorMgCreate(&handle, numDevices, devices);

cuTENSORMg 中的所有对象都是堆分配的。因此,必须通过匹配的destroy调用释放它们。为了简洁起见,我们在这篇文章中没有展示这些,但是生产代码应该销毁它创建的所有对象,以避免泄漏。

cutensorMgDestroy(handle);

所有库调用都返回cutensorStatus_t类型的错误代码。在生产中,您应该始终检查错误代码,以便尽早检测故障或使用问题。为了简洁起见,我们在本文中省略了这些检查,但它们包含在相应的示例代码中。

除了错误代码, cuTENSORMg 还提供与 cuTENSOR 类似的日志记录功能 。可以通过适当设置CUTENSORMG_LOG_LEVEL环境变量来激活这些日志。例如,CUTENSORMG_LOG_LEVEL=1将为您提供有关返回的错误代码的附加信息

张量描述符

张量描述符描述了张量在内存中的布局以及在设备中的分布。对于每种模式,有三个核心概念来确定布局:

extent:每个模式的逻辑大小。

blockSize:将extent细分为大小相等的块,但最后的剩余块除外。

deviceCount:确定块在设备上的分布方式。

图 1 显示了extent和block size如何细分二维张量。

A 3x3 square showing block size vs extent. Block size accounts for a 1x1 block whereas extent is a large square layered on top of several blocks but does not exceed the full parameter of the 3x3 square.

图 1 带有范围和块的张量数据布局。绿色表示二维张量,蓝色表示块大小导致的块。

A 3x3 square showing deviceCount [0] on the Y axis and deviceCount[1] on the X axis.

图 2 以块循环方式在设备上分布块张量;不同的颜色代表不同的设备。

块以循环方式分布,这意味着连续的块被分配给不同的设备。图 2 显示了块到设备的逐块分布,将设备分配到使用另一个数组devices编码的块。该阵列是一个密集的柱状主张量,其范围与设备计数类似。

A 4x4 block with Y axis as blockStride[0] and X axis blockStride[1]. This block is comprised of smaller by 4x4 blocks with elementStride[1] as the X axis and and elementStride[0] as the Y axis.

图 3 使用元素步距和块步距的设备上数据布局。

最后,设备上的确切数据布局由每种模式的elementStride和blockStride 值决定。它们分别以元素为单位在线性存储器中确定给定模式下两个相邻元素和相邻块的位移(图 3 )。

这些属性都是使用cutensorMgCreateTensorDescriptor调用设置的:

cutensorMgCreateTensorDescriptor(handle, &desc, numModes, extent, elementStride, blockSize, blockStride, deviceCount, numDevices, devices, type);

可以将NULL传递给elementStride、blockSize、blockStride和deviceCount。

如果elementStride是NULL,则使用通用列主布局假定数据布局密集。如果blockSize是NULL,则等于extent。如果blockStride是NULL,则它等于blockSize * elementStride,这将产生交错块格式。如果deviceCount为NULL,则所有设备计数都设置为 1 。在这种情况下,张量是分布式的,完全驻留在devices[0]的内存中。

通过将CUTENSOR_MG_DEVICE_HOST作为所属设备传递,可以指定 tensor 位于主机上的固定、托管或定期分配的内存中。

复制操作

copy操作可以更改数据布局,包括将张量重新分配到不同的设备。其参数是源和目标张量描述符(descSrc和descDst),以及源和目标模式列表(modesSrc和modesDst)。这两个张量在重合模式下的范围必须匹配,但它们的其他方面可能不同。一个可能位于主机上,另一个跨设备,它们可能具有不同的阻塞和步幅。

与 cuTENSORMg 中的所有操作一样,它分三步进行:

cutensorMgCopyDescriptor_t:编码应该执行的操作。

cutensorMgCopyPlan_t:编码操作的执行方式。

cutensorMgCopy:根据计划执行操作。

第一步是创建复制描述符:

cutensorMgCreateCopyDescriptor(handle, &desc, descDst, modesDst, descSrc, modesSrc);

有了拷贝描述符,您可以查询所需的设备端和主机端工作空间的数量。deviceWorkspaceSize阵列的元素数量与手柄中的设备数量相同。i-th 元素是句柄中i-th 设备所需的工作空间量。

cutensorMgCopyGetWorkspace(handle, desc, deviceWorkspaceSize, &hostWorkspaceSize);

确定工作空间大小后,规划副本。你可以传递一个更大的工作空间大小,呼叫可能会利用更多的工作空间,或者你可以尝试传递一个更小的大小。规划可能能够适应这一点,否则可能会产生错误。

cutensorMgCreateCopyPlan(handle, &plan, desc, deviceWorkspaceSize, hostWorkspaceSize

最后,计划完成后,执行copy操作。

cutensorMgCopy(handle, plan, ptrDst, ptrSrc, deviceWorkspace, hostWorkspace, streams);

在这个调用中,ptrDstptrSrc是指针数组。它们包含对应的张量描述符中每个设备的一个指针。在本例中,ptrDst[0]对应于作为devices[0]传递给cutensorMgCreateTensorDescriptor的设备。

另一方面,deviceWorkspacestreams也是数组,其中每个条目对应一个设备。它们是根据库句柄中设备的顺序排序的,例如deviceWorkspace[0]streams[0]对应于在devices[0]传递给cutensorMgCreate的设备。工作空间必须至少与传递给cutensorMgCreateCopyPlan的工作空间大小相同。

收缩手术

cuTENSORMg 库的核心是contraction操作。它目前实现了一个或多个设备上张量的张量收缩,但将来可能支持主机上的张量。作为复习,收缩是以下形式的操作:

D_{M,N,L} \leftarrow \alpha \sum_{K} A_{K,M,L} \cdot B_{K,N,L} + \beta C_{M,N,L^{3}}

其中ABCD是张量,MNLK是可以任意排列和交错的模式列表。

copy操作一样,它分三个阶段进行:

  • cutensorMgCreateContractionDescriptor:对问题进行编码。
  • cutensorMgCreateContractionPlan:对实现进行编码。
  • cutensorMgContraction:使用计划并执行实际收缩。

首先,根据张量描述符、模式列表和所需的计算类型(例如计算期间可能使用的最低精度数据)创建收缩描述符。

cutensorMgCreateContractionDescriptor(handle, &desc, descA, modesA, descB, modesB, descC, modesC, descD, modesD, compute);

由于收缩操作有更多的自由度,您还必须初始化find对象,以便更好地控制给定问题描述符的计划创建。目前,这个find对象只有一个默认设置:

cutensorMgCreateContractionFind(handle, &find, CUTENSORMG_ALGO_DEFAULT);

然后,您可以按照为copy操作所做的操作来查询工作空间需求。与该操作相比,您还传入了findworkspace首选项:

cutensorMgContractionGetWorkspace(handle, desc, find, CUTENSOR_WORKSPACE_RECOMMENDED, deviceWorkspaceSize, &hostWorkspaceSize);

创建一个计划:

cutensorMgCreateContractionPlan(handle, &plan, desc, find, deviceWorkspaceSize, hostWorkspaceSize);

最后,使用计划执行收缩:

cutensorMgContraction(handle, plan, alpha, ptrA, ptrB, beta, ptrC, ptrD, deviceWorkspace, hostWorkspace, streams);

在这个调用中, alpha 和 beta 是与D张量类型相同的主机指针,除非D张量是半精度或BFloat16精度,在这种情况下是single precision。不同数组ptrAptrBptrCptrD中指针的顺序对应于它们在描述符devices数组中的顺序。deviceWorkspacestreams数组中指针的顺序与库句柄的devices数组中的顺序相对应。

表演

你可以在CUDA 库样本GitHub 回购。我们将其扩展为两个参数: GPU 的数量和比例因子。您可以随意尝试其他收缩、块大小和缩放模式。它是以这样一种方式编写的,即在保持 K 不变的情况下,将 M 和 N 放大。它实现了形状的几乎 GEMM 形状的张量收缩:

C_{M^{0}N^{0}M^{1}N^{1}M^{2}N^{2}} \leftarrow A_{M^{0}K^{0}M^{1}K^{1}M^{2}K^{2} B_K^{0}N^{0}K^{1}N^{1}K^{2}N^{2}}

M1和N1按比例放大,这些尺寸中的块大小保持负载大致平衡。下图显示了在 DGX A100 上测量时的比例关系。

关于作者

Markus Hoehnerbach 是 cuTENSOR 和 cuTENSORMg 的高级软件工程师。他拥有 RWTH 亚琛大学计算机科学博士学位。他感兴趣的领域是结构化和非结构化张量的高性能计算及其在机器学习和计算科学中的应用。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4795

    浏览量

    129500
  • 机器学习
    +关注

    关注

    66

    文章

    8453

    浏览量

    133165
收藏 人收藏

    评论

    相关推荐

    光伏逆变器负载何进行负载测试和性能评估?

    :在超过额定负载的条件,对光伏逆变器的输出电压、电流、功率因数等参数进行测量和记录,检查其是否能够正常工作,以及长时间过载时的性能稳定性。
    发表于 12-12 09:44

    不同负载特性对电源滤波器性能有什么影响?

    电源滤波器在电子系统中至关重要,负载变化影响其性能,包括输出电压电流波动、滤波效果及稳定性。需根据负载特性选滤波器类型并优化,采用多种测试方法评估性能,确保在
    的头像 发表于 12-10 16:24 249次阅读
    不同<b class='flag-5'>负载</b>特性对电源滤波器<b class='flag-5'>性能</b>有什么影响?

    深度学习工作负载GPU与LPU的主要差异

    ,一个新的竞争力量——LPU(Language Processing Unit,语言处理单元)已悄然登场,LPU专注于解决自然语言处理(NLP)任务中的顺序性问题,是构建AI应用不可或缺的一环。 本文旨在探讨深度学习工作负载GPU
    的头像 发表于 12-09 11:01 2407次阅读
    深度学习<b class='flag-5'>工作</b><b class='flag-5'>负载</b>中<b class='flag-5'>GPU</b>与LPU的主要差异

    燃料电池测试负载工作原理是什么?

    可以是纯电阻负载,也可以是包含电容、电感等元件的复杂负载负载的大小和性质可以根据实际需求进行调整。 监测燃料电池性能:在测试负载的作用
    发表于 12-06 16:31

    多通道负载测试和性能评估?

    多通道负载测试和性能评估是软件质量保证的重要组成部分,它们可以帮助我们发现和解决系统的性能瓶颈,提高系统的可用性和稳定性。 多通道负载测试是一种模拟多个用户同时访问系统的方法,以检查系
    发表于 11-11 16:44

    nginx负载均衡配置介绍

    目录 nginx负载均衡 nginx负载均衡介绍 反向代理与负载均衡 nginx负载均衡配置 Keepalived高可用nginx
    的头像 发表于 11-10 13:39 330次阅读
    nginx<b class='flag-5'>负载</b>均衡<b class='flag-5'>配置</b>介绍

    程控水冷阻性负载主要工作方式有哪些

    程控水冷阻性负载是一种模拟电力系统负载的设备,主要用于测试电力设备的性能和稳定性。其主要工作方式有以下几种: 恒流工作模式:在恒流
    发表于 11-05 11:25

    常见GPU问题及解决方法

    各种问题。以下是一些常见的GPU问题及其解决方法: GPU驱动程序过时或不兼容 问题描述:GPU驱动程序是GPU
    的头像 发表于 10-27 14:12 2100次阅读

    如何提高GPU性能

    在当今这个视觉至上的时代,GPU(图形处理单元)的性能对于游戏玩家、图形设计师、视频编辑者以及任何需要进行高强度图形处理的用户来说至关重要。GPU不仅是游戏和多媒体应用的心脏,它还在科学计算、深度
    的头像 发表于 10-27 11:21 1099次阅读

    GPU性能服务器配置

    GPU性能服务器作为提升计算速度和效率的关键设备,在各大应用场景中发挥着越来越重要的作用。在此,petacloud.ai小编为你介绍GPU性能服务器的
    的头像 发表于 10-21 10:42 335次阅读

    交流负载箱的特点和优势有哪些?

    仅可以节省能源成本,还可以降低设备的维护和更换成本。 提高工作效率:交流负载箱可以快速地模拟各种负载,使得电力设备的性能测试和验证
    发表于 09-02 13:53

    借助NVIDIA Aerial CUDA增强5G/6G的DU性能工作负载整合

    Aerial CUDA 加速无线接入网 (RAN)可加速电信工作负载,使用 CPU、GPU 和 DPU 在云原生加速计算平台上提供更高水平的频谱效率 (SE)。
    的头像 发表于 05-24 11:10 697次阅读
    借助NVIDIA Aerial CUDA增强5G/6G的DU<b class='flag-5'>性能</b>和<b class='flag-5'>工作</b><b class='flag-5'>负载</b>整合

    BOPP烟膜热收缩性能检测方法

    挤技术,以确保薄膜具有优化的性能组合。测试BOPP烟膜的热收缩性能至关重要,BOPP烟膜的热收缩性能直接影响烟盒的成型和密封效果。如果热
    的头像 发表于 05-11 16:29 496次阅读
    BOPP烟膜热<b class='flag-5'>收缩</b><b class='flag-5'>性能</b>检测方法

    电机负载测试设备

    电机负载测试设备是现代工业生产中不可或缺的一种设备。它的主要作用是对电机进行负载测试,以确保电机在各种工作条件下性能稳定可靠。本文将详细介
    的头像 发表于 03-20 15:51 1224次阅读
    电机<b class='flag-5'>负载</b>测试设备

    CC工作模式电子负载运用

    电子负载是测试电源、电池和其他电子设备性能的设备。在真实世界负载的模拟条件。CC工作模式是电子负载
    的头像 发表于 03-04 16:21 1300次阅读
    CC<b class='flag-5'>工作</b>模式<b class='flag-5'>下</b>电子<b class='flag-5'>负载</b>运用