MLPerf纪录技术分享:优化卷积合并算法提升Resnet50推理性能

作者 | 王申领

供稿 | 浪潮

MLPerf是一套衡量机器学习系统性能的权威标准,将在标准目标下训练或推理机器学习模型的时间,作为一套系统性能的测量标准。MLPerf推理任务包括图像识别(ResNet50)、医学影像分割(3D-UNet)、目标物体检测(SSD-ResNet34)、语音识别(RNN-T)、自然语言理解(BERT)以及智能推荐(DLRM)。在MLPerf V2.0推理竞赛中,浪潮AI服务器基于ImageNet数据集在离线场景中运行Resnet50,达到了449,856 samples/s的计算性能,位居第一。本文将介绍浪潮在MLPerf推理竞赛中使用的卷积合并计算算法。

Resnet是残差网络(Residual Network)的缩写,该系列网络广泛用于目标分类等领域以及作为计算机视觉任务主干经典神经网络的一部分,典型的网络有Resnet50、Resnet101等。在Resnet神经网络中,主要计算算子是卷积计算层。Resnet50神经网络具有4组残差结构,这4组残差结构包含48个卷积算子,通过设计卷积算子的计算算法,提高卷积算子的计算性能,可以减少Resnet50推理过程中的延迟。基于A100 GPU单卡的性能测试显示,在BatchSize=2048的情况下,优化后的卷积合并优化算法相比原算法可带来14.6%的性能提升。

  1. MLPerf Resnet50推理流程

在MLPerf V2.0推理测试中,Resnet50模型需要在ImageNet2012测试集上达到FP32精度(76.46%)的99%以上。数据中心赛道设置了离线(Offline)与在线(Server)两种模式,其中离线模式会产生一次推理时间大于10分钟的samples请求,可直接反映机器和算法的推理性能。

Resnet50推理流程如下。首先在ImageNet2012测试集中读取数据,并进行数据预处理,随后数据会加载到TensorRT中进行实际的推理测试。测试分为两方面,一是测试模型的精度;二是产生一次推理请求,TensorRT会将请求中的图片全部推理完成得到总时间,根据计算时间得到每秒推理的样本数量,即为最终的成绩。

 

图1 MLPerf Resnet50推理流程

2. 卷积合并计算算法

2.1 算法优化思路

在GPU上运行Resnet50图像推理模型时,需要将每一个算子(卷积、池化、全连接等)放在GPU的Kernel中进行算子计算,由于GPU上运行Kernel时共享内存以及寄存器的资源有限(A100的共享内存为164KB),不可能将所有的计算过程数据放到Kernel中,而GPU的全局内存(A100有40G或者80G全局内存)一般都很大,所以会将比较大的过程数据放在全局内存中。在进行推理时,根据Kernel的计算将数据按需从全局内存读取到Kernel中进行计算,每个算子在计算时会不可避免地产生Kernel与全局内存的数据交换,由于全局内存的读写访问延迟较大,会使算子计算性能下降。

对于每个算子的Kernel计算,会产生两部分的全局内存访问,一部分是最开始的全局内存读取,另一部分是Kernel计算完成后的全局内存写回。为了降低全局内存访问带来的性能影响,有如下两种办法:

一是采用算子合并的方式。默认的程序会将每个算子都放在单独的Kernel中进行计算,每个算子都会产生全局内存读和写两次访问。如果将两个算子放在一个Kernel中进行计算,对于连续的两个卷积计算,可以减少第一个卷积算子的写回以及第二个算子的读取;对于卷积与Shortcut的合并,可以减少一次全局内存的写回操作,通过减少全局内存的访问可以提高程序的计算性能。

二是根据GPU不同架构的计算特性对Kernel的内部计算进行合理的优化设计。当不可避免地需要对全局内存进行访问时,做到全局内存进行连续线程的融合读取,充分利用向量化读取等加速对全局内存的访问,同时优化计算流程,通过Double buffer用计算来隐藏内存的访问延迟,对于需求较晚的全局内存数据,也可以通过A100的新特性-全局内存的异步复制来隐藏数据读取过程。

本文主要针对MLPerf推理中Resnet50卷积神经网络的第二组残差结构中的部分算子进行计算合并,在充分考虑GPU计算特性前提下,进行合理的算法设计,提高Resnet50卷积神经网络的性能。

