Back to Paddle

代码自动生成管线详解

.agents/skills/paddle-design-phi-kernel/references/codegen-pipeline.md

3.4.07.3 KB
Original Source

代码自动生成管线详解

概述

Paddle PHI 体系采用 YAML 驱动的代码生成方式,从算子定义文件自动生成 C++ API、动态图函数、Python-C 绑定等多层代码。这一设计使得新增算子只需编写 YAML 描述和 kernel 实现,中间的粘合代码全部自动生成。

YAML 定义文件

所有算子元信息以 YAML 格式维护,位于 paddle/phi/ops/yaml/ 目录下:

文件内容
ops.yaml前向算子定义(输入、输出、属性、kernel 映射、infer_meta)
backward.yaml反向算子定义
fused_ops.yaml融合算子(如 fused_attention、fused_feedforward)
sparse_ops.yaml稀疏算子(SparseCoo / SparseCsr)
op_compat.yaml新旧算子名称 / 参数名映射,保证兼容性
op_version.yaml算子版本管理,记录不兼容变更

ops.yaml 单条记录示例

yaml
- op: add
  args: (Tensor x, Tensor y)
  output: Tensor(out)
  infer_meta:
    func: ElementwiseInferMeta
  kernel:
    func: add
    data_type: x
  backward: add_grad

各字段含义:

  • op:算子名称
  • args:输入和属性声明(用括号包裹,逗号分隔)
  • output:输出声明
  • infer_meta.func:形状推导函数名(对应 paddle/phi/infermeta/ 下的 C++ 函数)
  • kernel.func:PHI kernel 函数名
  • kernel.data_type:kernel DataType 推断来源(此处取输入 x 的 dtype)
  • backward:关联的反向算子名

代码生成体系(两套并行)

当前 Paddle 有两套代码生成管线并行工作:PHI API 层PIR Op 层

PHI API 层(paddle/phi/api/)

生成器脚本位于 paddle/phi/api/generator/,产出 C++ API 函数:

生成器脚本产出文件说明
api_gen.pypaddle/phi/api/lib/api.cc前向 C++ API
backward_api_gen.pypaddle/phi/api/lib/backward_api.cc反向 C++ API
intermediate_api_gen.pypaddle/phi/api/lib/dygraph_api.{h,cc}动态图中间 API
sparse_api_gen.pypaddle/phi/api/lib/sparse_api.cc稀疏前向 API
sparse_bw_api_gen.pypaddle/phi/api/lib/sparse_bw_api.cc稀疏反向 API
tensor_operants_gen.pypaddle/phi/api/lib/tensor_api.cc, tensor_operants.hTensor 运算符重载

生成内容:每个算子对应一个 C++ 函数,内部包含完整的 kernel 选择 + 数据准备 + kernel 调用逻辑:

cpp
// 自动生成的 paddle::experimental::add()
Tensor add(const Tensor& x, const Tensor& y) {
  // 1. ParseKernelKeyByInputArgs → KernelKey
  // 2. SelectKernelOrThrowError → Kernel
  // 3. PrepareData(TransDataPlace/Type/Layout)
  // 4. InferMeta(形状推导)
  // 5. kernel_fn(dev_ctx, x, y, out)
  return out;
}

PIR Op 层(paddle/fluid/pir/dialect/op_generator/)

生成 PIR 算子定义和 Python-C 绑定:

生成器脚本产出文件说明
api_gen.pyPIR Op C++ APIPIR 算子接口
python_c_gen.pyPython-C 绑定PIR 算子的 Python 调用入口
ops_api_gen.pypaddle/fluid/pybind/ops_api.ccPython 层算子分发

动态图函数层

生成器paddle/fluid/eager/auto_code_generator/generator/eager_gen.py

输入:与 PHI API 层相同的 YAML 文件

产出

  • paddle/fluid/eager/api/generated/eager_generated/forwards/dygraph_functions.cc
  • paddle/fluid/eager/api/generated/eager_generated/backwards/nodes.cc(反向 Node 类)

生成内容

  • 前向函数:调用 C++ API 层 + 构建反向计算图(创建 GradNode、保存前向 Tensor)
  • 反向 Node 类:继承 egr::GradNodeBase,实现 operator()() 调用反向 C++ API

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)
  • 关键字参数和默认值
  • 错误消息和类型检查

静态图 CodeGen

静态图使用 Jinja2 模板引擎,脚本位于 paddle/fluid/operators/generator/

脚本功能
parse_op.py解析 YAML 为内部 OpDef 数据结构
cross_validate.py校验 ops.yaml 与 op_compat.yaml 一致性
generate_op.py从 Jinja 模板生成 generated_op*.cc
generate_static_op.py生成静态图 Op

模板文件位于 paddle/fluid/operators/generator/templates/,包含:

  • op.c.j2:OpMaker、InferShape、GetExpectedKernelType
  • ks.c.j2:Kernel 签名
  • operator_utils.c.j2:算子工具函数

生成的文件位于 paddle/fluid/operators/ 目录下(如 generated_op1.cc...generated_op4.ccgenerated_static_op.cc),注册到 fluid 的 OpRegistry 中。

CMake 构建集成

代码生成在 CMake configure 或 build 阶段触发,使用以下 CMake 命令:

execute_process(configure 阶段)

cmake
execute_process(
  COMMAND ${PYTHON_EXECUTABLE} ${API_GEN_PY}
    --api_yaml_path ${OPS_YAML}
    --api_header_path ${API_HEADER}
    --api_source_path ${API_SOURCE}
)

cmake .. 时立即执行,适用于生成文件不频繁变化的场景。

add_custom_command + add_custom_target(build 阶段)

cmake
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 或生成器脚本修改后才重新生成。

copy_if_different

cmake
execute_process(
  COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TMP_FILE} ${FINAL_FILE}
)

先生成到临时文件,再与目标文件比较。内容相同则不覆盖,避免触发不必要的重编译。

关键文件路径汇总

层级生成器脚本产出目录
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/

调试与开发建议

  1. 修改 YAML 后重新生成:完整 make 即可触发,代码生成通过 CMake 依赖自动处理
  2. 查看生成结果:到 build/ 目录下对应路径查看 .cc 文件
  3. 调试生成器:直接用 Python 运行生成器脚本,添加 --help 查看参数
  4. 新增算子:只需在 ops.yaml + backward.yaml 添加条目,编写 kernel 和 infer_meta,其余全部自动生成
  5. 兼容旧算子:在 op_compat.yaml 中添加新旧名称映射