CANN 组织链接: https://atomgit.com/cann
GE 仓库链接: https://atomgit.com/cann/ge
1. GE 图编译器的优化管线(Optimization Pipeline)
GE 的核心竞争力在于其多级图优化管线。当一个原始计算图进入 GE 后,它不仅仅是简单的格式转换,而是经历了一系列复杂的变换过程,旨在生成适配达芬奇架构的最优执行图。
1.1 算子拆分与维度推导
原始图中的某些高级算子可能无法直接映射到底层硬件指令。GE 首先执行算子拆分 ,将复杂的复合算子(如特定的 RNN 单元或自定义层)分解为硬件支持的基础算子序列(如 MatMul、Add、Activation)。
紧接着,GE 进行全图的形状(Shape)与类型(Type)推导。即使输入是动态形状,GE 也会尝试在编译期推导出中间节点的维度范围。这一步对于后续的内存静态分配至关重要,它确定了每个中间张量所需缓冲区的上限。
1.2 高级图融合策略
除了基础的算子融合,GE 还执行更深层次的图变换:
- 水平融合(Horizontal Fusion): 当图中存在多个相同类型且输入源相同的算子(例如多个并行的卷积层处理同一张特征图)时,GE 会尝试将其合并为一个大算子(如 Group Convolution),以增加单次计算的数据量,提升并行度。
- 跨层融合: 对于特定的网络结构(如 ResNet 的残差块),GE 能够识别并应用特定的融合模板,将跨越多个层级的计算逻辑折叠,减少 kernel 启动的开销。
1.3 数据排布格式优化(Format Optimization)
昇腾 NPU 对特定的数据排布格式(如 5D 格式 NC1HWC0)有极致的访存效率,而主流框架通常使用 4D 格式(NCHW 或 NHWC)。
GE 在编译过程中,会自动插入格式转换算子 (TransData)。更进一步,GE 通过全图分析,利用**格式传播(Format Propagation)**技术,尽可能将格式转换操作推导至网络的边界(输入/输出端),使得网络内部的绝大多数计算都直接在高效的 NC1HWC0 格式下进行,消除中间不必要的转换开销。
2. 离线模型(OM)生成与加载机制
GE 的最终产物通常是离线模型(Offline Model, OM)。OM 文件不仅是权重的集合,更是编译后图结构的序列化表示。
2.1 OM 文件结构解析
OM 文件是一个自包含的二进制包,主要包含:
- 模型描述头(Model Header): 存储模型版本、输入输出节点信息及所需的总内存大小。
- 拓扑结构数据: 经过 GE 优化后的节点连接关系和属性。
- 权重数据(Weights): 经过格式转换和量化(如果启用)后的参数数据。
- 任务序列(Task Sequence): 这是最关键的部分,它包含了直接面向 Runtime 的指令流描述。GE 将图中的节点映射为具体的任务(Task),如 Kernel Launch Task、Memcpy Task 等。
2.2 零拷贝加载(Zero-Copy Loading)
在模型加载阶段,由于 OM 文件中已经包含了静态内存规划信息,Runtime 可以直接根据头部信息申请一整块连续的 Device 内存。模型权重可以直接通过 DMA(直接内存访问)从 Host 侧加载到这块预分配内存的指定偏移位置,无需在 Device 侧进行额外的内存重排或多次拷贝,实现了加载即就绪的高效启动。
3. 执行流(Stream)调度与并发控制
GE 的执行引擎负责将编译好的任务序列调度到硬件 Stream 上。
3.1 任务间的依赖管理
尽管计算图定义了数据依赖,但在硬件执行层面,这种依赖需要转换为同步原语。GE 在生成任务序列时,会自动分析节点间的依赖关系。
- 对于同一 Stream 内的任务,按照队列顺序天然保序。
- 对于跨 Stream 的任务(如计算流等待数据搬运流),GE 会插入 Event Record 和 Event Wait 指令。这确保了在启动计算任务前,所需的数据必须已经准备就绪,防止数据竞争。
3.2 异步执行模型
GE 采用完全异步的执行模型。当 Host 侧下发推理请求时,GE 仅负责将任务描述符推送到 NPU 的硬件队列中,随即立即返回。NPU 上的 Task Scheduler 硬件单元负责后续的指令分发和执行。这种机制将 Host CPU 从繁重的任务分发工作中解放出来,使其能够专注于预处理或业务逻辑,最大化系统的整体吞吐量。
4. 动态分档(Dynamic Batch/Image Size)支持
为了应对实际业务中多变的输入请求,GE 提供了动态分档机制。
用户可以在编译时预设多个档位(例如 Batch Size = 1, 4, 8, 16)。GE 会为每个档位生成对应的 Tiling 策略和内存规划,并将它们打包在同一个 OM 文件中。
在运行时,GE 根据实际输入数据的维度,自动匹配最接近的预设档位,选择对应的计算路径和参数。这既保留了静态编译的高性能优势,又赋予了模型一定的动态适应能力,避免了为每个 batch size 单独编译模型的繁琐。
CANN 组织链接: https://atomgit.com/cann
GE 仓库链接: https://atomgit.com/cann/ge