尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Paddle PHI 算子代码自动生成管线详解:从 YAML 算子定义到 C++ API、动态图与 PIR 的全链路代码生成

Paddle PHI 算子代码自动生成管线详解:从 YAML 算子定义到 C++ API、动态图与 PIR 的全链路代码生成 Paddle PHI 算子代码自动生成管线详解从 YAML 算子定义到 C API、动态图与 PIR 的全链路代码生成【免费下载链接】PaddlePArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice 『飞桨』核心框架深度学习机器学习高性能单机、分布式训练和跨平台部署项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle导读Paddle飞桨PHI 体系采用YAML 驱动的代码生成方式算子元信息统一维护在 YAML 定义文件中构建时由多套生成器脚本自动产出 C API、动态图函数、Python-C 绑定、静态图 Op 与 PIR 算子定义等多层代码。本篇文章以.agents/skills/paddle-design-phi-kernel/references/codegen-pipeline.md为骨架结合当前仓库源码逐层拆解这条生成管线——读完你将掌握 YAML 中每个字段的语义、各层生成器脚本与产出文件的对应关系、CMake 构建集成方式以及新增一个算子只需写 YAML 与 kernel的完整实战流程。一、概述为什么用 YAML 驱动代码生成在 PHI 体系中算子实现与算子声明被彻底分离开发者只需在 YAML 文件中描述算子的输入输出、属性、kernel 映射与形状推导函数再手写核心的 kernel 计算逻辑其余所有粘合代码C API 函数、kernel 选择与数据准备、动态图反向节点、Python 绑定、静态图 Op 注册等全部由生成器脚本自动产出。这种设计带来了三个直接收益单一事实来源算子元信息只维护一份 YAML各层代码从同一份定义生成避免多层手写导致的参数不一致新增算子成本极低中间层代码量大且模式固定交给模板自动生成人工只关注 YAML 声明与 kernel 实现一致性可校验配合cross_validate.py等脚本可以在生成前校验 YAML 之间的兼容性详见第五节。二、YAML 定义文件算子元信息的单一事实来源所有算子元信息以 YAML 格式维护在 paddle/phi/ops/yaml/ 目录下。除文档中列出的核心文件外当前仓库还包含若干扩展定义文件完整清单如下文件内容ops.yaml前向算子定义输入、输出、属性、kernel 映射、infer_metabackward.yaml反向算子定义fused_ops.yaml融合算子如 fused_attention、fused_feedforwardfused_backward.yaml融合算子反向定义sparse_ops.yaml稀疏算子SparseCoo / SparseCsr前向定义sparse_backward.yaml稀疏算子反向定义op_compat.yaml新旧算子名称 / 参数名映射保证兼容性op_version.yaml算子版本管理记录不兼容变更strings_ops.yaml字符串StringTensor算子定义python_api_info.yamlPython API 相关信息说明inconsistent/与legacy/子目录存放特殊场景不一致/遗留的算子定义常规新增算子不涉及。ops.yaml 单条记录示例文档给出了经典示例当前仓库 ops.yaml 中abs算子的真实记录与之结构一致- op : abs args : (Tensor x) output : Tensor(out) infer_meta : func : RealAndImagInferMeta spmd_rule : ElementwiseUnaryInferSpmd kernel : func : abs data_type : x inplace: (x - out) backward : abs_grad interfaces : paddle::dialect::InferSymbolicShapeInterface, paddle::dialect::LayoutTransformationInterface traits: pir::UnaryElementWiseTrait各字段含义字段含义说明op算子名称全局唯一作为后续生成代码的函数名 / 注册名基础args输入和属性声明括号包裹、逗号分隔Tensor为张量输入float/int64_t/bool/str/Scalar为属性可带默认值如float rho 0.95foutput输出声明支持多输出如Tensor(out)、Tensor(accuracy), Tensor(correct), Tensor(total)infer_meta.func形状推导函数名对应 paddle/phi/infermeta/ 下的 C 函数infer_meta.spmd_rule分布式 SPMD 规则函数名分布式场景下推导张量分布式属性的函数如ElementwiseUnaryInferSpmdinfer_meta.param传给 infer_meta 的参数子集默认传全部输入可用param: [x, y]显式指定kernel.funcPHI kernel 函数名可声明多个 kernel 变体如adagrad {dense, ... - dense, ...}用花括号标注输入输出变体dense / selected_rowskernel.data_typekernel DataType 推断来源此处取输入x的 dtype决定 kernel 按什么类型分派backward关联的反向算子名如abs_grad供动态图反向节点生成时引用inplace原地计算映射(x - out)表示输出直接复用输入 x 的存储生成器会据此把返回类型改为Tensoroptional可选输入/输出如optional : master_param, master_param_out对应生成paddle::optionalTensorinterfacesPIR dialect 接口如InferSymbolicShapeInterface符号形状推导、LayoutTransformationInterfacetraitsPIR 算子特征如pir::UnaryElementWiseTrait、paddle::dialect::ForwardOnlyTrait仅前向无反向以 ops.yaml 中的adam_为例可以看到多输入、多输出、默认属性、多 kernel 变体、optional 与 inplace 的组合写法- op : adam_ args : (Tensor param, Tensor grad, Tensor learning_rate, Tensor moment1, Tensor moment2, Tensor moment2_max, Tensor beta1_pow, Tensor beta2_pow, Tensor master_param, Tensor skip_update, Scalar beta1 0.9f, Scalar beta2 0.999f, Scalar epsilon 1.0e-8f, bool lazy_mode false, int64_t min_row_size_to_use_multithread 1000, bool multi_precision false, bool use_global_beta_pow false, bool amsgrad false) output : Tensor(param_out), Tensor(moment1_out), Tensor(moment2_out), Tensor(moment2_max_out), Tensor(beta1_pow_out), Tensor(beta2_pow_out), Tensor(master_param_out) infer_meta : func : AdamInferMeta spmd_rule : AdamInferSpmdDynamic kernel : func : adam {dense, dense, dense, dense, dense, dense, dense, dense, dense, dense - dense, dense, dense, dense, dense, dense, dense}, adam_dense_param_sparse_grad {dense, selected_rows, dense, dense, dense, dense, dense, dense, dense, dense - dense, dense, dense, dense, dense, dense, dense} data_type : param optional : moment2_max, master_param, skip_update, moment2_max_out, master_param_out inplace : (param - param_out), (moment1 - moment1_out), (moment2 - moment2_out), (moment2_max - moment2_max_out), (beta1_pow - beta1_pow_out), (beta2_pow - beta2_pow_out), (master_param - master_param_out) traits : pir::SideEffectTrait, paddle::dialect::ForwardOnlyTraitScalar类型属性如Scalar beta1 0.9f表示该属性可以接受 Tensor 或普通数值生成时会有对应的特判逻辑。三、代码生成体系PHI API 层与 PIR Op 层两套并行管线当前 Paddle 有两套代码生成管线并行工作PHI API 层面向 C/动态图调用与PIR Op 层面向 PIR 新执行体系。两者共用同一份 YAML但产出不同的代码面。3.1 PHI API 层paddle/phi/api/生成器脚本位于 paddle/phi/api/generator/产出 C API 函数。除文档列出的脚本外当前仓库还包含dist_api_gen.py、dist_bw_api_gen.py分布式 API、strings_api_gen.py、wrapped_infermeta_gen.py等生成器脚本产出文件说明api_gen.pypaddle/phi/api/lib/api.cc前向 C APIbackward_api_gen.pypaddle/phi/api/lib/backward_api.cc反向 C APIintermediate_api_gen.pypaddle/phi/api/lib/dygraph_api.{h,cc}动态图中间 APIsparse_api_gen.pypaddle/phi/api/lib/sparse_api.cc稀疏前向 APIsparse_bw_api_gen.pypaddle/phi/api/lib/sparse_bw_api.cc稀疏反向 APItensor_operants_gen.pypaddle/phi/api/lib/tensor_api.cc、tensor_operants.hTensor 运算符重载、*等dist_api_gen.py分布式 API 代码分布式场景下的 C APIstrings_api_gen.py字符串算子 APIStringTensor 相关 C API生成内容每个算子对应一个 C 函数内部包含完整的 kernel 选择 数据准备 kernel 调用逻辑// 自动生成的 paddle::experimental::add() Tensor add(const Tensor x, const Tensor y) { // 1. ParseKernelKeyByInputArgs → KernelKey // 2. SelectKernelOrThrowError → Kernel // 3. PrepareDataTransDataPlace/Type/Layout // 4. InferMeta形状推导 // 5. kernel_fn(dev_ctx, x, y, out) return out; }从 api_gen.py 的源码可以看到生成的细节逻辑ForwardAPI类解析intermediate中间输出生成xxx_intermediate后缀的函数、解析inplace/view映射parse_inplace_and_view会把x - out解析为inplace_map[out] in并根据映射把输出类型改写为Tensor或paddle::optionalTensor见inplace_out_type_map、inplace_optional_out_type_map。输入侧则调用PrepareData完成 device/type/layout 的数据搬运与类型转换。3.2 PIR Op 层paddle/fluid/pir/dialect/op_generator/生成 PIR 算子定义与 Python-C 绑定。当前仓库的 op_generator 目录 比文档所列更丰富核心脚本包括生成器脚本产出说明api_gen.pyPIR Op C APIPIR 算子接口python_c_gen.pyPython-C 绑定PIR 算子的 Python 调用入口ops_api_gen.pypaddle/fluid/pybind/ops_api.ccPython 层算子分发op_gen.pyPIR Op 定义主体Op 类、builder 等op_infermeta_func_gen.pyInferMeta 函数与infer_meta.func对应infer_symbolic_shape_gen.py符号形状推导实现对应InferSymbolicShapeInterfaceop_verify_gen.pyOp 校验逻辑verify 函数生成此外还有op_build_gen.py、op_interface_gen.py、op_member_access_func_gen.py、op_kerneltype_gen.py、op_all_func_gen.py、vjp_interface_black_list.py、parse_kernel_key_gen.py等分别负责 PIR 体系下的算子构建、接口、成员访问、kernel 类型解析等维度的代码生成。3.3 动态图函数层生成器paddle/fluid/eager/auto_code_generator/generator/eager_gen.py输入与 PHI API 层相同的 YAML 文件产出paddle/fluid/eager/api/generated/eager_generated/forwards/dygraph_functions.ccpaddle/fluid/eager/api/generated/eager_generated/backwards/nodes.cc反向 Node 类生成内容前向函数调用 C API 层 构建反向计算图创建 GradNode、保存前向 Tensor 到成员变量反向 Node 类继承egr::GradNodeBase实现operator()()调用反向 C API。同目录下的 python_c_gen.py 生成动态图 Python 绑定monkey_patch_gen.py 与 codegen_utils.py 提供公共工具函数。3.4 Python-C 绑定层动态图生成器paddle/fluid/eager/auto_code_generator/generator/python_c_gen.py输入YAML 动态图函数签名产出paddle/fluid/pybind/eager_op_function.cc生成内容将动态图函数包装为 Python 可调用对象处理Python 对象到 C Tensor 的转换属性类型解析int / float / list / string / Scalar关键字参数与默认值对应 YAMLargs中的默认值声明错误消息与类型检查。四、静态图 CodeGenJinja2 模板引擎静态图路径使用 Jinja2 模板引擎脚本位于 paddle/fluid/operators/generator/脚本功能parse_op.py解析 YAML 为内部 OpDef 数据结构cross_validate.py校验 ops.yaml 与 op_compat.yaml 一致性generate_op.py从 Jinja 模板生成generated_op*.ccgenerate_static_op.py生成静态图 Opgenerate_sparse_op.py生成稀疏静态图 Op模板文件位于 paddle/fluid/operators/generator/templates/包含模板内容op.c.j2OpMaker、InferShape、GetExpectedKernelTypeks.c.j2Kernel 签名operator_utils.c.j2算子工具函数sparse_op.c.j2 / sparse_ks.c.j2稀疏算子的 Op 与 Kernel 签名模板生成的文件位于paddle/fluid/operators/目录下如generated_op1.cc…generated_op4.cc、generated_static_op.cc并在 paddle/fluid/operators/CMakeLists.txt 中被引用编译注册到 fluid 的OpRegistry中供旧版静态图执行器使用。五、CMake 构建集成代码生成在 CMake configure 或 build 阶段触发使用三种 CMake 机制适用场景各不相同5.1 execute_processconfigure 阶段execute_process( COMMAND ${PYTHON_EXECUTABLE} ${API_GEN_PY} --api_yaml_path ${OPS_YAML} --api_header_path ${API_HEADER} --api_source_path ${API_SOURCE} )在cmake ..时立即执行适用于生成文件不频繁变化的场景如 YAML 定义稳定、无需增量重生成。5.2 add_custom_command add_custom_targetbuild 阶段add_custom_command( OUTPUT ${API_SOURCE} COMMAND ${PYTHON_EXECUTABLE} ${API_GEN_PY} ... DEPENDS ${OPS_YAML} ${API_GEN_PY} ) add_custom_target(api_gen ALL DEPENDS ${API_SOURCE})在make时按依赖关系触发只有 YAML 或生成器脚本被修改后才重新生成实现增量构建。5.3 copy_if_differentexecute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TMP_FILE} ${FINAL_FILE} )先生成到临时文件再与目标文件比较内容相同则不覆盖避免因时间戳变化触发不必要的重编译显著缩短增量构建时间。从源码结构看动态图eager侧同样通过 paddle/fluid/eager/auto_code_generator/CMakeLists.txt 与 paddle/fluid/operators/generator/CMakeLists.txt 将生成器接入构建系统eager_gen.py与python_c_gen.py的调用参数可通过--help查看。六、关键文件路径汇总层级生成器脚本产出目录PHI C APIpaddle/phi/api/generator/api_gen.pypaddle/phi/api/lib/PHI 中间 APIpaddle/phi/api/generator/intermediate_api_gen.pypaddle/phi/api/lib/动态图函数paddle/fluid/eager/auto_code_generator/generator/eager_gen.pypaddle/fluid/eager/api/generated/Python-C动态图paddle/fluid/eager/auto_code_generator/generator/python_c_gen.pypaddle/fluid/pybind/PIR Op APIpaddle/fluid/pir/dialect/op_generator/api_gen.pyPIR Op 定义PIR ops_apipaddle/fluid/pir/dialect/op_generator/ops_api_gen.pypaddle/fluid/pybind/静态图paddle/fluid/operators/generator/generate_op.pypaddle/fluid/operators/YAML 定义—paddle/phi/ops/yaml/七、调试与开发建议修改 YAML 后重新生成完整make即可触发代码生成通过 CMake 依赖自动处理若只想刷新某层可单独构建对应的add_custom_target如api_gen。查看生成结果到build/目录下对应路径查看.cc文件build/paddle/phi/api/lib/api.cc、build/paddle/fluid/eager/api/generated/...等确认生成代码是否符合预期。调试生成器直接用 Python 运行生成器脚本添加--help查看参数例如python paddle/phi/api/generator/api_gen.py --help可脱离 CMake 单独调试生成逻辑。新增算子只需在 ops.yaml backward.yaml 添加条目编写 kernel位于 paddle/phi/kernels/和 infer_meta位于 paddle/phi/infermeta/其余全部自动生成。兼容旧算子在 op_compat.yaml 中添加新旧名称映射配合 cross_validate.py 可在生成前校验ops.yaml与op_compat.yaml的一致性提前发现参数名不匹配等问题。特殊算子类型融合算子写 fused_ops.yaml稀疏算子写 sparse_ops.yaml字符串算子写 strings_ops.yaml各自有对应的生成器入口不要混入ops.yaml。八、总结Paddle PHI 的代码生成管线以 YAML 为唯一事实来源通过 PHI API 层、PIR Op 层、动态图函数层、Python-C 绑定层与静态图 Jinja2 模板五条生成路径把算子定义自动展开为完整的 C / Python 调用栈。理解这条管线后新增或修改算子时就能准确判断改哪里、重新生成什么、去哪看结果这也是 Paddle 能长期维持数千算子、多硬件后端一致性的核心工程机制。【免费下载链接】PaddlePArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice 『飞桨』核心框架深度学习机器学习高性能单机、分布式训练和跨平台部署项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表