首页 > 其他分享 >转载:【AI系统】代数简化

转载:【AI系统】代数简化

时间:2024-12-12 14:22:16浏览次数:3  
标签:化简 diamond 运算 AI 代数 结合律 算子 转载 rightarrow

代数简化(Algebraic Reduced)是一种从数学上来指导我们优化计算图的方法。其目的是利用交换率、结合律等规律调整图中算子的执行顺序,或者删除不必要的算子,以提高图整体的计算效率。

代数化简可以通过子图替换的方式完成,具体实现:1)可以先抽象出一套通用的子图替换框架,再对各规则实例化。2)可以针对每一个具体的规则实现专门的优化逻辑。下面我们将介绍三种不同的代数简化方案。

算术简化

顾名思义,算术化简就是通过利用代数之间算术运算法则,在计算图中可以确定优化的运算符执行顺序,从而用新的运算符替换原有复杂的运算符组合。我们给出结合律,分配律,交换律的例子。

结合律

非正式的讲,结合律是说: 不论我们怎样结合数字(即先计算那些数字),答案都是一样的。即:

\[(a+b)+c = a+(b+c) \]

形式化的讲,令 \(*\) 是非空集合 \(S\) 上的二元运算,如果 \(\forall x,y,z\in S\),都有

\[(x*y)*z = x*(y*z) \]

则称运算 \(*\) 在 \(S\) 上是可结合的,或者说运算 \(*\) 在 \(S\) 上满足结合律

根据这样的思想,我们可以发现以下的规则符合结合律,令 \(A,B,C\) 是张量集合 \(\Gamma\) 的元素,即 \(A,B,C\in \Gamma\),则有

\[(A\star B)^{-1}\diamond ((A\star B)C)^{-1} \rightarrow(A\star B)^{-2}\diamond C \]

其中 \(\star\) 是卷积 Conv,\(\diamond\) 是矩阵乘法 Mul;形式上讲,我们称上述公式为在张量集合 \(\Gamma\) 上的二元运算 \(\star\)、\(\diamond\) 满足结合律。

有了这样的规则,便可以指导我们进行实例的优化,例如下面的实例算子,令 \(A,B,C\) 为具体的张量,其他算子均为图示,优化规则如上所述:

image

根据上述结合律规则,我们可以把 A 与 B 的卷积给抽离出来,讲红色方框部分做简化,这样我们就减少运算算子,也减少了运算开销。

当然还有许多符合结合律的化简,我们列几个在下方供读者参考。

\[Recip(A) \diamond Recipe(A \diamond B) \rightarrow Square(Recip(A)) \diamond B \\ (A \diamond \sqrt B) \diamond (\sqrt B \diamond C) \rightarrow A \diamond B \diamond C \\ (A \diamond ReduceSum(B)) \diamond (ReduceSum(B) \diamond C) \rightarrow A Square(ReduceSum(B)) \diamond C \]

交换律

交换律是说:我们可以把数的位置对换而答案不变,即:

\[a+b = b+c \\ a*b = b*a \\ \]

形式化的讲,令 \(*\) 是非空集合 \(S\) 上的二元运算,如果 \(\forall x,y\in S\),都有

\[x*y= y*x \]

则称运算 \(*\) 在 \(S\) 上是可交换的,或者说运算 \(*\) 在 \(S\) 上满足交换律

根据这样简洁优美的思想,我们可以发现以下的规则符合结合律:

\[ReduceSum(BitShift(A)) \rightarrow BitShift(ReduceSum(A)) \]

根据这样的规则我们可以看到如下实例的优化:

image

如图所示,A 是一个张量,相比较先位移再 ReduceSum 的操作顺序,我们可以根据结合律,先 ReduceSum,得到一个维度更小的 batch,再进行 BitShift,显然运算的开销减少了。

当然还有许多符合交换律的化简,我们列几个在下方供读者参考。

\[ReduceProd(Exp(A)) \rightarrow Exp(ReduceSum(A)) \]

分配律

分配律简化,即

\[a*(b+c) = (a*c)+(a*b) \]

