简介#

PyPTO(发音:pai p-t-o)是CANN推出的一款面向AI加速器的高效编程框架,旨在简化算子开发流程,同时保持高性能计算能力。该框架采用创新的PTO(Parallel Tensor/Tile Operation)编程范式,以基于Tile的编程模型为核心设计理念,通过多层次的计算图表达,将用户通过API构建的AI模型从高层次的Tensor计算图逐步编译成硬件指令,最终生成可在目标平台上高效执行的代码,并由设备侧以MPMD(Multiple Program Multiple Data)方式调度执行。

核心架构#

PyPTO框架采用分层架构设计,从用户API到底层硬件执行,共分为以下几个层次:

  • 用户API层(User Interface Layer):是PyPTO框架与开发者交互的接口层,提供Python友好的编程接口,使开发者能够以直观的方式表达计算逻辑,而无需深入了解底层硬件实现细节。

  • 计算图编译层(Compute Graph Compile Layer):PyPTO采用多层级计算图表达,支持从高到低多个抽象层次的计算图的优化和转换。

    • Tensor Graph:高层次的Tensor操作,贴近算法设计者的数学表达式。

    • Tile Graph:硬件感知的Tile操作,充分利用硬件并行性和内存层次结构。

    • Block Graph:子图分区,支持并行执行和资源管理。

    • Execute Graph:执行图,包含依赖关系和调度信息。

    编译过程通过模块化的Pass实现,每个阶段由多个Pass组成,负责特定阶段优化或转换任务。

    • Tensor Graph阶段:实现和硬件无关的图优化,包括冗余操作消除、类型转换、内存冲突推断等。

    • Tile Graph阶段:根据TileShape进行Tile展开,实现Tile级别的优化,包括内存类型分配、移动操作生成、子图切分等。

    • Block Graph阶段:切分生成计算子图,进行Block级别的优化,包括乱序调度、内存重用、同步点插入等。

    • Execute Graph阶段:整合计算子图信息,编排生成最终的执行图。

  • 代码生成层(Code Generation Layer):将优化后的计算图转换为目标平台的可执行代码。

    • 虚拟指令生成:从Execute Graph生成PTO虚拟指令代码(PTO Virtual Instructions)。

    • 目标平台编译:将虚拟指令编译为目标平台代码。

  • 调度执行层(Scheduling & Execution Layer):负责将可执行代码在设备上调度执行。

    • MPMD调度:可执行代码在设备上通过MPMD方式调度到设备处理器核。

    • 控制流执行:管理任务依赖关系,执行控制流逻辑。

核心特性#

  • 技术创新点:

    • 基于Tile的编程模型:计算基于Tile(硬件感知的数据块)进行,充分利用硬件的并行计算能力和内存层次结构。

    • 多层级计算图表达和优化:通过计算图编译层将Tensor Graph转换为Tile Graph、Block Graph和Execute Graph,每一步都包含一系列Pass优化流程。

    • 自动化代码生成:编译结果通过代码生成层生成PTO虚拟指令代码,然后通过编译器编译为目标平台的可执行代码。

    • MPMD执行调度:可执行代码被加载到设备侧,通过MPMD方式调度到设备处理器核,实现高效并行执行。

    • 完整的工具链支持:全流程的编译中间产物和运行时性能数据可以通过IDE集成的工具链进行可视化,以便识别性能瓶颈。开发者还可以通过工具链控制编译和调度行为。

    • Python友好API:提供直观的Tensor级别抽象,贴近算法开发者的思维模式,支持动态Shape和符号化编程。

    • 分层抽象设计:对不同开发者暴露不同的抽象层次,算法开发者使用Tensor层次,性能专家使用Tile层次,系统开发者使用Block层次。

适用场景#

PyPTO适用于以下场景:

  • 深度学习算子开发:快速实现各种神经网络算子。

  • 大模型开发:支持Attention、MoE、FFN等大模型组件。

  • 动态Shape处理:支持动态Batch Size等动态Shape场景。

设计理念#

传统的模型开发通常分为算法开发人员和算子开发人员。这种分工的根源在于高性能算子开发的复杂性:算子开发人员不仅需要理解算子的数学计算属性,还必须考虑如何将其转换为对硬件友好的执行方式。这类似于早期CPU时代,在乱序执行和编译器技术尚未成熟时,程序员需要手动安排流水线指令。

为了降低这种复杂性,PyPTO提出了一种新的编程框架设计理念,旨在简化算子开发流程,同时保留高性能计算的潜力。

  • 计算层设计

    计算层的设计理念是尽可能贴近算法设计者的数学表达式,使用Tensor而非单个元素来描述计算过程。用户通过API构建的AI模型通过Tensor Graph表达,这种设计保留了最大化的优化潜力,包括:

    • 内存布局优化:自动优化数据在内存中的排布方式

    • 数据搬运优化:最小化数据在不同内存层次间的传输

    • 多算子联合优化:识别并融合可优化的算子组合

    通过Tensor作为基本数据单位,计算层能够更自然地表达复杂的数学运算,同时为后续的编译优化提供丰富的信息。

  • 编译层设计

    编译层是连接计算层和执行层的关键环节,负责将Tensor Graph转换为硬件友好的执行形式。编译过程通过多阶段的Lowering Pipeline实现:

    • Tensor Graph到Tile Graph:通过编译Pass将Tensor操作转换为Tile操作,选择Tiling策略,进行布局变换、Tile融合、Tile重排序等。

    • Tile Graph到Block Graph:将Tile图分区为子图,检测同构子图,规范化Block Graph,追踪依赖关系。

    • Block Graph到Execute Graph:构建执行图,分析Block Graph之间的依赖关系,规划全局资源,生成调度提示。

    每个阶段都包含多个优化Pass,通过模块化的图变换和优化流程,将计算层保留的优化空间转化为实际性能提升。

    编译层提供了以下核心能力:

    • 快速可用:保证第一时间生成可运行的结果,满足快速开发的需求。

    • 灵活调优:支持性能敏感的配置调整,方便开发者根据实际需求进行优化。

    • 深度优化:允许高级用户深度定制编译流程,追求极致性能。

  • 执行层设计

    执行层负责将编译后的代码转换为硬件友好的指令并执行。执行过程包括:

    • 代码生成:编译结果通过CodeGen生成底层PTO虚拟指令代码。

    • 目标平台编译:通过编译器将虚拟指令代码编译成目标NPU平台的可执行代码。

    • MPMD调度:可执行代码被加载到设备侧,通过MPMD方式调度到设备上的处理器核。

    通过自动化代码生成技术,执行层能够根据硬件特性自动生成最优的执行指令,充分释放硬件算力。这种设计避免了传统算子开发中手动调整硬件指令的复杂性,同时确保了高性能计算的实现。

  • 工具链设计

    PyPTO提供了完整的工具链支持,包括:

    • 编译中间产物可视化:支持在编译的不同阶段(如Tensor Graph、Tile Graph、Block Graph、Execute Graph等)保存中间产物(计算图),便于调试和分析。

    • 运行时性能分析:收集并可视化运行时性能数据(泳道图),帮助识别性能瓶颈。

    • 编译和调度控制:开发者可以通过工具链控制编译Pass的执行和调度行为,实现深度定制。

    通过上述设计理念,PyPTO实现了算法开发与算子开发的高效协同,显著降低了算子开发的复杂性,同时保留了高性能计算的能力。

支持的产品型号#

PyPTO支持在如下产品型号使用:

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品

  • Atlas A2 训练系列产品/Atlas A2 推理系列产品