北京短视频代运营,北京抖音广告片,北京抖音代运营公司欢迎您 ! 联系朗创|收藏本站|网站地图

朗创seo公司

北京专业抖音代运营广告片拍摄10年短视频运营经验!

咨询电话:13683819778

北京seo服务首选朗创网络营销
您的位置: 资讯中心 > 行业资讯 >

如何利用TVM优化深度学习GPU OP教你使用几十行Python代码来实现2

作者: 1 来源:朗创seo公司 发布日期: 2018-08-21 19:23:00
信息摘要:
几天前,谭天启的团队宣布了TVM的推出,在微博上说:今天我们发布TVM,它与NNVM一起,形成了一个完整的优化工具链,用于深入学习各种硬件,支持移动电话、CUDA、OpenCL、金属、Java
几天前,谭天启的团队宣布了TVM的推出,在微博上说:今天我们发布TVM,它与NNVM一起,形成了一个完整的优化工具链,用于深入学习各种硬件,支持移动电话、CUDA、OpenCL、金属、JavaScript和其他各种工具。有兴趣参与深入学习、编译原理、高性能计算和硬件加速的学生,欢迎加入DMLC驱动来领导开源项目社区。

根据雷锋的AI技术评论,大多数现有系统被优化为服务器级GPU的窄范围,并且需要在系统上部署大量工作,包括移动电话、IOT设备和专用加速器。TVM是端到端IR(中间表示)STAC。K将深入的学习负载部署到硬件。换句话说,这样的解决方案可以将深入的学习模型分发到各种硬件设备以进行端到端的调整。

在TVM的帮助下,开发人员可以很容易地在手机、嵌入式设备甚至浏览器上进行深入的学习任务,而很少有额外的工作。TVM还提供了一个统一的优化框架,用于在多个硬件平台上深入学习工作负载,包括专用加速器T。依赖新的计算原语。

今天,陈天启在他的微博上发布了新的发展,以Tucson未来的胡宇玮教程为重点,推动TVM的深入学习OP优化。

深入学习OP优化是一个非常重要但很难的问题。胡宇玮,来自Tucson的未来,写了一篇关于如何使用TVM来优化GPU OP进行深入学习的教程,使用几十行Python代码来实现现有TF的两到三倍的改进。

本文还更新到TVM博客,雷锋(众:雷锋)AI科技评论首次做报道和报道。

胡宇玮,航空航天大学电子工程硕士,目前有一年的差距,现在Tucson正在与HPC团队进行合作。本文题目是用TVM优化深度学习GPU运算符:一个深度卷积的例子。

高效的深度学习算子是深度学习系统的核心,通常这些算子难以优化,需要HPC专家进行大量的努力。TVM作为端到端张量IR/DSL栈,可以使整个过程更加简单。

本文提供了一个很好的参考,教给开发者如何在TVM的帮助下编写一个高性能GPU运算符内核,团队使用了深度卷积(Topi)。神经网络。作为一个例子,演示了如何在手动优化的TysFooRoad中改进CUDA内核。

根据本文的描述,TVM的更终版本比TF1.2中的优化内核在不同的工作负载下快2-4倍,并且操作符融合的速度是3-7倍的速度。下面是GTX1080下的测试结果,滤波器大小=1, 256, 3,3 },步长=1, 1 },填充=相同:

深度卷积是一种基本的思想,可以有效地降低深度神经网络的计算复杂度,包括谷歌的XCEPT和MPLANENET,它们属于深度卷积。

填充阶段填充的输入= TVM。计算(批处理,iNi通道,Health-PixPad,WiththRelixPad),lambda b,c,i,j:tvm。选择(TVM)。所有(i=PADTUTHOP,I PADOUTRON IN高度,J=PADYEL左,J-PADYIN宽度),输入{B,C,i-PADPUTHOP,J-PADY-Leave},TVM。(0.0)Eththconv阶段DI= TVM。还原轴((0,滤波器高度),名称=di)dj=tvm。减速轴((0,滤波器宽度),名称=DJ)输出=TVM。计算(批处理、OutuChank、OutoSub高度、OutSub宽度)、lambda b、c、i、j:tvm。和(填充的输入{b,c/cx乘法器,i*SistIddii,j*DEWW+dj}*过滤器{CStRi}} L乘法器,C%Chhanelx乘法器,迪村,dj},轴= {dii,dj},name=DeStWistCuv2.2D)

在文章中,胡宇玮提到了优化CUDA代码时应注意的三个主要问题,即数据重用、共享内存和银行冲突。