形式化的讲,令 \(*\) 和 \(\circ\) 是非空集合 \(S\) 上的二元运算,如果 \(\forall x,y,z\in S\),

\[x*(y\circ z) = (x*y)\circ (x*z) \\ (y\circ z)*x = (y*x)\circ (z*x) \]

则称运算 \(*\) 对 \(\circ\) 在 \(S\) 上是可分配的,或者说运算 \(*\) 对 \(\circ\) 在 \(S\) 上满足分配律

这个公式从右往左的过程也可以称为提取公因式。根据上述思想,我们可以发现以下的规则符合分配律:

\[(A\cdot B)\star C + (A\cdot B)\star D \rightarrow (A\cdot B)\star (C+D) \]

根据这样的规则我们可以看到如下实例的优化:

image

我们会发现,\(A\cdot B\) 之后与 \(C,D\) 分别做乘法操作时没有必要的,于是可以提取公因式,将 \(C,D\) 单独加和再做乘法,将 4 次算子操作降低为 3 次操作,减少了运算开销。

当然还有许多符合分配律的化简,我们列几个在下方供读者参考。

\[A+A\diamond B \rightarrow A \diamond (B+1) \\ Square(A+B)-(A+B)\diamond C \rightarrow (A+B)\diamond(A+B-C) \]

注:当我们做代数简化时,一定要先注意到算子是否符合例如交换律,结合律等规则,例如矩阵乘法中 \(AB \neq BA\)。

最后,我们向大家推荐一篇关于算术简化规则的文章:

DNNFusion: accelerating deep neural networks execution with advanced operator fusion.

其中还包括更多复杂的简化规则供读者参考。

image

运行简化

运算简化,是减少运算或执行时,冗余的算子或者算子对;我们给出两种规则来解释。

  • 逆函数等于其自身函数的对合算子化简:

    \[f(f(x)) = x \\ f(x) = f^{-1}(x) \]

    例如取反操作:\(-(-x) = x\),倒数,逻辑非,矩阵转置(以及你键盘中英文切换,当你快速按下两次切换的时候,你会发现什么都没有发生,当然次数太多就不一定了)等。

  • 幂等算子化简,即作用再某一元素两次与一次相同:

    \[f(f(x))=f(x) \]

    一个具体的实例如下:

    \[Reshape(Reshape(x, shape1),shape2) \rightarrow Reshape(x, shape2) \]

    其中,\(Shape2\) 的大小小于 \(Shape1\)。

我们用图来展示上述两中运行化简:

image

如图所示,对于对合算子 Op1,两次对合后,根据对合性质可得等价于没有操作,所以运行化简后只剩下 Op2。

image

如图所示,对于幂等算子 Op1,多个幂等算子等价与一次操作,于是运行化简后等价与一个 Op1 算子。

广播简化

当多个张量形状 Shape 不同情况下,需要进行广播(broadcast)将张量的形状拓展为相同 shape 再进行运算,化简为最小计算所需的广播运算数量。

我们还是以一个简单的例子为准,考虑以下 2 个矩阵与 2 个向量的相加:

\[(S_1+Mat_1)+(S_2+Mat_2) \rightarrow(S_1+S_2)+(Mat_1+Mat_2) \]

image

假设矩阵的维度为 4,则一个向量与 4 维矩阵相加时,要先广播为 4 维,再与 Mat 相加,显然左式需要广播两次;但我们可以通过位置替换,将两个向量首先相加再广播,此时就节省了一个广播的开销,达到我们优化的目的。

如果您想了解更多AI知识,与AI专业人士交流,请立即访问昇腾社区官方网站https://www.hiascend.com/或者深入研读《AI系统:原理与架构》一书,这里汇聚了海量的AI学习资源和实践课程,为您的AI技术成长提供强劲动力。不仅如此,您还有机会投身于全国昇腾AI创新大赛和昇腾AI开发者创享日等盛事,发现AI世界的无限奥秘~

转载自:https://www.cnblogs.com/ZOMI/articles/18560291

