【AI系统】代数简化

代数简化

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

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

算术简化

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

结合律

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

( a + b ) + c = a + ( b + c ) (a+b)+c = a+(b+c) (a+b)+c=a+(b+c)

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

( x ∗ y ) ∗ z = x ∗ ( y ∗ z ) (x*y)*z = x*(y*z) (xy)z=x(yz)

则称运算 ∗ * S S S 上是可结合的,或者说运算 ∗ * S S S 上满足结合律

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

( A ⋆ B ) − 1 ⋄ ( ( A ⋆ B ) C ) − 1 → ( A ⋆ B ) − 2 ⋄ C (A\star B)^{-1}\diamond ((A\star B)C)^{-1} \rightarrow(A\star B)^{-2}\diamond C (AB)1((AB)C)1(AB)2C

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

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

在这里插入图片描述

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

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

R e c i p ( A ) ⋄ R e c i p e ( A ⋄ B ) → S q u a r e ( R e c i p ( A ) ) ⋄ B ( A ⋄ B ) ⋄ ( B ⋄ C ) → A ⋄ B ⋄ C ( A ⋄ R e d u c e S u m ( B ) ) ⋄ ( R e d u c e S u m ( B ) ⋄ C ) → A S q u a r e ( R e d u c e S u m ( B ) ) ⋄ C 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 Recip(A)Recipe(AB)Square(Recip(A))B(AB )(B C)ABC(AReduceSum(B))(ReduceSum(B)C)ASquare(ReduceSum(B))C

交换律

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

a + b = b + c a ∗ b = b ∗ a a+b = b+c \\ a*b = b*a \\ a+b=b+cab=ba

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

x ∗ y = y ∗ x x*y= y*x xy=yx

则称运算 ∗ * S S S 上是可交换的,或者说运算 ∗ * S S S 上满足交换律

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

R e d u c e S u m ( B i t S h i f t ( A ) ) → B i t S h i f t ( R e d u c e S u m ( A ) ) ReduceSum(BitShift(A)) \rightarrow BitShift(ReduceSum(A)) ReduceSum(BitShift(A))BitShift(ReduceSum(A))

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

在这里插入图片描述

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

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

R e d u c e P r o d ( E x p ( A ) ) → E x p ( R e d u c e S u m ( A ) ) ReduceProd(Exp(A)) \rightarrow Exp(ReduceSum(A)) ReduceProd(Exp(A))Exp(ReduceSum(A))

分配律

分配律简化,即

a ∗ ( b + c ) = ( a ∗ c ) + ( a ∗ b ) a*(b+c) = (a*c)+(a*b) a(b+c)=(ac)+(ab)

形式化的讲,令 ∗ * ∘ \circ 是非空集合 S S S 上的二元运算,如果 ∀ x , y , z ∈ S \forall x,y,z\in S x,y,zS

x ∗ ( y ∘ z ) = ( x ∗ y ) ∘ ( x ∗ z ) ( y ∘ z ) ∗ x = ( y ∗ x ) ∘ ( z ∗ x ) x*(y\circ z) = (x*y)\circ (x*z) \\ (y\circ z)*x = (y*x)\circ (z*x) x(yz)=(xy)(xz)(yz)x=(yx)(zx)

则称运算 ∗ * ∘ \circ S S S 上是可分配的,或者说运算 ∗ * ∘ \circ S S S 上满足分配律

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

( A ⋅ B ) ⋆ C + ( A ⋅ B ) ⋆ D → ( A ⋅ B ) ⋆ ( C + D ) (A\cdot B)\star C + (A\cdot B)\star D \rightarrow (A\cdot B)\star (C+D) (AB)C+(AB)D(AB)(C+D)

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

在这里插入图片描述

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

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

A + A ⋄ B → A ⋄ ( B + 1 ) S q u a r e ( A + B ) − ( A + B ) ⋄ C → ( A + B ) ⋄ ( A + B − C ) A+A\diamond B \rightarrow A \diamond (B+1) \\ Square(A+B)-(A+B)\diamond C \rightarrow (A+B)\diamond(A+B-C) A+ABA(B+1)Square(A+B)(A+B)C(A+B)(A+BC)

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

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

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

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

