GE融合Pattern Pass机制详解

发布时间:2026/9/10 4:52:29
GE融合Pattern Pass机制详解 融合 Pattern Pass 机制【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge1. 这类 Pass 解决什么问题GE 编译模型时输入是一张计算图。图里每个节点是一个算子节点之间的边表示 Tensor 从哪个算子流向哪个算子。融合 Pattern Pass 的目标很直接在图中找到一段符合规则的小结构然后把这段结构替换成另一段等价结构。例如图里有一段MatMul Adda ----\ MatMul ----\ b ----/ Add ---- out c ----------------/如果目标硬件上GEMM能一次完成同样的计算就可以把它替换为a ----\ b ----- GEMM ---- out c ----/再比如图里有Add(x, 0)它的输出和x等价可以直接替换成x。这类优化不会改变模型语义但可以减少算子数量、减少中间 Tensor 读写或把图改成后端更容易高效执行的形态。GE 提供两种常用接口接口适用场景直观理解PatternFusionPass匹配一段子图再替换成另一段子图“找到这个形状的局部图然后整体替换”DecomposePass匹配某一种单个算子再替换成多个算子组成的子图“把一个复杂算子拆成几个基础算子”Python 和 C 的写法不同但底层机制一致都是由 GE 在编译阶段运行 pass完成匹配、过滤、替换和重连。开发指南Python 融合 Pass 开发指南C 融合 Pass 开发指南2. 一次 PatternFusionPass 如何执行一次PatternFusionPass的执行可以拆成五步定义 pattern - 在目标图中匹配 - 按条件过滤 - 生成 replacement - 替换并重连边2.1 定义 patternpattern是一张很小的模板图用来表达“我要在真实图里找什么”。以Add(x, 0)为例pattern 只需要表达外部输入 x ----\ Add ---- pattern 输出 常量输入 0 ----/这里的“外部输入”不是固定的某个真实节点而是一个占位符。匹配时GE 会把真实图中连到这段结构外部的 Tensor 对应到这个占位符。2.2 在目标图中匹配GE 会用 pattern 到真实图里搜索同构结构。可以把它理解为pattern 里普通算子的类型必须和真实图中的算子类型一致。pattern 里的数据边必须能在真实图里找到对应连接。pattern 的输入输出边界必须完整替换后真实图仍然能连通。匹配成功后GE 生成一个MatchResult。它记录了这次命中的真实节点、真实边以及 pattern 中主动捕获的 Tensor。2.3 用 MeetRequirements 过滤拓扑匹配只说明“形状像”不一定说明“可以替换”。例如Add(x, Const)的拓扑可以匹配所有“输入加常量”的结构但只有常量值等于 0 时才能替换成x。这个判断应放在MeetRequirements中。MeetRequirements返回true这次匹配满足条件可以进入替换。false跳过这次匹配继续查找下一处。2.4 用 Replacement 生成替换图Replacement返回另一张小图用来替换匹配到的真实子图。如果 pattern 是Add(x, 0)replacement 可以只返回输入xx ---- replacement 输出如果 pattern 是MatMul Addreplacement 可以返回GEMMa ----\ b ----- GEMM ---- replacement 输出 c ----/2.5 替换和重连GE 会删除被匹配到的旧子图插入 replacement然后按 pattern 声明的输入输出边界把外部消费者重新接到 replacement 上。这里最重要的是“边界”。边界写错时即使 pattern 能匹配也可能无法安全替换。3. Pattern 的边界规则边界规则是写 Pattern Pass 时最容易出错的部分。可以先记住一句话pattern 要完整说明这段子图从哪里接收外部输入以及哪些输出在替换后还要交给外部使用。3.1 输入边界凡是来自匹配子图外部的 Tensor都要在 pattern 里用输入占位符表示。例如要匹配Add(x, 0)x来自外部常量0在 pattern 内部创建Data/Input ----\ Add Const(0) ------/匹配时Data/Input可以对应真实图里的任意上游输出。3.2 输出边界凡是替换后还要被子图外部使用的 Tensor都必须作为 pattern 的输出。例如 pattern 是X ---- A ---- out如果真实图中只有A的输出被外部使用那么只把A声明为 pattern 输出即可。如果X的输出也被 pattern 外部的节点使用就必须把X的输出也声明出来X ---- A ---- out0 | out1否则替换后外部节点还想使用X的输出但 replacement 并没有为这个 Tensor 提供输出口图会断开。GE 会尽量在匹配阶段拒绝这类不完整边界。3.3 自包含约束pattern 内部的普通节点如果它的某个输出没有声明为 pattern 输出那么这个输出的所有消费者都必须也在 pattern 内部。可以按下面的问题检查这个 Tensor 替换后还会被外部节点使用吗如果会它是否已经作为 pattern 输出声明如果不会它的消费者是否都在 pattern 内部3.4 输入个数要精确普通算子节点的输入个数需要和真实图一致。真实图中的某个算子有 3 个输入pattern 里对应节点也要有 3 个输入。即使其中某些输入不关心具体来源也要用输入占位符补齐。3.5 不支持的 Pattern 内容Pattern 匹配关注数据拓扑不适合表达所有图结构。开发时应避免在 pattern 中使用内容原因控制边Pattern matcher 不按控制依赖做匹配子图不支持嵌套子图匹配动态输入个数或动态输出个数的节点匹配时无法确定固定的输入输出边界3.6 多输出 Pattern一个 pattern 可以有多个输出。多输出不是“多个 pattern”而是“一次匹配暴露多个输出 Tensor”。如果只是想支持多种拓扑比如同时支持MatMul Add和BatchMatMulV2 Add应定义多个 pattern。4. 常用扩展点4.1 CaptureTensor有时MeetRequirements或Replacement需要读取 pattern 中某个中间 Tensor 对应的真实节点例如读取MatMul的输出描述或属性。这时可以在定义 pattern 时捕获这个 Tensor。匹配成功后再从MatchResult中按捕获顺序取回它。Pythonpattern写法会自动捕获已访问的外部输入和return返回的 pattern 输出如果要读取未作为输出返回的中间 Tensor仍需要使用显式构图并调用Pattern.capture_tensor。典型用途在MeetRequirements中检查 dtype、shape、format。在Replacement中读取原节点属性写到新节点上。打印命中位置便于确认匹配结果。参考样例C capture tensor 样例Python capture tensor 样例4.2 PatternMatcherConfig默认情况下pattern 主要匹配拓扑和算子类型。有些场景希望 matcher 更严格例如pattern 中的 Const 值必须和真实图中的 Const 值一致。pattern 中声明的 IR 属性和值必须和真实图一致。这时可以启用PatternMatcherConfig。常见开关配置作用EnableConstValueMatch/enable_const_value_match匹配 Const 值EnableIrAttrMatch/enable_ir_attr_match匹配 IR 属性和值如果判断逻辑比较简单、严格且稳定可以放进 matcher 配置如果需要容差、dtype 归一化、多个条件组合通常放在MeetRequirements更清晰。参考样例C PatternMatcherConfig 样例Python PatternMatcherConfig 样例5. DecomposePass 如何理解DecomposePass是一种更特殊的替换它不需要先定义一张 pattern 图而是直接声明“我要处理哪些算子类型”。例如要把groups 1的Conv2D拆成多个普通Conv2DGrouped Conv2D | v Split(input) Split(filter) Conv2D * N Concat执行流程是按 op type 找节点 - MeetRequirements 判断这个节点是否需要拆 - Replacement 生成替换子图DecomposePass适合目标是单个算子。是否替换主要由这个算子的属性决定。replacement 会把这个算子展开成多个算子。参考样例C DecomposePass 样例Python DecomposePass 样例6. Pass 执行阶段Pass 注册时需要指定执行阶段。阶段决定 pass 能看到的图状态也决定 replacement 是否需要自行做 shape 推导。机制阶段Python 枚举C 枚举使用建议InferShape 前PassStage.BEFORE_INFER_SHAPECustomPassStage::kBeforeInferShape最常用。replacement 后续会进入统一 shape 推导流程InferShape 后PassStage.AFTER_INFER_SHAPECustomPassStage::kAfterInferShapereplacement 需要自行保证输出 shape 等信息正确逻辑流分配后PassStage.AFTER_ASSIGN_LOGIC_STREAMCustomPassStage::kAfterAssignLogicStream主要用于流相关自定义逻辑普通融合不建议使用内置融合后PassStage.AFTER_BUILTIN_FUSION_PASSCustomPassStage::kAfterBuiltinFusionPass希望在 GE 内置融合完成后再处理时使用原图优化后PassStage.AFTER_ORIGIN_GRAPH_OPTIMIZECustomPassStage::kAfterOriginGraphOptimize希望在原图优化结束后追加自定义处理时使用初次开发建议优先选择 InferShape 前阶段。只有当你的判断必须依赖已经推导完成的 shape或 replacement 本身明确会调用 shape 推导时再考虑 InferShape 后阶段。7. Python 与 C 的关系Python 和 C 的 pass 都会接入 GE 的统一 pass 调度流程。区别主要在开发体验和交付方式维度PythonC接入方式通过ASCEND_GE_PY_PASS_PATH在运行时加载.py文件或目录编译成.so后由 GE 加载Pattern 写法推荐pattern表达式写法也兼容显式构图使用EsGraphBuilder显式构图Replacement 写法可返回表达式例如return inputs[0]返回GraphUniqPtr适合场景快速开发、业务侧按需接入产品化交付、复用 C 代码、需要更强编译期控制如果只是新增一个规则并验证效果建议先用 Python 写。规则稳定后如有交付形态或性能方面要求再考虑 C 实现。8. 开发前检查清单写 pass 前先回答这些问题要处理的是“一段子图”还是“单个算子”如果是一段子图pattern 的外部输入是否都声明了替换后仍会被外部使用的输出是否都声明了只是拓扑匹配就足够还是需要在MeetRequirements里检查 dtype、shape、属性或 Const 值replacement 的输入顺序是否和 pattern 边界一致注册阶段是否合适如果在 InferShape 后运行replacement 是否已经处理 shape 推导是否能通过DUMP_GE_GRAPH1对比替换前后的图确认规则确实生效【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询