标签:化简,diamond,运算,AI,代数,结合律,算子,转载,rightarrow
From: https://www.cnblogs.com/wujinwanai/p/18600899

相关文章

  • options.ModelMetadataDetailsProviders.Add
    在ASP.NETCoreMVC框架中,options.ModelMetadataDetailsProviders.Add方法用于向MVC选项添加自定义的模型元数据详细信息提供程序。这些提供程序可以自定义模型绑定和验证的行为,它们实现一个或多个接口,如IBindingMetadataProvider、IDisplayMetadataProvider或IValidationMetadat......
  • 转载:【AI系统】内存分配算法
    本文将介绍AI编译器前端优化部分的内存分配相关内容。在AI编译器的前端优化中,内存分配是指基于计算图进行分析和内存的管理,而实际上内存分配的实际执行是在AI编译器的后端部分完成的。本文将包括三部分内容,分别介绍模型和硬件的内存演进,内存的划分与复用好处,节省内存的算法......
  • 转载:【AI系统】常量折叠原理
    常量折叠(ConstantFolding)是编译器的一种优化技术,它通过在编译期间对常量表达式进行计算,将其结果替换为常量值,从而减少程序运行时的计算和开销。传统编译器的常量折叠传统编译器在编译期间,编译器会设法识别出常量表达式,对其进行求值,然后用求值的结果来替换表达式,从而使得运行时......
  • 转载:【AI系统】死代码消除
    死代码消除(DeadCodeElimination)是一种编译器优化技术,旨在删除程序中不会被执行的代码,从而提高程序的执行效率和资源利用率。死代码是指在程序的当前执行路径下不会被访问或执行的代码片段。传统编译器的死代码消除死代码消除的目的是删除程序中无用和不可达操作对应的代码。在......
  • 转载:【AI系统】公共表达式消除原理
    公共子表达式消除(CommonSubexpressionElimination,CSE)也成为冗余表达式消除,是普遍应用于各种编译器的经典优化技术。旨在消除程序中重复计算的公共表达式,从而减少计算量和提高执行效率。传统编译器的公共子表达式消除概述在程序中,有时会出现多个地方使用相同的表达式进行计算,......
  • 转载:【AI系统】图算 IR
    本文将围绕计算图介绍相关内容。首先介绍计算图的基本构成,包括计算图的整体介绍、与自动微分的关系、控制流的表示方法等;接着将介绍AI框架产生计算图的方式,包括产生静态图和产生动态图的方式;之后将介绍静态和动态计算图的内容,包括AI框架关于计算图的不同方案,例如现在大部分的......
  • 转载:【AI系统】AI编译器前瞻
    本文首先会基于TheDeepLearningCompiler:AComprehensiveSurvey中的调研做一个热门AI编译器的横向对比,并简要介绍几个当前常用的AI编译器。随后会分析当前AI编译器面临的诸多挑战,并展望AI编译器的未来。业界主流AI编译器对比在TheDeepLearningCompiler:A......
  • 转载:【AI系统】布局转换原理与算法
    数据布局转换目前已经越来越多地用于编译器的前端优化,将内部数据布局转换为后端设备友好的形式。数据布局转换主要影响程序的空间局部性,所谓空间局部性指的是如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用其附近的一个内存位置,它会影响到程序执行中的缓存及其他性......
  • PS+SD让生成式AI从好玩到好用,开启AI竞赛下半场!
    随着技术的不断进步,PS已经被越来越多的人所熟知和广泛使用。尤其是在近年来,AI的快速崛起,使得Photoshop的功能变得更加智能和多元化。现在,不仅可以利用传统的图像编辑工具进行基本的修图,还能够借助AI技术实现更为复杂和精细的操作。例如智能填充、智能移除、生成式等,随着这......
  • opencv - py_photo - py_inpainting 图像修复
    文章目录图像修复目标基础知识代码其他资源练习图像修复目标在本章中,我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音、笔触等我们将看到OpenCV中的修复功能。基础知识你们大多数人家里都会有一些旧的劣化照片,上面有一些黑点、一些笔触等。你有......