资讯动态

CANN/ge 引擎特性分析

发布时间:2026/9/10 7:49:23 来源:尧图企业网站定制
Engine 特性分析1 特性背景1.1 问题域昇腾 AI 处理器是一种异构计算架构其芯片内部集成了多种不同类型的计算单元——AI Core 负责密集矩阵运算如卷积、MatMulVector Core 负责向量运算如 ElementWiseAI CPU 负责不适合硬件加速的通用计算DVPP 负责图像视频预处理HCCL 负责多卡分布式通信。不同类型的算子需要由不同的计算单元执行而一个完整的神经网络模型通常包含多种类型的算子。GEGraph Engine作为昇腾的图编译器和执行器需要解决的核心问题就是如何将一个包含异构算子的计算图正确且高效地映射到芯片上多种不同的执行单元上。这就是 Engine引擎特性存在的意义。1.2 引擎总览引擎注册名典型算子引擎目录AI Core 融合引擎AIcoreEngineConv2D、MatMul、BiasAdd、ReLU、BatchNormcompiler/engines/nn_engine/Vector Core 引擎VectorEngineElementWise、Sqrt、Exp、Log、Castcompiler/engines/nn_engine/FFTS 组合引擎ffts_plus跨引擎融合算子、AICAIV 混合任务compiler/engines/ffts_engine/AI CPU Ascend 引擎aicpu_ascend_kernelSparseToDense、Minimum、Maximum、Roundcompiler/engines/cpu_engine/aicpu_engine/AI CPU TF 引擎aicpu_tf_kernelTensorFlow 格式的 AI CPU 算子compiler/engines/cpu_engine/tf_engine/Host CPU 引擎DNN_VM_HOST_CPU_OP_STORE常量折叠算子、不支持昇腾设备的回退算子compiler/engines/cpu_engine/hostcpu_engine/、base/host_cpu_engine/HCCL 通信引擎ops_kernel_info_hcclAllReduce、Broadcast、AllGather、ReduceScattercompiler/engines/hccl_engine/DVPP 预处理引擎dvpp_ops_kernelImageDecode、Resize、Crop、ColorConvertcompiler/engines/dvpp_engine/RTS 运行时服务引擎DNN_VM_RTS_OP_STOREStreamSwitch、StreamActive、LabelGoto、LabelSetcompiler/engines/rts_engine/GE Local 引擎DNN_VM_GE_LOCAL_OP_STORENetOutput、NoOp、Const、PhonyConcat、PhonySplitcompiler/engines/local_engine/自定义算子引擎DNN_VM_CUSTOM用户自定义 Ascend C 算子compiler/engines/custom_engine/DSA 引擎DSAEngineDSA 专用算子compiler/engines/nn_engine/DSA 子模块注“AI Core 融合引擎” 和 “Vector Core 引擎”统一称为FEFusion Engine, 融合引擎1.3 设计哲学Engine 特性遵循三个核心设计原则插件化每种引擎编译为独立的动态库.so通过统一的 C 函数接口与 GE 框架交互。引擎可以独立开发、独立编译、独立部署GE 框架无需感知引擎内部实现。优先级驱动自动选择系统通过代价模型Cost Model为每个算子自动选择最优引擎用户无需手动指定。代价越低COST_0到COST_10的引擎越优先被选择优先选择意味着更高性能的执行路径。编译期决策 运行期执行引擎选择和图分区在编译期完成运行期直接按编译产物的执行计划驱动。这避免了运行时的引擎分发开销。2 用户使用场景2.1 场景一模型训练默认引擎选择用户使用 PyTorch 或 TensorFlow 训练模型时GE 自动将模型中的计算算子分配到 AI Core 引擎通信算子分配到 HCCL 引擎控制流算子分配到 RTS 引擎。用户无需感知引擎存在。典型流程用户调用Session::AddGraph添加计算图GE 编译器通过EnginePlacer自动为每个算子选择引擎EnginePartitioner按引擎分区为子图各引擎对分配给自己的子图做引擎特定的优化如 FE 融合引擎做算子融合编译产物加载到设备上执行2.2 场景二引擎配置与排除用户可以通过配置选项干预引擎选择行为ge.engineType即CORE_TYPE设置核心计算引擎为AIcoreEngine默认或VectorEngine。两者互斥——选择 VectorCore 时自动排除 AI Core 引擎反之亦然。这适用于不同型号芯片上计算单元配置不同的场景。ge.exec.exclude_engines通过加速器名称排除特定引擎例如排除 DVPP 引擎使视觉预处理算子回退到其他引擎执行。2.3 场景三ACL 单算子执行用户通过 ACL C API 执行单个算子时可以通过aclopEngineType参数指定算子执行引擎ACL_ENGINE_SYS由系统自动选择引擎推荐ACL_ENGINE_AICORE指定算子在 AI Core 上执行影响编译产物的二进制格式使用RT_DEV_BINARY_MAGIC_ELF魔数ACL_ENGINE_VECTOR指定算子在 Vector Core 上执行使用RT_DEV_BINARY_MAGIC_ELF_AIVEC魔数该参数通过aclopCompile、aclopCompileAndExecute、aclopCompileAndExecuteV2以及aclopCreateKernel等 API 传入。2.4 场景四自定义算子引擎用户开发自定义算子时GE 提供DNN_VM_CUSTOM引擎优先级最高COST_0用于承载自定义算子实现。自定义算子的OpsKernelInfoStore直接在OpsKernelManager初始化时创建不需要编译为独立的 SO 文件。2.5 场景五Host CPU 回退执行当某些算子不支持在昇腾设备上执行时可以通过hostExecFlag选项将算子回退到主机 CPU 执行。HostcpuEngineUpdatePass会在引擎重分配阶段标记这些算子为DNN_VM_HOST_CPU引擎。Host CPU 引擎的优先级最低COST_10只有在所有设备引擎都不支持时才会被选中。3 接口3.1 ACL 层枚举定义于inc/external/acl/acl_op.haclopEngineType枚举枚举值含义ACL_ENGINE_SYS系统自动选择引擎ACL_ENGINE_AICORE指定 AI Core 引擎ACL_ENGINE_VECTOR指定 Vector Core 引擎当前状态根据docs/graph_engine_api/aclopEngineType.md的官方文档当前仅支持ACL_ENGINE_SYSACL_ENGINE_AICORE和ACL_ENGINE_VECTOR暂不支持。3.2 ACL 算子编译与执行 API以下 API 接受aclopEngineType参数API说明aclopCompile编译算子时指定引擎类型aclopCompileAndExecute编译并执行算子aclopCompileAndExecuteV2V2 版编译并执行aclopCreateKernel创建自定义 Kernel 时指定引擎类型aclGenGraphAndDumpForOp生成并 dump 算子图3.3 GE 内部枚举定义于inc/graph_metadef/common/ge_common/ge_types.hge::OpEngineType枚举枚举值含义ENGINE_SYS默认引擎ENGINE_AICOREAI Core 引擎ENGINE_VECTORVector 引擎ENGINE_AICUBEAI Cube不支持ENGINE_AIVECTORAI Vector不支持ACL 层的aclopEngineType在编译流水线内部转换为ge::OpEngineType在api/acl/acl_op_executor/single_op/compile/op_compiler.cpp的MakeCompileParam中完成转换。3.4 引擎配置选项选项 Key类型含义ge.engineTypestring核心引擎类型AIcoreEngine默认或VectorEngine两者互斥ge.exec.exclude_enginesstring排除指定引擎逗号分隔的加速器名称ge.aicoreNumint32配置 AI Core 数量ge.exec.enableEngineParallelstring是否启用引擎并行执行ge.exec.engineParallelConfigPathstring引擎并行配置文件路径ac_parallel_enablestring1启用异构引擎间并行如 AI CPU 与 AI Core 并行3.5 DNNEngine 基类接口定义于inc/framework/engine/dnnengine.hDNNEngine类接口说明Initialize(options)初始化引擎默认空实现由子类覆盖Finalize()终结引擎GetAttributes(attr)获取引擎属性DNNEngineAttributeIsAtomic()是否为原子引擎DNNEngineAttribute结构体包含以下字段字段类型含义engine_namestring引擎名称mem_typevectorstring内存类型如 HBMcompute_costPriorityEnum计算代价优先级COST_0~COST_10runtime_typeRuntimeType运行时类型HOST或DEVICEengine_input_formatFormat引擎输入格式engine_output_formatFormat引擎输出格式atomic_engine_flagbool是否为原子引擎4 具体实现4.1 整体架构4.2 引擎类型体系GE 系统中存在三套相互配合的引擎类型体系编译期引擎DNNEngine 体系15 种引擎类型均继承自DNNEngine基类定义于compiler/engines/manager/engine/dnnengines.h。引擎类注册名优先级运行时类型原子引擎说明CustomDNNEngineDNN_VM_CUSTOMCOST_0DEVICE是用户自定义算子引擎AICoreDNNEngineAIcoreEngineCOST_1DEVICE是AI Core 矩阵计算引擎FftsPlusDNNEngineffts_plusCOST_1DEVICE否FFTS 融合引擎组合引擎VectorCoreDNNEngineVectorEngineCOST_2DEVICE是Vector Core 向量计算引擎DSADNNEngineDSAEngineCOST_2DEVICE是DSA 引擎AICpuDNNEngineDNN_VM_AICPU_ASCENDCOST_3DEVICE是AI CPU Ascend 引擎AICpuTFDNNEngineDNN_VM_AICPUCOST_4DEVICE是AI CPU TensorFlow 引擎DvppDNNEngineDNN_VM_DVPPCOST_5DEVICE是DVPP 数字视觉预处理引擎GeLocalDNNEngineDNN_VM_GE_LOCALCOST_9DEVICE是GE 本地引擎兜底HostCpuDNNEngineDNN_VM_HOST_CPUCOST_10HOST是主机 CPU 引擎最低优先级RtsDNNEngineDNN_VM_RTSCOST_2DEVICE是运行时服务引擎RtsFftsPlusDNNEngineDNN_VM_RTS_FFTS_PLUSCOST_2DEVICE是RTS FFTS 引擎HcclDNNEngineDNN_HCCLCOST_2DEVICE是集合通信引擎AICpuFftsPlusDNNEngineDNN_VM_AICPU_FFTS_PLUSCOST_2DEVICE是AI CPU FFTS 引擎AICpuAscendFftsPlusDNNEngineDNN_VM_AICPU_ASCEND_FFTS_PLUSCOST_2DEVICE是AI CPU Ascend FFTS 引擎优先级排列规律自定义引擎最高0专用硬件引擎次之1-2通用 CPU 引擎较低3-5兜底引擎最低9-10。运行时 V2 引擎NodeConverter 体系定义于runtime/v2/engine/通过REGISTER_NODE_CONVERTER宏注册按引擎名执行位置placement做节点 Lowering。引擎目录说明aicore/AI Core 节点 Lowering 和 kernel launchaicpu/AI CPU 节点转换custom/自定义算子 kerneldsacore/DSA Core 节点转换dvpp/DVPP 预处理节点转换ffts_plus/FFTS 更新操作gelocal/GE 本地引擎Const、NetOutput、Variable、If、While 等rts/运行时服务节点转换4.3 引擎注册机制4.3.1 编译期引擎注册EngineManager引擎注册采用轻量级属性载体 重量级插件能力的两层分离设计。第一层DNNEngine 注册属性载体定义于compiler/engines/manager/engine/engine_manager.cc入口函数GetDNNEngineObjs()逐一调用RegisterAiCoreEngine()、RegisterVectorEngine()等 15 个注册函数。每个注册函数的内部模式一致构造DNNEngineAttribute结构体名称、优先级、运行时类型等创建对应的DNNEngine子类实例如AICoreDNNEngine调用EngineManager::RegisterEngine(name, ptr)注册到全局engine_map_DNNEngine本身只携带属性信息不包含任何算子编译或执行逻辑。第二层OpsKernelInfoStore GraphOptimizer OpsKernelBuilder 注册引擎能力每种引擎编译为独立的.so文件存放于plugin/opskernel/目录下SO 文件引擎libfe.soAI Core / Vector Core 融合引擎libge_local_engine.soGE 本地引擎librts_engine.soRTS 引擎libaicpu_ascend_engine.soAI CPU Ascend 引擎libhost_cpu_engine.soHost CPU 引擎libaicpu_tf_engine.soAI CPU TF 引擎libffts.soFFTS 引擎libdvpp_engine.soDVPP 引擎libhcom_graph_adaptor.soHCCL 引擎每个 SO 导出标准 C 接口Initialize()、GetOpsKernelInfoStores()、GetGraphOptimizerObjs()、Finalize()。OpsKernelManager::Initialize()通过PluginManager动态加载这些 SO 并调用接口获取组件对象。这种两层分离的设计使得引擎发现discovery和引擎能力capability解耦——DNNEngine 负责注册身份OpsKernelInfoStore / GraphOptimizer / OpsKernelBuilder 负责实际工作。4.3.2 运行时 V2 引擎注册NodeConverterV2 运行时通过REGISTER_NODE_CONVERTER和REGISTER_NODE_CONVERTER_PLACEMENT宏注册节点转换器// 注册宏定义inc/graph_metadef/register/node_converter_registry.h REGISTER_NODE_CONVERTER(type, func) REGISTER_NODE_CONVERTER_PLACEMENT(type, placement, func)典型注册示例// AI Core 引擎设备侧 REGISTER_NODE_CONVERTER_PLACEMENT(ge::kEngineNameAiCore.c_str(), kOnDeviceHbm, LoweringAiCoreNode); // AI CPU 引擎设备侧 REGISTER_NODE_CONVERTER_PLACEMENT(ge::kEngineNameAiCpu.c_str(), kOnDeviceHbm, LoweringAiCpuNode); // Host CPU 引擎主机侧 REGISTER_NODE_CONVERTER_PLACEMENT(ge::kEngineNameHostCpu.c_str(), kOnHost, LoweringAiCpuNode);NodeConverterRegistry单例管理全局注册表在编译期通过GraphConverter完成节点到 kernel 的映射。4.4 引擎管理与调度4.4.1 编译期管理器DNNEngineManagercompiler/engines/manager/engine_manager/dnnengine_manager.h是编译期的引擎管理核心采用单例模式核心方法职责Initialize()加载引擎 SO、调用GetDNNEngineObjs()注册所有 DNNEngine、解析engine_conf.json配置GetDNNEngineName(node, exclude_engines)为算子选择引擎——遍历 OpInfo 列表调用CheckSupported()返回第一个支持的引擎GetExcludeEngines()根据配置排除特定引擎CORE_TYPE互斥 EXCLUDE_ENGINES列表GetCompositeEngineName()查找子图是否全部属于同一组合引擎IsStreamAssignSkip()根据引擎配置决定是否跳过流分配OpsKernelManagercompiler/engines/manager/opskernel_manager/ops_kernel_manager.h连接引擎和算子内核库核心方法职责Initialize()加载插件 SO、收集所有 OpsKernelInfoStore 和 GraphOptimizerInitOpsKernelInfo()构建全局算子信息索引按compute_cost升序排序GetAllOpsKernelInfo()查询某算子类型在所有引擎中的 OpInfo 列表engine_conf.jsoncompiler/engines/manager/engine_manager/engine_conf.json定义调度配置配置项含义independent是否需要独立流仅 HCCL 引擎为 trueattach是否附着到其他流skip_assign_stream是否跳过流分配4.4.2 引擎分配EnginePlacerEnginePlacercompiler/graph/partition/engine_place.h负责为图中每个节点分配引擎核心流程引擎选择采用贪心策略——按优先级从高到低遍历第一个CheckSupported()通过的引擎被选中。使用线程池默认 16 线程并行为节点选择引擎通过 mutex 保护共享数据。引擎重分配ReAssignEngine()通过策略模式实现。EngineReAssignPass是策略接口当前有两种实现DynamicDataFlowEngineReassignPass动态数据流场景下的引擎重分配HostcpuEngineUpdatePass将标记了hostExecFlag的算子重新分配到 Host CPU 引擎4.4.3 按引擎切分子图EnginePartitionerEnginePartitionercompiler/graph/partition/engine_partitioner.h根据引擎分配结果将计算图分割为子图分区采用Cluster-Based 贪心算法初始化为每个节点创建一个 Cluster标记按照引擎分配结果标记每个 Cluster 的引擎合并如果相邻 Cluster 属于同一引擎且不存在多条数据路径HasSecondPath检查则合并分裂按合并后的 Cluster 边界插入PlaceHolder和End节点两级分区Composite Atomic的设计原因融合引擎如 FFTS需要先看到完整的可融合区域做融合优化原子引擎分区是在融合优化之后才做精细划分。分区后各子图被分配给不同引擎通过线程池并行执行引擎特定的子图优化OptimizeFusedGraph。4.5 各类引擎实现细节4.5.1 nn_engineAI Core / Vector Core 融合引擎目录compiler/engines/nn_engine/SO 文件libfe.so这是最核心、最复杂的引擎负责 AI Core 和 Vector Core 上的所有密集计算。实现包含三大组件组件文件职责FEOpsKernelInfoStoreoptimizer/ops_kernel_store/fe_ops_kernel_info_store.h算子信息管理从 JSON 加载算子描述、CheckSupported()检查支持性、CompileOp()调用 TBE 编译器FEGraphOptimizeroptimizer/graph_optimizer/fe_graph_optimizer.h多阶段图优化原始图优化、融合后优化、流图优化、全图优化包含 FormatDtypeSetter、OpCompiler、TransNodeManager、BufferFusion 等子组件AICoreOpsKernelBuilderoptimizer/ops_kernel_builder/aicore_ops_kernel_builder.h计算运行参数workspace 大小、生成设备执行任务目录结构nn_engine/ fusion/ -- 融合规则管理 opskernel/ -- OpsKernelInfoStore 实现 optimizer/ graph_optimizer/ -- 核心图优化器及子优化器 ops_kernel_store/ -- FE OpsKernelInfoStore ops_kernel_builder/ -- FE OpsKernelBuilder fusion_manager/ -- 融合管理 cmo/ -- Cache Management Optimization utils/ -- 工具函数4.5.2 cpu_engineAICPU / HostCpu目录compiler/engines/cpu_engine/SO 文件libaicpu_ascend_engine.so、libhost_cpu_engine.so、libaicpu_tf_engine.so架构特点BaseEnginecommon/engine/base_engine.h是 CPU 引擎的内部基类与公共层的DNNEngine不同。每个 CPU 引擎包含三个组件AicpuOpsKernelInfoStore、AicpuGraphOptimizer、AicpuOpsKernelBuilder使用工厂模式FACTORY_ENGINE::RegisterCLASS宏注册子引擎通过extern C导出标准接口子引擎AicpuEnginecpu_engine/aicpu_engine/在设备侧 AI CPU 上执行昇腾原生算子HostCpuEnginecpu_engine/hostcpu_engine/在主机 CPU 上执行算子runtime_type HOST优先级最低TfEnginetf_engine/执行 TensorFlow 格式的 AI CPU 算子4.5.3 hccl_engineHCCL 集合通信引擎目录compiler/engines/hccl_engine/SO 文件libhcom_graph_adaptor.so处理分布式训练中的集合通信操作AllReduce、Broadcast、AllGather、ReduceScatter 等唯一使用独立流的引擎engine_conf.json中independent: true不与其他引擎共享流支持通信融合优化hcom_broadcast_fusion、hcom_reduce_fusion 等包含自动调优模块auto_tuning/4.5.4 dvpp_engineDVPP 数字视觉预处理引擎目录compiler/engines/dvpp_engine/SO 文件libdvpp_engine.so处理图像/视频的解码、缩放、色彩转换等预处理操作按芯片型号有不同实现如ascend910b/通过DvppChipCapability做能力适配包含DvppOpsKernelInfoStore、DvppGraphOptimizer、DvppOpsKernelBuilder三个标准组件4.5.5 rts_engineRTS 运行时服务引擎目录compiler/engines/rts_engine/SO 文件librts_engine.so处理运行时控制流算子StreamSwitch、StreamActive、Label 等包含两个 OpsKernelInfoStore常规 RTS 和 FFTS 模式配置为skip_assign_stream: true, attach: true附着到其他流不需要独立流分配4.5.6 local_engineGeLocal 兜底引擎目录compiler/engines/local_engine/SO 文件libge_local_engine.so处理不属于任何专用引擎的算子如 NetOutput、NoOp、Const 等优先级COST_9倒数第二低作为兜底引擎OpFactory管理各种本地算子配置为skip_assign_stream: true, attach: true4.5.7 ffts_engineFFTS 融合引擎目录compiler/engines/ffts_engine/SO 文件libffts.so唯一的组合引擎atomic_engine_flag false优先级COST_1统一管理子图中跨原子引擎的算子融合调度任务构建器按上下文分类型AICAIV 混合、AICPU、DSA、RuntimeOps、CollectionOps配置为skip_assign_stream: true由 FFTS 自身管理流通过GetCompositeEngines()声明其包含的原子引擎集合4.5.8 custom_engine自定义算子引擎目录compiler/engines/custom_engine/优先级最高COST_0确保用户自定义算子优先被选中直接在OpsKernelManager::Initialize()中创建不从 SO 文件加载CustomOpsKernelInfoStore维护自定义算子的 OpInfo 映射4.5.9 HostCpuEnginebase 层基础实现目录base/host_cpu_engine/文件host_cpu_engine.h/host_cpu_engine.cc与 compiler 侧的HostCpuEngineBaseEngine子类互补提供更基础的主机 CPU 执行能力单例模式HostCpuEngine::GetInstance()通过dlopen动态加载libconstant_folding_ops.so和libops_host_cpu.so用于编译期的常量折叠和运行期的 Host CPU 算子执行4.6 运行时引擎执行4.6.1 Runtime V2ExeGraph 执行引擎V2 采用编译期 Lowering 运行时直接执行模式。核心区别V1 在运行时动态分派NodeExecutorV2 在编译期通过NodeConverter将计算图节点降级为可执行的 ExeGraph执行图运行时直接按 ExeGraph 拓扑顺序执行 kernel 函数指针消除了运行时的分发开销。NodeConverter 的标准 Lowering 流程InferShape— 推导输出 shapeAllocOutputMemory— 分配输出内存AllocWorkspace— 分配 workspaceBuild Launch Graph— 构建启动 kernel 的执行图节点FreeWorkspace— 释放 workspace返回LowerResult包含 order_holders、out_shapes、out_addrsAI Core 引擎的 Lowering更复杂额外涉及Tiling 数据计算runtime/v2/graph_builder/bg_tiling.hkernel 编译结果查找原子操作处理FFTS Plus 子任务刷新V2 执行器类型runtime/v2/core/executor/执行器说明SequentialExecutor顺序执行静态图TopologicalExecutor拓扑排序执行动态图MultiThreadTopologicalExecutor多线程拓扑执行PriorityTopologicalExecutor优先级拓扑执行StreamExecutorruntime/v2/core/stream_executor.cc为每个 stream 创建独立的ModelV2Executor实现 stream 级别的执行隔离。Host CPU 在 V2 中的实现Host CPU 和 AICPU 共享同一个 Lowering 函数LoweringAiCpuNode通过placement参数kOnHostvskOnDeviceHbm区分执行位置。这种设计减少了代码重复统一了 CPU 类算子的 Lowering 逻辑。4.7 引擎在编译流程中的完整位置4.8 原子引擎与组合引擎GE 将引擎分为两种角色原子引擎 (Atomic Engine)atomic_engine_flag true直接处理单个算子。大多数引擎都是原子引擎。组合引擎 (Composite Engine)atomic_engine_flag false当前仅ffts_plus统一管理多个原子引擎支持跨引擎的算子融合调度。OpsKernelManager维护atomic_2_composite_映射表将原子引擎映射到所属的组合引擎。引擎分区时先按组合引擎分区让组合引擎看到完整的可融合区域再按原子引擎做精细分区。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价