2.2 Resnet50合并计算算法

在Resnet50神经网络中,第二组残差结构有Res3.1、Res3.2、Res3.3、Res3.4,共四部分的卷积计算,其中Res3.2、Res3.3、Res3.4三部分计算结构一样,如下图所示:

 

图2 Resnet50中第二组残差结构Res3.2示意图

可以看到,Res3.1的输出(input)作为Res3.2部分的输入,输入后会有两部分分支,在右部分的分支中,会先后计算Conv1,Conv2,Conv3三个卷积,其中Conv1,Conv2两个卷积后面都包含Bn和Relu过程,Conv3后面会有Bn的计算过程;在右边分支计算完成后,会与input进行Shortcut操作,主要进行的是与输入数据Sum和Relu操作,两部分结果经过Shortcut操作后会得到Res3.2的输出完成这部分的计算。

本文介绍的合并算法对图2虚线框中的计算进行合并,主要是对Conv3以及Shortcut的过程进行合并,包含Conv3+Bn+Sum+Relu过程。

3. 卷积合并算法在GPU加速卡上的实现

Res3.2的计算参数主要如下:

Data

Weight

H

W

Ic

h

w

Ic

Oc

Conv1

28

28

512

1

1

512

128

Conv2

28

28

128

3

3

128

128

Conv3

28

28

128

1

1

128

512

通过上表可以看到,Conv3输入Data的H*W为28*28,输入通道Ic为128,输入的权重Weight的h*w为1*1,输入通道Ic为128,输出通道Oc为512;Shortcut的输入同Conv1,其中H*W为28*28,输入通道Ic为512;两部分计算合并之后的输出Output的H*W为28*28,通道Oc为512。(本文所有的算法都围绕A100 GPU进行介绍)

3.1关于dataweightoutputlayout变换

本文采用的计算数据类型为int8,因此下文介绍的所有内容都是基于int8开展的优化。

算法对data以及weight进行了提前处理以适应GPU的计算特性,主要处理如下:

对于data,原始layout为[B, H, W, Ic]=[B, 28, 28, 128],算法将Ic=128以32为单位进行拆分为4组,形成[B, 4, H, W, Ic/32]=[B, 4(I1), 28, 28, 32(I2)]的layout,这样做的目的是32个int8可以组成16B共128位数据的联合向量化读写,提高GPU中全局内存的通信速度。

对于weight,由于h*w=1*1,因此本文后续不再表示h*w,默认的weight的layout为[Ic, Oc]=[128, 512],算法将Ic以32为单位进行拆分为4组,将4放在左数第二维,将32放在左数第四维,这样做的目的也是为了程序在访问全局内存时做到16B共128位数据的联合向量化读写;算法将Oc以128为单位进行拆分为4组,将4放在左数第一维,将128放在左数第三维,这样做的目的是将Oc拆成了4组放在了不同的block中进行计算,这样在每个block进行计算的时候可以顺序的由全局内存加载weight,不会产生数据内存位置的跳跃,这部分会在后面block的划分中进行介绍,这样就形成[O1, I1, O2, I2] =[4, 4, 128, 32]的weight的layout。

对于output,原始layout为[B, H, W, Oc]=[B, 28, 28, 512],这部分数据类似于输入data,将Oc以32为单位进行拆分为16组,形成layout为[B, 16, H, W, Oc/32]=[B, 16(O1), 28, 28, 32(O2)]。

3.2关于Grid以及Block的并行划分:

对于Grid的划分,首先是x维度,由上文可知,对于Conv3的Oc为512,本文将Oc划分为4组放到Grid.x维度,每组计算的Oc为128;对于y维度,将H*W=28*28=784分为49组放到Grid.y维度,每组计算的HW为16;对于z维度,将B分为B/4组放到Grid.z维度,每组计算B的数量是4。这样经过划分,Grid的数量为[Grid.x, Grid.y, Grid.z]=[4, 49, B/4],即共有4*49*B/4组计算同时并行进行。A100 GPU上SM数量有108个,当B≥4时,一个kernel共需要启动大于4*49*4/4=196个Block,完全满足Grid维度并行度的要求。

对于Block中的划分,A100 GPU中一个SM的warp schedule为4个,因此一个block中线程数量至少大于或等于128,为了实现更好的并行度,算法选择一个Block中设置8个warp共256个线程。

