面向稀疏卷积神经网络的GPU性能优化方法
发布时间:2021-08-21 13:48
近些年来,深度卷积神经网络在多项任务中展现了惊人的能力,并已经被用在物体检测、自动驾驶和机器翻译等众多应用中.但这些模型往往参数规模庞大,并带来了沉重的计算负担.神经网络的模型剪枝技术能够识别并删除模型中对精度影响较小的参数,从而降低模型的参数数目和理论计算量,给模型的高效执行提供了机会.然而,剪枝后的稀疏模型却难以在GPU上实现高效执行,其性能甚至差于剪枝前的稠密模型,导致模型剪枝难以带来真正的执行性能收益.提出一种稀疏感知的代码生成方法,能够生成高效的稀疏卷积GPU程序.首先为卷积算子设计了算子模板,并结合GPU的特点对模板代码进行了多种优化.算子模板中的源代码经过编译和分析被转换为算子中间表示模板,设计了一种稀疏代码生成方法,能够结合剪枝后的稀疏参数,基于中间表示模板生成对应的稀疏卷积代码.同时,利用神经网络执行过程中的数据访问特点对数据的访问和放置进行了优化,有效提升了访存吞吐量.最后,稀疏参数的位置信息被隐式编码在生成的代码中,不需要额外的索引结构,降低了访存需求.在实验中证明了:相对于GPU上已有的稀疏神经网络执行方法,提出的稀疏感知的代码生成方法能够有效提升稀疏卷积神经网...
【文章来源】:软件学报. 2020,31(09)北大核心EICSCD
【文章页数】:21 页
【部分图文】:
稀疏感知的算子代码生成流程
为了满足大量线程执行中的访存需求,GPU设计了复杂的存储层次和访存路径,如图3所示.全局内存基于DRAM,其存储容量最大,一般在数十GB,用于存放GPU程序的输入和输出数据;但其访存延迟比较高.对全局内存的访问一般会经过高速缓存.二级高速缓存(L2 cache)由所有流多处理器共享,容量一般为数MB.一级高速缓存(L1 cache)位于流多处理器内部,由位于同一个流多处理器上的线程共享,容量一般为数十KB.最快的存储部件是寄存器.一个流多处理器一般集成了数万个32位寄存器.这些寄存器被划分给不同的线程使用.另外,流多处理器上还有两种比较特殊的存储部件:共享内存(shared memory)是一块由编程人员手工控制使用的存储空间,容量一般为数十KB,可以用于缓存程序执行中频繁访问的数据;而常量缓存(constant cache)可以用来缓存对常量内存的访问.常量内存也位于DRAM中,由编译器和驱动程序使用,一般用于保存在整个GPU程序生命周期中取值不变的数据.当常量缓存命中时,访问延迟很低.对常量内存的访问往往不经过高速缓存.常量缓存访问的另一个特点是:当一个warp内的线程访问常量内存中的相同位置时,这些线程的访问请求会被合并,并通过一次请求获得结果.2 稀疏感知的算子代码生成
尽管GPU能够提供强大的峰值计算性能,但达到峰值性能需要程序具有较高的计算访存比.访存密集型的应用很容易受到访存带宽的限制,难以实现满意的性能.我们通过roofline模型[29]分析了不同计算密度下,GPU程序的性能上限,如图6所示.横轴表示不同的计算密度,单位是操作数/字节,表示从全局内存访问的每字节数据所参与的操作数目.纵轴表示性能,使用每秒钟可执行的操作数目衡量.图中的折线表示在每个计算密度下能够达到的峰值性能.如果一个程序的计算密度在折线拐点的左侧,则该程序的峰值性能是访存受限的;如果程序位于拐点右侧,则该程序是计算受限的.我们选取了3种不同的GPU,并标注了每个GPU的峰值性能和达到峰值性能所需要的计算密度的下限.其中,Tesla K40m和Titan Xp是工作站级别的GPU,而Jetson TX2是面向终端设备的GPU.可以看到:计算能力更强的GPU,其对计算密度的要求往往也越高.我们对稀疏参数卷积的计算密度进行了分析.假设卷积参数Weight的稀疏程度(取值为0的参数在全部参数中所占的比例)为p.对于经过非结构化剪枝的稀疏参数,取值为0的元素的分布没有规律,我们认为对任意位置(k,c,r,s),其取值为0的概率P(Weightk,c,r,s=0)=p,则计算密度OI(operational intensity)可以用公式(1)表示:
【参考文献】:
期刊论文
[1]深度网络模型压缩综述[J]. 雷杰,高鑫,宋杰,王兴路,宋明黎. 软件学报. 2018(02)
本文编号:3355717
【文章来源】:软件学报. 2020,31(09)北大核心EICSCD
【文章页数】:21 页
【部分图文】:
稀疏感知的算子代码生成流程
为了满足大量线程执行中的访存需求,GPU设计了复杂的存储层次和访存路径,如图3所示.全局内存基于DRAM,其存储容量最大,一般在数十GB,用于存放GPU程序的输入和输出数据;但其访存延迟比较高.对全局内存的访问一般会经过高速缓存.二级高速缓存(L2 cache)由所有流多处理器共享,容量一般为数MB.一级高速缓存(L1 cache)位于流多处理器内部,由位于同一个流多处理器上的线程共享,容量一般为数十KB.最快的存储部件是寄存器.一个流多处理器一般集成了数万个32位寄存器.这些寄存器被划分给不同的线程使用.另外,流多处理器上还有两种比较特殊的存储部件:共享内存(shared memory)是一块由编程人员手工控制使用的存储空间,容量一般为数十KB,可以用于缓存程序执行中频繁访问的数据;而常量缓存(constant cache)可以用来缓存对常量内存的访问.常量内存也位于DRAM中,由编译器和驱动程序使用,一般用于保存在整个GPU程序生命周期中取值不变的数据.当常量缓存命中时,访问延迟很低.对常量内存的访问往往不经过高速缓存.常量缓存访问的另一个特点是:当一个warp内的线程访问常量内存中的相同位置时,这些线程的访问请求会被合并,并通过一次请求获得结果.2 稀疏感知的算子代码生成
尽管GPU能够提供强大的峰值计算性能,但达到峰值性能需要程序具有较高的计算访存比.访存密集型的应用很容易受到访存带宽的限制,难以实现满意的性能.我们通过roofline模型[29]分析了不同计算密度下,GPU程序的性能上限,如图6所示.横轴表示不同的计算密度,单位是操作数/字节,表示从全局内存访问的每字节数据所参与的操作数目.纵轴表示性能,使用每秒钟可执行的操作数目衡量.图中的折线表示在每个计算密度下能够达到的峰值性能.如果一个程序的计算密度在折线拐点的左侧,则该程序的峰值性能是访存受限的;如果程序位于拐点右侧,则该程序是计算受限的.我们选取了3种不同的GPU,并标注了每个GPU的峰值性能和达到峰值性能所需要的计算密度的下限.其中,Tesla K40m和Titan Xp是工作站级别的GPU,而Jetson TX2是面向终端设备的GPU.可以看到:计算能力更强的GPU,其对计算密度的要求往往也越高.我们对稀疏参数卷积的计算密度进行了分析.假设卷积参数Weight的稀疏程度(取值为0的参数在全部参数中所占的比例)为p.对于经过非结构化剪枝的稀疏参数,取值为0的元素的分布没有规律,我们认为对任意位置(k,c,r,s),其取值为0的概率P(Weightk,c,r,s=0)=p,则计算密度OI(operational intensity)可以用公式(1)表示:
【参考文献】:
期刊论文
[1]深度网络模型压缩综述[J]. 雷杰,高鑫,宋杰,王兴路,宋明黎. 软件学报. 2018(02)
本文编号:3355717
本文链接:https://www.wllwen.com/kejilunwen/jisuanjikexuelunwen/3355717.html