在现代计算体系结构中,从内存中加载数据的代价远高于单浮点计算的成本,因此,我们希望在加载到寄存器或缓存之后,可以再次使用输入数据。

在深度卷积中有两种形式的数据重用:滤波器重用和输入重用,前者是在输入信道被滑动并多次计算时发生的,后者是在发生铺路时发生的。以3x3深度卷积为例:

在瓦片的情况下,每个线程计算1个输出元素并加载3x3输入数据。16个线程共享总共9x16个负载。

在平铺的情况下,每个线程计算2x2输出元素并加载4x4输入数据。4个线程共享总共16x4个负载。

共享内存可以看作是GPU中的一个缓存,它在片上很快。通常,数据从全局内存加载到共享内存中,块中的所有线程从共享内存中读取数据。

为了避免访问冲突,连续线程更好地访问连续内存地址,如下所示(每个颜色代表共享内存库):

一种简单的方法是CUDA块处理输入通道和相应的滤波器,这些滤波器被加载到共享存储器中,然后计算:

如果信道尺寸为21×21或32×32,性能良好,但如果为64×64,则性能将大大降低,如果进行了一些修改,则效果将大大提高。

我们如何调整NuthTuthRead y和NuthTuxRexx的两个参数以获得更佳的解决方案在筛选器={ 256, 1, 3,3 }和步长={ 1, 1 }以下:

NuthTyRead和NothTyRexLx的更佳组合需要高效的共享内存访问(避免内存冲突)、数据重用和本地内存读取之间的平衡。

通过强搜索,我们可以将NuthTythRead y和NuthTyRead x作为参数传递到TVM中的调度函数,并尝试所有可能的组合来找到更佳组合。

在滤波器=256, 1, 3,3 },步长=1, 1 },BulkGuangH=32,BulkGuangWw=32的情况下,结果如下:

CASE 2比CASE 1快,因为在2 NothTythRead x=8和NoMyVTHeRead x=4时,保证连续线程郑州网站优化访问连续的存储器地址,从而避免访问冲突,如下所示(每个颜色代表线程的工作量):

算子融合是一种典型的深度学习网络优化方法。考虑到TVM中的原始模式DePthWiste2Vald2+ SaleSySHIFT + Relu,可以进行以下修改:

输入/*输入={ 1, 1, 1,32, 32 },筛选器={ 1, 1, 3,3 },筛选器=过滤器={1, 1, 3,3 },步长={1, 1 },填充=相同*/产生Relu {{///TAF}{TrimeVar(BultKix)。B.B.y对流对流} ththRead范围=1 ///Trace{DeStWiste2D} SturgEyFulasyScist=本地分配2{ 32×1×1×1×1×4×4 }}} //产生Relu {//////TAF}{TyrIyAv{{TyrIdVar(BulkQix.)}。同时,研究二者之间的关系是必要的。} TraceRead=1 //Trace{TraceVaR(StudiaDX)。y,范围(min=0,范围=8),SudiDaX。y)} thRead范围=8 //Trace{TyrIdVar(StudiaDX)。x,范围(min=0,深度=8),3Addixx。对于(Di,0, 3){(i,0, 3){(i,0, 0, 3){(dj,0, 3){{DethWisteV2.2}{}((i×4)+j)}= =(DethWistCeV2.2{((i*4)+j)}}+ +(TvMiFithNethOrthor(和(和)(和(和(和)(1-Di)))-i)否则,(和)x)} TraceRead=8产生TWISE2D {{(i,0, 4){ } }X* 8+SuxAddixx.x* 8)+ Hedix+Suxdix。4±Studii)* 2(((i(4)))+j)(} } } +TV(1-dj)j=SuxAddix。(x×4)((三)J)J(J)J,输入{上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、上、中、文之间。(x*4))((3)3-D.内部的。内层,0, 4){Relu{{,(和)()(BulkQix.)Y+BLUCKI(DX x)* 8)+ SuxAddix.y(*)32)+ Sudidixx(x)* 4)+I2。内部的。内* 32)+I3。内部的。内部的。内)}=max((2)。内部的。内* 4)+I3。内部的。内部的。内部的。内)} * { 0 } +移位{ 0 },0×000000 f)}}}}}}

如您所见,每个线程在将DethWisteYVAUD2D的结果写入全局存储器之前计算SeaveSHIFT和Relu。该融合操作符与单个DeStWiWeSeVu2DD的速度一样快。以下是输入=1, 256, 96、96 }、滤波器=256, 1, 3、3 }、步长=1, 1 }和填充=相同的结果:

咨询热线

13683819778