在这里插入图片描述

运行简化

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

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

    f ( f ( x ) ) = x f ( x ) = f − 1 ( x ) f(f(x)) = x \\ f(x) = f^{-1}(x) f(f(x))=xf(x)=f1(x)

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

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

    f ( f ( x ) ) = f ( x ) f(f(x))=f(x) f(f(x))=f(x)

    一个具体的实例如下:

    R e s h a p e ( R e s h a p e ( x , s h a p e 1 ) , s h a p e 2 ) → R e s h a p e ( x , s h a p e 2 ) Reshape(Reshape(x, shape1),shape2) \rightarrow Reshape(x, shape2) Reshape(Reshape(x,shape1),shape2)Reshape(x,shape2)

    其中, S h a p e 2 Shape2 Shape2 的大小小于 S h a p e 1 Shape1 Shape1

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

在这里插入图片描述

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

在这里插入图片描述

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

广播简化

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

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

( S 1 + M a t 1 ) + ( S 2 + M a t 2 ) → ( S 1 + S 2 ) + ( M a t 1 + M a t 2 ) (S_1+Mat_1)+(S_2+Mat_2) \rightarrow(S_1+S_2)+(Mat_1+Mat_2) (S1+Mat1)+(S2+Mat2)(S1+S2)+(Mat1+Mat2)

在这里插入图片描述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483238.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多人聊天室项目 BIO模型实现

BIO模型聊天室项目大体设计 BIO编程模型 Acceptor是服务器端负责监听具体端口的Socket每有一个客户端Client连接到服务器端,Acceptor就创建一个新的线程Handler来处理客户端发送的消息每一个客户端都有一个唯一的Handler来对应处理其事务为保证线程安全&#xff0c…

腾讯云平台 - Stable Diffusion WebUI 下载模型

1)进入控制台,点击算力连接 》 JupyterLab 2)进入模型目录(双击) 3)上传模型 例如:我要上传大模型

夜神模拟器+Charles+postern+Mgisk+TrustMeAlready实现抓包

[实测有用]夜神模拟器CharlesposternMgiskTrustMeAlready实现抓包 PS:此贴仅做为技术交流,禁止非法用途。 1.初始化条件 A.安装MUMU模拟器安卓12版本 B.按图示选择,设置好代理端口8889 C.查看本机IP地址 D.导出证书,安装配置,暂时保存…

【closerAI ComfyUI】物体转移术之图案转移,Flux三重控制万物一致性生图,实现LOGO和图案的精准迁移

更多AI前沿科技资讯,请关注我们:closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 closerAIGCcloserAI,一个深入探索前沿人工智能与AIGC领域的资讯平台,我们旨在让AIGC渗入我们的工作与生活中,让我们一起探索AIGC的无限可能性! 【closerAI ComfyUI】物体转移术之图…

新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议

为推进广东省加快发展新质生产力,贯彻落实“百县千镇万村高质量发展工程”,推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展,充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…

vue+mars3d给影像底图叠加炫酷效果

话不多说,直接上效果图: 在这里墙体其实是有一个不太明显的流动效果 实现方式:这里我使用了PolylineEntityWallPrimitive,开始我用的是polygonEntity但是发现实现效果并不好,所有直接改用了线 map.vue文件&#xff1…

【模电】常见电路参数计算

1.恒流源输出电阻 2.射极电压跟随器输出电阻 3.差分放大电路 3.1差模特性 3.1.1差模输入电阻Rid 3.1.2差模输出电阻Ro 3.1.3差模电压增益Avd 3.2共模特性 3.2.1共模输入电阻Ric 3.2.2共模电压增益Avc 4.组合放大电路 4.1单级放大器 4.1.1微变等效电路 4.1.1.1共射级 4.1.…

Linux-虚拟环境

文章目录 一. 虚拟机二. 虚拟化软件三. VMware WorkStation四. 安装CentOS操作系统五. 在VMware中导入CentOS虚拟机六. 远程连接Linux系统1. Finalshell安装2. 虚拟机网络配置3. 连接到Linux系统 七. 虚拟机快照 一. 虚拟机 借助虚拟化技术,我们可以在系统中&#…

