深入理解pyasc架构:从Python前端到Ascend C代码生成的五大模块完全拆解
深入理解pyasc架构从Python前端到Ascend C代码生成的五大模块完全拆解【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyascpyasc是华为开源的昇腾算子编程项目为 Python 用户提供与 Ascend C 一一对应的算子编程接口支持在昇腾 AI 处理器Ascend 910B / 910C上加速计算。整个项目由五大核心模块组成编译和运行模块、Python 前端模块、AST 转 ASC-IR 模块、ASC-IR 定义模块、Ascend C 代码生成模块。本文将带你从零拆解这五大模块如何协作把一行asc.jit装饰的 Python 函数变成 NPU 上可执行的 Kernel 二进制。一、pyasc 架构全景一张图看懂分层设计pyasc 采用经典的前端 → 中间表示 → 后端编译器分层架构整体分为四层各层职责如下分层组成部分职责Python 界面Language runtime提供与基础/高阶 API 1:1 对应的 Kernel 开发接口asc.jit装饰符提供编译和运行入口扩展 DialectASC-IR EmitAsc-IR基于 MLIR 扩展定义 Ascend C 类和接口以及 MLIR 转 C 代码类的接口Ascend C基础 API 高阶 API包括计算 API 和框架 API 接口基础组件毕昇编译器 Runtime Profiling 工具负责最终编译、运行与性能分析这种设计的核心思想是用户只需要会 Python后端的所有复杂性IR、Pass、代码生成由框架自动完成。二、核心模块关系图一次算子执行的完整旅程在深入五大模块之前先看整体数据流——这是理解整个项目最重要的图整条链路可以概括为一句话Python 代码 →AST Visitor 遍历→ ASC-IR →Translation CodeEmitter→ Ascend C 代码 →毕昇编译器→ 二进制文件 →Runtime→ 输出结果下面逐个拆解这五大模块。三、五大模块逐个拆解模块 1编译和运行模块入口与总调度这是用户直接接触的模块位于 python/asc/runtime/ 目录。它的核心是JITJust-In-Time机制编译入口用asc.jit装饰核函数Kernel 函数小括号()传入编译参数如kernel_type、opt_level运行入口执行时通过中括号[]传入运行时配置核数、Stream例如 examples/01_add/add.py 中的调用方式vadd_kernelUSE_CORE_NUM, rt.current_stream()编译流程由 python/asc/runtime/compiler.py 中的Compiler类驱动它会组装编译命令并调用毕昇编译器生成 NPU 上可执行的 Kernel 文件。运行流程由 python/asc/runtime/launcher.py 中的Launcher类负责调用 Ascend C Runtime 接口加载并执行 Kernel 二进制。两个实用小技巧设置环境变量PYASC_DUMP_PATH可以查看编译过程中生成的 ASC-IR 和 Ascend C 代码文件JIT 编译缓存会自动复用已编译的 Kernel 二进制避免重复编译缓存根目录可用PYASC_HOME配置模块 2Python 前端模块与 Ascend C 1:1 对应的接口层位于 python/asc/language/ 目录提供与 Ascend C API一一对应的 Python 接口分为四类子目录内容对应 Ascend Casc/language/adv/高阶 APIMatmul、Softmax、SwiGLU 等AscendC 高阶 APIasc/language/basic/基础 APIDataCopy、VecAdd 等Ascend 基础 APIasc/language/core/核心数据结构GlobalTensor、LocalTensor核心数据结构与枚举asc/language/fwk/框架类接口TPipe、TQue同步和内存管理框架Python 接口与 Ascend C 接口是 1:1 映射的例如 Ascend C 的AscendC::Add对应 Python 的asc.addAscendC::DataCopy对应asc.data_copy。接口的完整文档可以在 docs/python-api/ 目录下找到每个 API 都有独立的说明文件。一个典型例子见 examples/01_add/add.py用纯 Python 语法描述数据搬运data_copy、流水线同步set_flag/wait_flag和向量计算add框架自动处理底层的内存布局与硬件调度。模块 3AST 转 ASC-IR 模块Python 语法树 → 中间表示这是编译管线中承上启下的一环位于 python/asc/codegen/ 目录模块入口是 python/asc/codegen/function_visitor.py 中的FunctionVisitor类。它的工作原理分三步解析用 Python 标准库ast模块把被asc.jit装饰的函数解析成抽象语法树AST遍历FunctionVisitor逐个访问 AST 节点根据节点类型赋值、循环、函数调用等生成对应的 IR 代码构建 IR通过 pybind11 机制调用 C 侧的 ASC-IR 创建接口把参数列表映射成 IR 的 Operation 参数需要特别注意的一点约束并非所有 Python 语法都支持。AST 转 IR 时模块会检查语法是否在支持范围内不支持的语法会抛出明确的错误。支持的 Python 语法范围请查阅 docs/python_syntax_support.md。模块 4ASC-IR 定义模块基于 MLIR 的中间表示ASC-IR 是基于MLIRMulti-Level Intermediate Representation定义的 Dialect定义目标非常明确1:1 映射 Ascend C API并可直接由 Python 代码 JIT 生成 Ascend C 代码。ASC Dialect 由四要素构成Type类型定义 LocalTensor、GlobalTensor、TQue、TBuf 等类型Attribute属性定义 Layout、Format、Event 等枚举类型属性Interfaces接口为所有 Operation 提供统一接口如获取 API 函数名、IR 注释Operation操作对应 Ascend C 的 API 操作如 SetFlag、WaitFlag、TPipe 等类型和操作的定义采用 TableGen 描述文件位于 include/ascir/Dialect/Asc/IR/ 目录其中Basic/下的 42 个.td文件对应基础 API 操作如 OpCopy.td 定义 DataCopy 相关操作Adv/下对应高阶 API如 Matmul.td。相关的 Pass编译器变换实现位于 lib/Dialect/Asc/Transforms/ 目录包括插入同步InsertSync.cpp、UB 内存提升HoistUBAllocation.cpp等。模块 5Ascend C 代码生成模块IR → C 源码后端最后一环负责把 ASC-IR 转换成等价的 Ascend C 代码。核心入口是 lib/Target/AscendC/Translation.cpp其工作方式是Translation作为代码生成入口遍历整个 MLIR Module对每个 IR Operation调用CodeEmitter封装的方法按 API 分类分发到对应的发射器各类 Emitter 将 IR 结构映射为 Ascend C 语法结构代码生成的实现按 API 类型分目录组织位于 lib/Target/AscendC/子目录职责示例文件Adv/高阶 API 代码生成Matmul.cpp、Activation.cppBasic/基础 API 代码生成DataCopy.cpp、SwapMem.cppCore/Tensor 等核心数据结构LocalTensor.cppExternal/MLIR 外部方言Arith、SCF 等Scf.cppFwk/TQue、TBuf 框架类TQue.cpp生成的 Ascend C 代码随后交给毕昇编译器编译成二进制文件最终由 Runtime 加载执行——这就完成了从 Python 到 NPU 的全链路闭环。四、前后端划分一张表总结模块归属项目把五大模块划分为前端Python 为主和后端C 为主两大部分模块归属主要目录核心技术编译和运行模块前端python/asc/runtime/JIT 编译、缓存、Runtime 调度Python 前端模块前端python/asc/language/与 Ascend C 1:1 对应的 APIAST 转 ASC-IR 模块前端python/asc/codegen/AST Visitor pybind11ASC-IR 定义模块后端include/ascir/ lib/Dialect/MLIR Dialect、TableGenAscend C 代码生成模块后端lib/Target/AscendC/CodeEmitter、Translation五、动手体验从示例验证架构理解理解架构最好的方式是跑一个例子。项目提供了 8 个由浅入深的示例位于 examples/ 目录01_add最基础的向量加法覆盖 data_copy 流水线同步 VecAdd 三大基础 API02_add_framework引入 TQue/TBuf 框架类03_matmul_mix 与 05_matmul_leakyreluCube Vector 混合计算06_gelu 与 07_swiglu高阶算子含 bench 基准测试 与 msprof 性能剖析每个示例都附带 README 说明运行示例后配合PYASC_DUMP_PATH环境变量查看中间生成的 Ascend C 代码你能直观看到模块 3 生成 IR → 模块 5 生成 C 代码的完整过程。六、总结pyasc 架构的设计精髓回顾全文pyasc 的架构精髓可以总结为三点接口 1:1 对齐Python 前端接口与 Ascend C 严格一一对应学过 Ascend C 的开发者可以零成本迁移纯 Python 用户也能快速上手MLIR 驱动的后端借助 MLIR 成熟的 Dialect Pass 基础设施用一套 IR 同时支撑代码生成和未来的优化变换是工业级编译器架构的标准做法JIT 无缝体验asc.jit一个装饰符打通了从 Python 源码到 NPU 二进制的整条管线配合编译缓存开发体验接近纯 Python如果你想继续深入推荐按以下路径阅读先通读 docs/architecture_introduction.md 获取完整的模块文档再通过 docs/developer_guide.md 了解项目开发流程最后在 examples/ 中动手实践完成从看懂架构到用上 pyasc的跨越。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考