3.3关于Block内部计算层次划分

 

图3 Block内部计算层析划分

由上文可知,一个Block中划分的Output的计算shape为[B, H*W, Oc]=[4, 16, 128],由于在1*1卷积计算中B维度与HW维度具有同等地位,因此将BHW合并为一个维度,此时本文用M表示BHW维度,即M=BHW=4*16=64,用N表示Oc维度,即N=Oc=128,此时一个Block中的计算维度变为[M,N]=[64, 128]。

由前述data的layout的变换可知形成[B, 4, H, W, Ic/32]=[B, 4, 28, 28, 32]的layout,由于Grid.y以及Grid.x对B维度以及HW维度进行了划分,此时一个Block中data的输入数据为[B, I1, HW, I2]=[4, 4, 16, 32],用上段所述BHW合并为1维用M表示,即M=B*HW=4*16=64,K表示I1*I2维度,即K=I1*I2=128,则此时一个Block中data的计算维度变为[M, K]=[64, 128]。

由前述weight的layout的变换可知,weight的layout为[O1, I1, O2, I2]=[4, 4, 128, 32],由于对Oc按照32为单位划分4组在Grid.x维度,因此每个Block中计算的Oc为128,此时一个Block中的weight的计算数据为[I1, O2, I2] =[4, 128, 32],用N表示O2维度,即N=O2=128,用K表示I1*I2维度,即K=I1*I2=128,则此时一个Block中weight的计算维度变为[N, K]=[128, 128]。

一个Block中实际要进行的计算就变为一个矩阵乘data[M, K]点乘weight[N, K]等于output[M, N],即[64, 128]﹒[128,128]=[64, 128],共4*49*B/4个Block并行完成所有整个卷积合并的计算,其中data的实际维度为[B, I1, HW, I2]=[4, 4, 16, 32],weight的实际维度为[I1, O, I2]=[4, 128, 32]。

经过前面的划分,一个Thread Block层次实际计算量为[64, 128]﹒[128,128]=[64, 128]。

为了加速int8矩阵乘的计算,程序采用了CUDA中mma进行加速计算,其中mma的计算形状为[m ,n ,k]=[16, 8, 32],为了配合共享内存,寄存器以及mma形状的匹配,程序将内积方向的K维度128拆分为2组64进行计算,每组64进一步拆分为2组32(k)进行计算,这样最基础的Thread Block层次进行的计算就变为图3中左上角虚线框中所示的[M, k]﹒[N, k]=[M ,N]即[64, 32]﹒[128, 32]=[64 ,128],由于一个Block中设置warp的数量为8,8个warp会对Thread Block中的计算任务进行划分,每个warp计算任务为[32, 32]﹒[32, 32]=[32, 32]的矩阵乘,经过内积方向的4次32的循环,在warp level便可以将内积方向K=128完全计算得[M, N]=[32, 32]的计算结果,则8个warp合并可得[M, N]=[64, 128]的计算结果。

如上文所述,程序将内积方向的K维度128拆分为2组64进行计算,每组64进一步拆分为2组32(k)进行计算。这么做的目的是将data以及weight的全局内存加载变成了Double buffer模式,即首先将第一组的数据由全局内存加载到共享内存,然后在利用第一组的数据进行计算前,便提交第二组数据由全局内存加载到共享内存的过程,这样可以利用第一组数据的计算过程时间来隐藏第二组数据的全局内存加载到共享内存的过程的时间,整体流程示意图如下:

 

图4 程序整体流程图

如前所述,每个warp计算任务为[32, 32]﹒[32, 32]=[32, 32]的矩阵乘,因此在warp的计算层次配合[m ,n ,k]=[16, 8, 32]的形状,需要进行row=2,col=4,共row*col=8次mma的计算才可以得到warp 层次的计算结果,在计算时配合ldmatrix的使用可以进一步提高程序的计算性能。

对于Mma层次的计算,根据mma的形状,单次计算为[m , k]﹒[n, k]=[16, 32]﹒[8, 32]=[16, 8]。

3.4 Shoutcut的合并计算