Kafka如何保证消息可靠?

大家好,我是锋哥。今天分享关于【Kafka如何保证消息可靠?】面试题。希望对大家有帮助; Kafka如何保证消息可靠? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka通过多种机制来确保消息的可靠性,主要包…

ONVIF协议网络摄像机客户端使用gsoap获取RTSP流地址GStreamer拉流播放

什么是ONVIF协议 ONVIF(开放式网络视频接口论坛)是一个全球性的开放式行业论坛,旨在促进开发和使用基于物理IP的安全产品接口的全球开放标准。 ONVIF规范的目标是建立一个网络视频框架协议,使不同厂商生产的网络视频产品完全互通。…

javaweb_Day05

1.请求响应 1.1 概述 1.2 请求 1.2.1 请求参数 1.2.2 响应 2.分层解耦 2.1 三层架构 (1)代码分层 2.2 分层解耦 2.3 IOC&DI入门 (1)控制反转IOC (2)依赖注入DI (3)汇总 …

Stable Diffusion 3详解

🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&…

[VUE]框架网页开发02-如何打包Vue.js框架网页并在服务器中通过Tomcat启动

在现代Web开发中,Vue.js已经成为前端开发的热门选择之一。然而,将Vue.js项目打包并部署到生产环境可能会让一些开发者感到困惑。本文将详细介绍如何将Vue.js项目打包,并通过Tomcat服务器启动运行。 1. 准备工作 确保你的项目能够正常运行,项…

网络分层模型( OSI、TCP/IP、五层协议)

1、网络分层模型 计算机网络是一个极其复杂的系统。想象一下最简单的情况:两台连接在网络上的计算机需要相互传输文件。不仅需要确保存在一条传输数据的通路,还需要完成以下几项工作: 发起通信的计算机必须激活数据通路,这包括发…

采药 刷题笔记 (动态规划)0/1背包

P1048 [NOIP2005 普及组] 采药 - 洛谷 | 计算机科学教育新生态 动态规划 0/1背包 的本质在于继承 一行一行更新 上一行是考虑前i个物品的最优情况 当前行是考虑第i1个物品的情况 当前行的最优解 来自上一行和前i个物品的最优解进行比较 如果当前装了当前物品&#xff…

汽车操作系统详解

目录 1. 车控汽车操作系统 2. 车载汽车操作系统 3. OEM定制操作系统 刚开始工作的时候,接触的是汽车控制相关的开发工作,天真地以为汽车操作系统就是指实时操作系统,例如FreeRTOS、OSEK OS、AUTOSAR OS等等;然而,随…

Shire 1.1 发布:更强大的交互支持,升级 AI 智能体与 IDE 的整合体验

在经过多个项目上的试用后,我们进入了持续的修修补补,以及功能的增强阶段。终于,我们发布了 Shire 1.1 版本,这个版本带来了更强大的交互支持, 多功能升级 AI 与 IDE 的整合体验。 交互:丰富与大量 IDE 插件…

Springboot(四十九)SpringBoot3整合jetcache缓存

上文中我们学习了springboot中缓存的基本使用。缓存分为本地caffeine缓存和远程redis缓存。现在有一个小小的问题,我想使用本地caffeine缓存和远程redis缓存组成二级缓存。还想保证他们的一致性,这个事情该怎么办呢? Jetcache框架为我们解决了这个问题。 ‌JetCache‌是一个…

学习笔记052——Spring Boot 自定义 Starter

文章目录 Spring Boot 自定义 Starter1、自定义一个要装载的项目2、创建属性读取类 ServiceProperties3、创建 Service4、创建自动配置类 AutoConfigration5、创建 spring 工程文件6、将项目打成 jar 包7、jar 打包到本地仓库8、配置application.yml Spring Boot 自定义 Starte…

专业清洁艺术,还原生活本色——友嘉高效除菌洗碗机

生活中,每个人都渴望拥有一份洁净的生活环境。而家,作为我们最温馨的港湾,对洁净的追求更是无时无刻不在进行。每当饭后的欢声笑语过后,面对一堆沾满油渍、藏匿着细菌的餐具,我们不禁感到一丝烦忧。然而,有…