GE Local Operator 特性分析【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge1 特性概述GE Local Operator简称 GE Local 算子是 GE 图引擎内置的一类本地算子负责承载那些不需要在昇腾 NPU 上执行实际计算的算子节点。这些算子本质上是图的骨架节点——用于数据传递、控制流编排、常量存储和形状推导等结构性工作。与 FE融合引擎、AICPU 等面向实际计算任务的引擎不同GE Local 引擎引擎名DNN_VM_GE_LOCAL是一个零计算引擎。它管理的算子在编译期完成参数计算或内存布局规划在运行期只做轻量级的数据搬运或引用操作不产生任何设备侧 kernel 调用。核心定位GE Local 引擎解决的核心问题是在一个面向异构加速器的图编译系统中如何优雅地处理大量非计算型节点一个典型的深度学习计算图经过框架适配器如 TorchAir转换为 AscendIR 后会包含大量非计算型节点数据入口Data、模型输出NetOutput、常量Constant/Const、控制流If/While/Case、形状操作Shape/Reshape/Squeeze等。这些节点不应占用 NPU 计算资源但也需要参与图的编译、调度和执行流程。GE Local 的设计哲学是将这些节点统一收纳到一个专用引擎中以最小开销完成它们的占位职责确保编译流程的完整性和执行流程的正确性。2 架构设计GE Local 特性的核心逻辑集中在编译compiler阶段整体架构如下2.1 编译阶段编译阶段的核心代码位于compiler/engines/local_engine/产出两个动态库动态库职责注册宏libge_local_engine.so引擎注册入口对外提供Initialize/GetOpsKernelInfoStores/GetGraphOptimizerObjs/Finalize四个 C 接口作为插件被 GE 框架加载引擎插件libge_local_opskernel_builder.so算子构建器负责计算运行参数CalcOpRunningParam和生成任务GenerateTask注册名为DNN_VM_GE_LOCAL_OP_STOREREGISTER_OPS_KERNEL_BUILDER2.1.1 引擎入口GeLocalEnginecompiler/engines/local_engine/engine/下的GeLocalEngine类采用单例模式以动态库插件形式被 GE 引擎管理器加载。它对外暴露四个 C 风格接口Initialize创建GeLocalOpsKernelInfoStore和GeLocalGraphOptimizer实例GetOpsKernelInfoStores将算子信息注册表以DNN_VM_GE_LOCAL_OP_STORE为 key 注册到 GE 框架GetGraphOptimizerObjs将图优化器注册到 GE 框架Finalize释放资源引擎在 GE 初始化时被加载遵循 GE 的插件式引擎注册协议——每个引擎动态库导出统一的四个 C 符号GE 框架通过dlopen加载后按符号名绑定。2.1.2 算子信息注册GeLocalOpsKernelInfoStoreGeLocalOpsKernelInfoStore负责向 GE 框架声明我支持哪些算子。初始化时它从OpFactory获取所有已注册的算子类型列表为每个算子创建一份默认的OpInfo结构engine DNN_VM_GE_LOCAL归属引擎名opKernelLib DNN_VM_GE_LOCAL_OP_STORE归属算子库computeCost 0计算代价为零暗示调度器对这类算子无需特殊调度flagAsync false、flagPartial false、isAtomic false同步执行不支持部分支持非原子操作CheckSupported方法的实现极为简洁——直接在已注册算子名表中查找匹配。对于 GE Local 算子不存在部分支持的概念只要类型匹配即认为完全支持。2.1.3 算子工厂OpFactorycompiler/engines/local_engine/ops_kernel_store/op/下的OpFactory采用注册式工厂模式通过REGISTER_OP_CREATOR宏在编译期将算子类型与创建函数绑定。工厂管理两类算子实现NoOp空操作算子NoOp的Run()方法直接返回成功不做任何操作。它覆盖了以下几类算子算子类别包含的算子类型设计意图数据入口Data、RefData、QueueData、AippData数据节点由运行时直接管理编译期无需处理常量存储Constant、Const、FileConstant、ConstPlaceHolder常量在编译期已完成数据准备控制流If、Case、While、For、PartitionedCall 等控制流由运行时子图机制处理形状操作Reshape、Bitcast、Flatten、ExpandDims、ReFormat、Squeeze/Unsqueeze 系列这些算子在编译期完成内存复用标记运行期直接引用输入辅助节点NoOp、ControlTrigger、Merge、Variable、OpTiling仅参与图结构无实际计算数据流Stack、StackPush、StackPop、StackClose由运行时 DataFlow 机制处理虚拟拼接PhonyConcat、PhonySplit由编译期完成偏移量计算后标记为 NoTaskGeDeletedOp应删除算子GeDeletedOp的Run()方法故意返回 FAILED并附带详细的诊断信息。这些算子如 Identity、Shape、Size、Rank、Placeholder 等在正确编译的图中不应该存在——它们应该被图优化 Pass 消除。如果这些算子到达了 GE Local 引擎说明图优化流程出了问题。这是一个精心设计的防御性设计不是静默跳过或抛出模糊错误而是明确告诉用户这个算子应该被哪个优化 Pass 删除以及当前该 Pass 是否启用。例如对于Shape算子它会检查常量折叠OO_CONSTANT_FOLDING选项是否开启并给出针对性建议。2.1.4 图优化器GeLocalGraphOptimizerGeLocalGraphOptimizer目前只在OptimizeOriginalGraphJudgeInsert阶段有实质逻辑专门处理PhonyConcat和PhonySplit两种虚拟算子为PhonyConcat设置NOTASK不生成执行任务、NOPADDING_CONTINUOUS_INPUT输入连续无填充、OUTPUT_REUSE_INPUT输出复用输入内存为PhonySplit设置类似属性区别在于NOPADDING_CONTINUOUS_OUTPUT输出连续无填充这些属性的设置使得 PhonyConcat/PhonySplit 在内存规划阶段可以被识别为零拷贝拼接/拆分——内存规划器知道这些节点不需要独立的输出缓冲区只需在输入缓冲区的适当偏移位置上引用即可。2.1.5 算子构建器GeLocalOpsKernelBuilderGeLocalOpsKernelBuilder是编译期的核心工作组件实现OpsKernelBuilder接口负责两个关键任务CalcOpRunningParam——计算算子运行参数这个方法的核心工作是计算每个输出张量的内存大小。对于 GE Local 算子内存计算有一些特殊处理Data/RefData 等数据节点使用GetTensorMemorySizeInBytesWithAutoPadding计算带对齐的内存大小Constant/Const 且类型为 DT_STRING使用专门的字符串内存计算逻辑GetConstantStrMemSizeFileConstant直接从ATTR_NAME_LENGTH属性读取预设长度PhonyConcat/PartitionedCall额外进行 32 字节对齐AlignOutputMemSize未知形状节点跳过计算运行时动态确定对于特定算子类型还会调用专门的偏移量计算函数PhonyConcatCalcPhonyConcatNodeOffset——计算多输入在连续内存中的偏移位置PhonySplitCalcPhonySplitNodeOffset——计算多输出在连续内存中的偏移位置Bitcast/Flatten/ExpandDims/ReFormat/Squeeze/UnsqueezeCalcNodeOffsetByReuseInput——标记输出复用输入内存PhonyConcat 偏移量计算细节CalcPhonyConcatNodeOffset定义在GeLocalOpsKernelBuilderCalcOpParam类中支持多轴拼接的偏移量计算。它通过concat_dim拼接轴列表和N拼接数量列表属性计算每个输入节点在其输出缓冲区中的偏移位置。计算过程采用分层 slice_id 方式将算子索引逐层分解为各轴上的位置索引然后按轴从内到外累加偏移量。支持负数轴索引自动转换为正数并进行严格的合法性校验输入形状一致性检查、32 字节对齐检查、轴属性与张量维度匹配检查等。GenerateTask——生成任务GenerateTask的逻辑相对简单对于StackPop等依赖计算的算子设置DEPEND_COMPUTE属性表示形状依赖计算结果对于未知形状节点设置NOTASK属性跳过任务生成对于其他节点通过OpFactory创建对应的 Op 对象并调用Run()3 用户使用场景3.1 场景一计算图的基本骨架构建任何经过 GE 编译的模型都天然使用 GE Local 算子。框架适配器TorchAir/TFA将模型转换为 AscendIR 时会自动插入 Data输入节点、NetOutput输出节点、Constant权重常量等节点。这些节点被引擎调度器自动分配给 GE Local 引擎用户无需感知。3.2 场景二形状推导与常量折叠在动态形状场景下Shape、Rank、Size 等算子需要在运行时根据实际输入计算形状信息。GE Local 引擎通过 Host Kernel 机制在 Host 端执行这些计算并将结果拷贝到设备端供后续算子使用。如果用户开启了常量折叠优化OO_CONSTANT_FOLDING这些形状相关算子会在编译期被折叠为常量不会进入运行时阶段。3.3 场景三零拷贝内存复用Reshape、Bitcast、Flatten、ExpandDims、Squeeze、Unsqueeze 等形状变换算子不改变底层数据只改变形状描述。GE Local 引擎通过CalcNodeOffsetByReuseInput在编译期标记ReuseInput运行时直接引用输入内存实现零拷贝。3.4 场景四虚拟拼接/拆分PhonyConcat/PhonySplitPhonyConcat 和 PhonySplit 是 GE 内部使用的虚拟算子用于表示多个张量在连续内存中的拼接和拆分关系。在图优化阶段GeLocalGraphOptimizer 为它们设置NOTASK属性在编译阶段CalcPhonyConcatNodeOffset/CalcPhonySplitNodeOffset计算各输入/输出的内存偏移量。运行时这些节点不执行任何操作实际的内存共享通过偏移量属性由内存规划器和执行框架协同完成。3.5 场景五控制流与数据流If/While/Case/For 等控制流算子和 Stack/StackPush/StackPop/StackClose 数据流算子由 GE Local 引擎承载。控制流算子通过运行时的子图执行机制处理数据流算子通过DataFlowResource机制管理跨节点的数据传递。4 算子分类总览NoOp 类算子编译期不生成任务运行期空操作算子类型用途Data、RefData、QueueData、AippData数据入口节点Constant、Const、FileConstant、ConstPlaceHolder常量存储NoOp、ControlTrigger纯控制流信号Merge多路合并Variable变量引用If、Case、While、For、PartitionedCall 及其 Stateful/Stateless 变体控制流OpTiling、ConditionCalc、UnfedData编译辅助Stack、StackPush、StackPop、StackClose数据流Reshape、Bitcast形状变换零拷贝PhonyConcat、PhonySplit虚拟拼接/拆分Flatten、FlattenV2、ExpandDims、ReFormat、Squeeze/Unsqueeze 系列形状变换零拷贝GeDeletedOp 类算子正常编译流程中不应存在存在则报错Identity、IdentityN、Shape、ShapeN、Size、Rank、Placeholder、Switch、Snapshot、ReadVariableOp、VarHandleOp、TemporaryVariable、DestroyTemporaryVariable、GatherShapes、TransShape 等。5 关键设计决策5.1 编译期与运行期的职责分离GE Local 的一个核心设计是将尽可能多的工作前移到编译期编译期计算输出内存大小CalcOpRunningParam、设置内存复用标记ReuseInput、计算 PhonyConcat/PhonySplit 偏移量、设置NOTASK属性运行期仅做轻量级操作——引用设置、常量值输出、Host 形状计算等这种设计使得编译期完成了绝大多数工作运行时的执行路径极短对整体推理性能的影响可忽略不计。5.2 GeDeletedOp 的防御性设计将应被优化消除的算子显式注册为GeDeletedOp并在运行时返回错误是一种强约束的设计选择。替代方案可以是静默跳过像 NoOp 一样但这会掩盖图优化的问题。当前的实现能在第一时间暴露编译流程的异常并通过关联优化选项名称帮助用户定位问题。5.3 PhonyConcat/PhonySplit 的零拷贝策略PhonyConcat/PhonySplit 的设计体现了编译期规划、运行期零开销的理念。通过在编译期计算好所有参与方的内存偏移量运行时这些节点完全不执行。实际的内存连续性由内存规划器根据CONTINUOUS_INPUT/OUTPUT和偏移量属性来保证。6 涉及的关键文件文件路径职责compiler/engines/local_engine/engine/ge_local_engine.h/.cc引擎入口单例模式插件式注册compiler/engines/local_engine/engine/ge_local_graph_optimizer.h/.cc图优化器处理 PhonyConcat/PhonySplit 属性设置compiler/engines/local_engine/ops_kernel_store/ge_local_ops_kernel_info_store.h/.cc算子信息注册表声明支持的算子类型compiler/engines/local_engine/ops_kernel_store/ge_local_ops_kernel_builder.h/.cc算子构建器计算运行参数和生成任务compiler/engines/local_engine/ops_kernel_store/ge_local_ops_kernel_calc_op_param.h/.ccPhonyConcat/Split 偏移量计算和 ReuseInput 标记compiler/engines/local_engine/ops_kernel_store/op/op_factory.h/.cc算子工厂注册式创建算子实例compiler/engines/local_engine/ops_kernel_store/op/op.h/.cc算子基类compiler/engines/local_engine/ops_kernel_store/op/no_op.h/.ccNoOp 空操作算子注册所有 NoOp 类算子compiler/engines/local_engine/ops_kernel_store/op/ge_deleted_op.h/.cc应删除算子注册所有应在优化阶段被消除的算子compiler/engines/local_engine/common/constant/constant.h引擎名和算子库名常量定义compiler/host_kernels/kernel.hHost Kernel 基类接口compiler/host_kernels/kernel_factory.hHost Kernel 工厂供 DependInputShapeTask 使用compiler/host_kernels/array_ops/shape_kernel.h/.cc等各类 Host Kernel 实现inc/graph_metadef/graph/ge_local_context.h线程本地上下文与 GE Local 引擎无直接关联属于公共基础设施【免费下载链接】geGEGraph Engine是面向昇腾的图编译器和执行器提供了计算图优化、多流并行、内存复用和模型下沉等技术手段加速模型执行效率减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的友好接入能力并同时支持 onnx、pb 等主流模型格式的解析与编译。项目地址: https://gitcode.com/cann/ge创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考