经过以上计算,每个Block程序会得到Conv3的[M, N]=[64, 128]的计算结果,由于程序对Bn+Sum+Relu进行了合并,因此需要对Res3.1输出的原始数据进行加载。根据Grid[x , y, z]的划分,可以相应的得到Shortcut的数据偏移,为了隐藏这部分数据在全局内存加载到共享内存时通信延迟,程序利用了A100 GPU异步复制(pipeline_memcpy_async)的新特性,在程序的最开始便提交了这部分数据的加载,这样可以最大程度上利用计算的时间同时进行数据的加载以隐藏Shortcut的通信延迟,如图4所示。完成数据的加载后,会以warp为单位对每一个计算结果进行Bn+Sum+Relu的操作,最后将数据由寄存器写回共享内存,再写回全局内存完成整个卷积合并算法的计算。

4. 性能提升效果

根据上文介绍的卷积合并优化算法,在TensorRT中增加了关于卷积合并算法的plugin以替代原始算法,在A100 GPU单卡进行Conv3+Bn+Sum+Relu性能测试,在BatchSize=2048的情况下,原算法的性能为123TOPS,经过优化后的卷积合并优化算法性能为141TOPS,算子相比较原算法可以带来14.6%的性能提升。通过合并Res3.2、Res3.3、Res3.4三部分Conv3+Bn+Sum+Relu算子合并,可将Resnet50推理性能提升1%-2%。同样该算法合并思路可以用到其他残差结构中,通过合理的算法设计带来整体的程序性能提升。

在MLPerf V2.0推理竞赛中,浪潮通过软件与硬件优化,基于ImageNet数据集Resnet50模型,在Offline场景中达到了449,856 samples/s的计算性能,位居第一。

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

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

相关文章

nas存储如何做远程服务器数据备份_备份数据?7 个理由告诉你为什么要用 NAS,而不用移动硬盘...

您有遇过这样的情况吗?用 U 盘或移动硬盘备份文件,但在重要时刻却找不到 U 盘,甚至遇到移动硬盘毁损的状况。这个时候是不是忽然间好恨自己,拿什么拯救你——我亲爱的数据。转而使用 NAS 的原因。让我们来看看地球上最安全的存储是…

用手机写代码:基于 Serverless 的在线编程能力探索

简介:Serverless 架构的按量付费模式,可以在保证在线编程功能性能的前提下,进一步降低成本。本文将会以阿里云函数计算为例,通过 Serverless 架构实现一个 Python 语言的在线编程功能,并对该功能进一步的优化&#xff…

如何形成统一设计风格-实践篇

简介:在上一篇《业务团队如何统一架构设计风格?》中,探讨了一种业务架构的设计规范,以期达到这些目标:用标准约束技术细节;用技术工具而非文档推行标准;持续重构而非造新轮子;重视业…

计算机教师资格考试试题,全国教师资格考试信息技术练习题(二)

中公教师通过对全国教师资格考试考情的分析,总结出全国教师资格考试《信息技术学科知识与能力》算法与程序设计部分的知识点,并提供了该模块的相关考试试题,希望能帮助考生抓住考点、有针对性地复习。一、算法与程序设计模块考点分析通过对全…

A/B测试白皮书:领先企业营收增长是落后者5倍

Forrester调查显示:企业使用A/B测试的ROI达126% 4月26日,《火山引擎A/B测试总体经济影响白皮书》正式发布。这份白皮书由市场研究公司Forrester调研撰写,揭示了A/B测试对于企业营收增长、运营成本、生产力优化等方面的重要影响。基于对多家企…

limit mongodb 聚合_MongoDB 统计 group 操作用不了,试试 mapReduce 吧

问题回顾今天,同事小张 Q 我, 说自己辛苦花了一天的时间,基于 mongodb 数据库开发的待办统计功能一直报错!于是笔者花了近半小时了解小张的开发需求以及代码实现方式,大致明白问题出在对待办 collection 做统计时&…

基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现

简介:阿里云 EMR OLAP 与 Flink 团队深度合作,支持了 Flink 到 ClickHouse 的 Exactly-Once写入来保证整个实时数仓数据的准确性。本文介绍了基于 EMR OLAP 的开源实时数仓解决方案。 作者简介:阿里云 EMR-OLAP 团队;主要负责开源…

【ClickHouse 技术系列】- 在 ClickHouse 中处理实时更新

简介:本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB级的数据规模,简单的架构,被国内外公司广泛采用。本系列技…

从“数字化出海”到“出海数字化”,亚马逊云科技如何助力出海业务数字化转型

