大家好,欢迎来到IT知识分享网。
目录
引用的文献:
TASO: Optimizing Deep Learning Computation with Automatic Generation of Graph Substitutions
TASO是什么?
TASO主要是针对计算图结构的优化。并且这个结构的优化不是基于规则,而是让机器自动化找出所有可能的图替换策略。在最优执行图结构的搜索中,采用基于代价估计(cost-based)的方式。
DNN通常被表示为计算图。为了提升计算图的性能,大多数优化手段都是通过匹配已有计算图中的特定模式,并且替换特定的子图来达成。已有的图替换主要是纯手动或者半自动的方式执行。TASO的动机来源于三个方面:1)手动图替换的优化方式需要应对不断产生的新算子,这些新算子和已有的算子组合产生的子图模式是以几何倍次增长的,可维护性差;2)已有的工作不考虑将子图优化(图结构变换)和数据布局优化(数据在不同层次内存的放置)分开考虑,但是优势最优的数据布局和子图的结构本身是有关系的,所以应该将二者合起来考虑;3)在已有的DNN框架中还未引入形式化验证手段来保证转化前和转化后的计算图的语义是相同的(在传统编译器中,这个方面已经做得很成熟)。
为了解决以上问题,TASO做了三件事情:1)自动产生图替换策略,用户只需要定义算子(图节点);2)用形式化验证的手段来图替换的正确性;3)将数据布局和图替换合起来考虑,进一步挖掘性能潜力。
图替换策略的自动生成
根据已有算子组合出(一定大小范围内)的各种子图的可能,并且找出潜在的等价的子图。等价子图的寻找方法主要是通过特定数据集的单元测试,TASO将单元测试结果的哈希值相同的子图作为潜在的“等价子图”。比如说下图,根据输出X的哈希值,可以判断出两个子图是潜在等价的:
为了增加优化的可能,TASO引入了两个算子:split,用来将一个矩阵切成两个矩阵;concat,用来将两个矩阵合并为一个矩阵。这样子以利于进行类似于算子合并这样的优化,比如下面的例子合并了两个矩阵乘法操作:
这种子图之间的等效是无视输入矩阵的形状(子图的等价代表子图在任何形状的输入矩阵的前提下,输出都是相同),但是一般会把算子的参数纳入考虑(比如split的切分点和concat的连接点,在特定的算子参数下子图才能等价)。但是如果将输出点和连接点的所有可能都纳入考虑,搜索空间也太大了。一般来讲一个切分往往对应着一个连接,反之亦然,并且切分和连接的位置往往对应。所以引入“切分树”来记录之前是怎么切分的,这样在之后只有可能在一个对应位置连接才能保证语义的等价性,反之亦然。下图反应了如何通过合并输入数据来合并矩阵乘法、记录合并点、并且最后在对应位置拆分三个过程(灰框中是连接点):
整个的搜索过程采用类似深度优先搜索的方式,从一个节点(算子)的输出开始,在限定的节点数量的范围内,不断地在已有图的不同输出位置上长出新的节点(算子),总而产生新的子图结构。然后单元测试、记录输出的哈希、比对不同子图哈希值。值得注意的卷积的padding和relu都会在输出中引入大量的0,从而造成输出相同、语义相同的误判(只是单纯喜欢产生0而已),需要特别处理。
TASO只使用了一个测试用例来进行单元测试,因为DNN类型的应用都是计算密集并且没有分支的特点,所以即便只用一个测试用例,也完全没有误判。
验证自动生成的图替换策略的正确性
(未完待续)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/156274.html