尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

代数简化:AI 编译器前端的子图重写优化实践(结合律、交换律与广播化简)

代数简化:AI 编译器前端的子图重写优化实践(结合律、交换律与广播化简) 文档教程人工智能【免费下载链接】AISystemAISystem 主要是指AI系统包括AI芯片、AI编译器、AI推理和训练框架等AI全栈底层技术项目地址https://gitcode.com/GitHub_Trending/ai/AISystem点击查看免费下载代数简化Algebraic Reduced是 AI 编译器前端优化中的一类基于数学规律的计算图优化 Pass其核心思路是借助交换律、结合律、分配律等代数法则调整图中算子的执行顺序、合并或删除冗余算子从而降低图整体的计算与访存开销。本文以 10algebraic.md 为主体系统讲解算术简化、运行简化、广播简化三类方案的数学依据、子图替换实现方式与工程落地点并结合本仓库 03Compiler/03Frontend 系列文档中的图算 IR、常量折叠、算子融合等相邻优化 Pass 进行纵深印证。代数简化用数学规律驱动计算图重写在 AI 编译器中前端优化负责对 AI 框架产出的计算图Graph IR施加一系列优化 Pass包括算子融合、布局转换、内存分配、常量折叠、公共表达式消除与死代码消除等这一整体脉络可参考 前端优化总览 与 图算 IR。代数简化正是这一系列 Pass 中的一环它从数学出发利用代数运算的**结合律Associativity、交换律Commutativity、分配律Distributivity**等规律调整图中算子的执行顺序或者直接删除不必要的算子以达到提高计算图整体执行效率的目的。从实现手段上看代数化简可以通过**子图替换Subgraph Rewrite / Pattern Matching**完成具体有两种落地路径通用子图替换框架先抽象出一套通用的子图匹配与替换框架再将每一条代数规则实例化为模式 → 替换的模板。编译器遍历计算图命中模式即按规则完成替换。专用优化逻辑针对每一条具体规则编写专门的优化逻辑直接在图数据结构上完成局部变换。前者可扩展性好、规则易于维护后者针对性更强、性能开销更低。两类方案在实际工程中往往并存。下面逐一展开本文核心的三种简化方案算术简化、运行简化与广播简化。算术简化运用运算律重排算子算术简化Arithmetic Simplification利用代数运算的运算法则在计算图中确定可优化的算子执行顺序用新的、更简的算子组合替换原有复杂算子组合。它与传统编译器中的代数化简如 LLVM 的 instcombine 所做的化简思想同源但在 AI 编译器里作用对象是计算图上的算子节点与张量边。以下分别给出结合律、交换律、分配律的定义、规则与实例。结合律调整运算的聚合顺序非正式地说结合律指不论我们怎样结合数字即先计算哪些数字答案都是一样的即$$ (ab)c a(bc) $$形式化地讲令 $*$ 是非空集合 $S$ 上的二元运算如果 $\forall x,y,z\in S$都有$$ (xy)z x(yz) $$则称运算 $$ 在 $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$ 为具体的张量其余算子如图示优化规则如上所述根据上述结合律规则我们可以把 A 与 B 的卷积抽离出来对红色方框部分做简化从而减少运算算子也减少运算开销。结合律家族还有更多可用的化简规则例如$$ \text{Recip}(A) \diamond \text{Recip}(A \diamond B) \rightarrow \text{Square}(\text{Recip}(A)) \diamond B \ (A \diamond \sqrt B) \diamond (\sqrt B \diamond C) \rightarrow A \diamond B \diamond C \ (A \diamond \text{ReduceSum}(B)) \diamond (\text{ReduceSum}(B) \diamond C) \rightarrow A \cdot \text{Square}(\text{ReduceSum}(B)) \diamond C $$可以看到这类规则的共同点是将重复出现的子表达式如 $\text{Recip}(A \diamond B)$ 中内嵌的 $A\diamond B$、$\sqrt B$、$\text{ReduceSum}(B)$从两个算子中抽离出来合并从而把两次运算压缩为一次运算 更简单的组合本质上与公共表达式消除见 公共表达式消除原理存在协同关系——先抽公共子表达式再按结合律合并。交换律交换操作数位置以获得更小的中间张量交换律指我们可以把数的位置对换而答案不变即$$ ab ba \ ab ba $$形式化地讲令 $*$ 是非空集合 $S$ 上的二元运算如果 $\forall x,y\in S$都有$$ xy yx $$则称运算 $$ 在 $S$ 上是可交换的或者说运算 $$ 在 $S$ 上满足交换律。据此可以发现符合交换律的化简规则$$ \text{ReduceSum}(\text{BitShift}(A)) \rightarrow \text{BitShift}(\text{ReduceSum}(A)) $$其优化实例如图所示如图所示A 是一个张量。与先位移BitShift再 ReduceSum相比我们可以依据交换律先执行 ReduceSum得到一个维度更小的中间张量再进行 BitShift显然运算开销减少了——因为 ReduceSum 提前压缩了张量规模后续 BitShift 的作用域变小。交换律家族同样还有更多可用规则例如$$ \text{ReduceProd}(\text{Exp}(A)) \rightarrow \text{Exp}(\text{ReduceSum}(A)) $$该规则把先逐元素指数再累乘改写成先累加再指数利用 $\exp$ 把乘法变成加法同时让 Reduce 类算子提前作用、压缩数据规模。分配律提取公因式合并分支计算分配律简化基于如下等式$$ a*(bc) (ac)(ab) $$形式化地讲令 $*$ 和 $\circ$ 是非空集合 $S$ 上的二元运算如果 $\forall x,y,z\in S$都有$$ x*(y\circ z) (xy)\circ (xz) \ (y\circ z)x (yx)\circ (z*x) $$则称运算 $$ 对 $\circ$ 在 $S$ 上是可分配的或者说运算 $$ 对 $\circ$ 在 $S$ 上满足分配律。上述公式从右往左的过程也称为提取公因式。据此可得到符合分配律的规则$$ (A\cdot B)\star C (A\cdot B)\star D \rightarrow (A\cdot B)\star (CD) $$其优化实例如图所示我们会发现$A\cdot B$ 之后与 $C,D$ 分别做乘法操作是没有必要的于是可以提取公因式将 $C,D$ 单独加和再做乘法将 4 次算子操作降低为 3 次操作减少了运算开销。分配律家族还有更多可用规则例如$$ AA\diamond B \rightarrow A \diamond (B1) \ \text{Square}(AB)-(AB)\diamond C \rightarrow (AB)\diamond(AB-C) $$第一条把自身加法 一次乘法改写为一次乘法把 $B$ 加上单位元 1第二条则把平方项与乘法项统一为一次 $\diamond$ 运算。注当我们做代数简化时一定要先注意到算子是否符合交换律、结合律等规则。例如矩阵乘法中 $AB \neq BA$即使它满足结合律也不满足交换律同样地卷积等算子在不同硬件实现下也未必可交换。规则的可用性必须逐算子确认不能机械套用。关于算术简化本仓库文档还推荐了更系统的研究工作DNNFusion关于深度神经网络执行的高级算子融合研究其中收录了更多更复杂的简化规则可作为读者深入挖掘规则库的参考文中图片参见 DNNFusion 规则示意。运行简化消除冗余的算子或算子对运行简化Runtime Simplification的目标是减少运算或执行时冗余的算子或算子对。原文档给出两类典型规则对合算子化简两次操作等价于零次操作对合Involution算子指逆函数等于其自身的函数即满足$$ f(f(x)) x \ f(x) f^{-1}(x) $$典型的对合算子包括取反操作$-(-x) x$倒数$1/(1/x) x$在定义域内逻辑非$\neg(\neg x) x$矩阵转置$(A^T)^T A$以及一些日常生活中的对合现象——例如键盘输入法切换快速按下两次切换键你会发现什么都没有发生当然次数太多就不一定了对合算子的化简实例如下图所示如图所示对于对合算子 Op1两次对合后根据对合性质可得等价于没有操作所以运行化简后只剩下 Op2。幂等算子化简多次操作等价于一次操作幂等Idempotent算子指作用在某一元素上两次与一次相同$$ f(f(x)) f(x) $$一个具体实例如下$$ \text{Reshape}(\text{Reshape}(x, shape_1), shape_2) \rightarrow \text{Reshape}(x, shape_2) $$其中 $shape_2$ 的大小小于 $shape_1$。连续两次 Reshape 完全等价于直接 Reshape 到最终形状中间那次 Reshape 产生的临时张量及其对应的数据搬运都可以被消除。另一个典型例子是Concat后再Split到原分界位置、或连续两次Cast到相同类型均属于幂等可化简模式。幂等算子的化简实例如下图所示如图所示对于幂等算子 Op1多个幂等算子等价于一次操作于是运行化简后等价于一个 Op1 算子。需要说明的是运行简化产生的冗余算子消除效果与本仓库中 死代码消除 所处理的不可达/无用操作在结果上相似但触发机制不同DCE 依据可达性与活性分析删除无用的算子节点而运行简化依据算子自身的数学性质对合、幂等主动识别可折叠的算子对二者在优化 Pass 排序中互为补充。广播简化压缩广播操作的次数当多个张量形状Shape不同时AI 框架需要进行广播Broadcast将张量形状拓展为相同 Shape 后再进行运算。广播简化Broadcast Simplification的目标是化简为最小计算所需的广播运算数量。考虑如下简单例子——2 个矩阵与 2 个向量的相加$$ (S_1\text{Mat}_1)(S_2\text{Mat}_2) \rightarrow (S_1S_2)(\text{Mat}_1\text{Mat}_2) $$假设矩阵的维度为 4则一个向量与 4 维矩阵相加时要先广播为 4 维再与矩阵相加。显然左式需要广播两次$S_1$、$S_2$ 各广播一次但我们可以通过位置替换将两个向量首先相加仍保持低维再一次性广播到矩阵维度此时就节省了一个广播的开销达到优化的目的。广播简化与 布局转换原理、内存分配算法 一样本质都是在减少张量在内存中的冗余搬移提前合并可结合的低维张量能让广播产生的临时高维中间结果更少进而降低访存带宽压力。代数简化与前端优化 Pass 的协同代数简化并不是孤立运行的。从子图替换的视角看它与本仓库前端优化系列中的其他 Pass 存在天然的协同关系与常量折叠协同常量折叠见 常量折叠原理把编译期可确定的算子替换为常量节点代数简化则进一步利用运算律重排算子、合并重复子表达式。例如(A \diamond \text{ReduceSum}(B)) \diamond (\text{ReduceSum}(B) \diamond C) \rightarrow A \cdot \text{Square}(\text{ReduceSum}(B)) \diamond C这类规则若 $\text{ReduceSum}(B)$ 在折叠后成为常量还能继续触发下一轮折叠。与公共表达式消除协同CSE见 公共表达式消除原理识别图中重复计算的公共子表达式并提取为一次计算代数简化的结合律、分配律规则往往会制造或暴露公共子表达式如上述 $\text{Recip}(A \diamond B)$ 中的 $A \diamond B$为 CSE 提供素材。与算子融合协同算子融合见 算子融合把存在数据依赖的生产者-消费者算子融合成一个 Kernel解决内存墙与并行墙问题代数简化则在融合之前把图结构调整得更规整、更紧凑让融合模式更容易被模式匹配命中。原文档推荐的 DNNFusion 工作正是将高级代数化简规则与算子融合相结合的代表性研究。与死代码消除协同运行简化删除对合/幂等冗余算子对DCE 删除不可达/无用操作两者叠加可以显著收缩计算图规模。在实际 AI 编译器中这些 Pass 会组成一个优化流水线并按序执行参见前端优化 Pass 排序 中列出的 11 节课程代数简化通常安排在图 IR 建立之后的早期阶段以便后续 Pass 受益于更规整的图结构。实现要点与工程落地结合原文档的论述在具体实现代数简化 Pass 时需要注意以下几点规则正确性优先在应用交换律、结合律、分配律之前必须先确认目标算子确实满足相应律。原文档特别强调矩阵乘法 $AB \neq BA$说明交换律不可乱用同理浮点运算的舍入误差也决定了严格意义上的结合律在数值上并不精确成立工程上通常只对可证明安全的情形启用重排或作为可选项由用户控制。子图替换框架的设计通用框架需要解决模式匹配 替换两个问题——模式通常描述为算子类型序列加边拓扑的约束替换则是在图中删除命中的子图节点并插入新节点。规则越复杂匹配开销越大因此工业实现常对规则做分类索引如按算子类型、按入度/出度、按张量形状特征预筛。与常量折叠、CSE、DCE 的流水线协作如上节所述代数简化规则的输出往往是其他 Pass 的输入Pass 之间需要约定执行顺序与迭代收敛条件一轮重写后可能暴露出新的可重写模式。规则库的开放性数学上满足结合律、交换律、分配律的算子组合是无穷的工程上通常以规则表/配置文件的方式维护便于持续扩充。原文档列举的规则只是冰山一角DNNFusion 等研究工作收录了更丰富的规则集可供参考。小结与思考代数简化的原理归结起来是在一个代数系统上定义一组规则输入若干个子图不断将规则应用于子图替换从而把计算图改写为等价但更高效的形态。代数简化虽然看上去简单但对许多算子并不适用例如算子不符合交换律时不能随意交换操作数。因此规则的发掘依旧需要我们具体问题具体分析而不是套用一个抽象空泛的数学概念。简而言之算术简化利用结合律、交换律、分配律重排算子并合并重复计算运行简化利用对合、幂等性质删除冗余算子对广播简化压缩广播次数、减少中间张量。三者共同构成了 AI 编译器前端用数学规律压缩计算图的完整工具箱也为后续算子融合、常量折叠、内存优化等 Pass 创造了更有利的图结构。本节配套的演示文稿 10Algebraic.pdf及 PPT 版、配套视频字幕 srt/10.srt 均可在本仓库 03Compiler/03Frontend 目录下查看供读者对照学习。赞分享文档教程人工智能【免费下载链接】AISystemAISystem 主要是指AI系统包括AI芯片、AI编译器、AI推理和训练框架等AI全栈底层技术项目地址https://gitcode.com/GitHub_Trending/ai/AISystem点击查看免费下载相关推荐LaWGPT知识图谱融合法律AI与结构化知识的完美结合想要让法律AI真正具备专业法律推理能力吗LaWGPT通过知识图谱融合技术为法律领域带来了革命性的智能解决方案。作为基于中文法律知识的开源大语言模型LaWG人工智能大模型微调预训练NLPAI 编译器前端优化之算子融合从计算图到 Conv-BN-ReLU 与 TVM 融合算法实战AI 编译器前端优化之算子融合从计算图到 Conv BN ReLU 与 TVM 融合算法实战 算子融合Operator Fusion是 AI 编译器前端优文档教程人工智能终极指南深度解析UniHacker Unity许可证管理工具的技术实现与实战应用终极指南深度解析UniHacker Unity许可证管理工具的技术实现与实战应用 UniHacker是一款专为Unity开发者设计的跨平台许可证管理工具支持逆向工程桌面应用开发工具上一篇BrowserSkill 指南让 AI Agent 复用已登录浏览器浏览器自动化无需重新登录下一篇Anomalib 深度数据模块详解ADAM3D、MVTec3D 与 Folder3D 的 3D 异常检测数据管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表