国内市场快速发展之外,全球也是广阔的市场。 据中国贸促会《中国企业对外投资现状及意向调查报告(2021年版)》显示,我国对外直接投资流量和存量稳居全球前三。在开拓海外市场的成绩里,2021全球《财富》世界500强榜单里…

amos调节变量怎么画_插画师该怎么收费?两个方法一看就懂。

任何自由插画师都逃不过要给客户报价这么一个令人头痛的环节,包括医学插画师。甲方往往希望看到一个菜单一样的价格表,把一切类型的插画安排的明明白白。而这样简单粗暴的算法,作为乙方又何尝不想要呢!纵观插画圈,萌新…

技术实践第二期|Flutter异常捕获

简介:应用性能稳定是良好用户体验中非常关键的一环,为了更好保障应用性能稳定,异常捕获在保证线上产品稳定中扮演着至关重要的角色。我们团队在推出了U-APM移动应用性能监控的产品后,帮助开发者定位并解决掉很多线上的疑难杂症。随…

请结合计算机硬件论述指令执行的过程,【计算机组成原理】计算机软硬件组成...

文章目录分层结构软件系统硬件系统I/O设备控制器存储器运算器先上张图,对计算机的软硬件组成有个大体的认识,接下来就是掰开揉碎这张大图ψ(`∇)ψ,本文绝大多数图片均为手绘分层结构其中操作系统的重要性不言而喻,也就…

F5:API 网关、流量网关发展各异,推出NGINX企阅版提供开源软件+企业级服务

作者 | 宋慧 出品 | CSDN 云计算 全球 80%互联网流量经过的 NGINX,全球有超过 4 亿个域名使用 NGINX 为载体,NGINX 无疑是成功的开源网关产品。 近日,F5 宣布 NGINX 在社区开源版本基础之上,推出NGINX企阅版(NGINX Op…

Spring Boot Serverless 实战系列“架构篇” 首发 | 光速入门函数计算

简介:如何以 Serverless 的方式运行 Spring Boot 应用? 作者 | 西流(阿里云函数计算专家) Spring Boot 是基于 Java Spring 框架的套件,它预装了 Spring 一系列的组件,开发者只需要很少的配置即可创建独立…

实现 消息提醒图标_用了5年苹果手机都不知道,原来小汽车图标是这个意思 ! ! !...

阅读本文前,请您先点击上面的“蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都会有分享,都是免费订阅,请您放心关注。注图文来源网络,侵删 …

技术分享:从双11看实时数仓Hologres高可用设计与实践

简介:本文将会从阿里巴巴双11场景出发,分析实时数仓面临的高可用挑战以及针对性设计。 2021年阿里巴巴双11完美落下为帷幕,对消费者来说是一场购物盛宴,对背后的业务支撑技术人来说,更是一场年度大考。在这场大考中&a…

操作系统如何实现:什么是宏内核、微内核

作者 | 陆小凤来源 | 码农的荒岛求生操作系统和普通的大型应用程序项目类似,都涉及代码组织方式的问题,但操作系统的独特之处在于其核心部分必须运行在内核态,kernel model,所谓内核态严格讲是指在该状态下程序拥有对硬件(hardwar…

雷神开机logo更改_九代酷睿i9加持的性能怪兽 雷神911黑武士Ⅱ评测

随着英特尔9代酷睿CPU的到来,品牌台式机也逐渐迎来了全新的升级,各大厂商也竞相抢占台式整机市场。而对于DIY组装机来说,相对于玩家门槛和售价又相对较高。国产台式机品牌雷神也抓住了这次契机,推出了“911黑武士”的第二代“911黑…

阿里云高级技术专家周晶:基于融合与协同的边缘云原生体系实践

简介:2020年 5G 商用元年以来,各种边缘场景开始火热起来,边缘计算又重回人们视野,这次的回归还伴随着云计算的普及与通信技术的颠覆式发展。边缘云作为 5G 与中心云计算的中继节点,处于云网融合、承上启下的关键位置。…

进程调度:我太难了!

作者 | 轩辕之风O来源 | 编程技术宇宙1、任务切换现在有一块CPU,但是有两个程序都想来执行,我们需要开发一个任务调度程序。只有两个程序,so easy啦!让它们交替执行就行了。为了实现切换,我们提供一个API,这…