원클릭으로
cpp-sink
负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『C++下沉』方案。通过将 Python API 下沉至 C++层,可以减少 Python 装饰器带来的性能开销,提升 API 调度效率。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『C++下沉』方案。通过将 Python API 下沉至 C++层,可以减少 Python 装饰器带来的性能开销,提升 API 调度效率。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | cpp-sink |
| description | 负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『C++下沉』方案。通过将 Python API 下沉至 C++层,可以减少 Python 装饰器带来的性能开销,提升 API 调度效率。 |
| context | fork |
| disable-model-invocation | false |
根据 API 的复杂度,将下沉场景分为三类:
适用条件(需全部满足):
ops.yaml中参数类型或数量一致_C_ops前无任何前处理逻辑典型示例: paddle.log2
python_api_info.yaml添加参数别名映射(按 op name 的字典序添加):
- op : log2
name : [paddle.log2, paddle.Tensor.log2]
args_alias :
use_default_mapping : True # 启用默认映射:x->input
说明:
name:指定对应的 Python API 名称(函数 API 和 Tensor 方法)use_default_mapping : True:自动配置常用字段映射(x→input, y→other, axis→dim, keepdims→keepdim)y: [exponent](Paddle 参数名为 key,PyTorch 参数名为 value)_paddle_docs.py使用 add_doc_and_signature 装饰器迁移文档,关键要点:
Keyword Args: 部分,位置参数放在 Args: 部分,如下:# out 为 keyword-only 参数
"""
Args:
...
Keyword Args:
out (Tensor|optional): The output tensor. Default: None.
"""
# out 为位置参数
"""
Args:
out (Tensor, optional): The output Tensor. Default: None.
"""
示例:
@add_doc_and_signature
def log2(
x: Tensor,
name: str | None = None,
*,
out: Tensor | None = None,
) -> Tensor:
r"""
Calculates the log to the base 2 of the given input tensor, element-wise.
.. math::
Out = \log_2x
Args:
x (Tensor): Input tensor must be one of the following types: int32, int64, float16, bfloat16, float32, float64, complex64, complex128.
name (str|None, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
out (Tensor, optional): The output Tensor. If set, the result will be stored in this Tensor. Default: None.
Returns:
Tensor: The log to the base 2 of the input Tensor computed element-wise.
Examples:
.. code-block:: pycon
>>> import paddle
>>> # example 1: x is a float
>>> x_i = paddle.to_tensor([[1.0], [2.0]])
>>> res = paddle.log2(x_i)
>>> res
Tensor(shape=[2, 1], dtype=float32, place=Place(cpu), stop_gradient=True,
[[0.],
[1.]])
"""
...
注意:
_paddle_docs.py 现有文档格式保持一致找到 API 的 Python 实现位置(如 python/paddle/tensor/math.py,注意不要误检索到稀疏 API 位置):
# 在文件最上方合适位置导入
from paddle._C_ops import log2 # noqa: F401
# 以下内容全部删除
# def log2(x: Tensor, name: str | None = None) -> Tensor:
# ...
适用条件(全部满足):
ops.yaml中参数类型或数量一致_C_ops前有其他前处理逻辑典型示例: paddle.logsumexp
python_api_info.yaml- op : logsumexp
name : [paddle.logsumexp, paddle.Tensor.logsumexp]
args_alias:
use_default_mapping : True # x->input, axis->dim
pre_process:
func : LogsumexpPreProcess(x, axis, reduce_all) # 前处理函数
关键点:
name:指定对应的 Python API 名称args_alias.use_default_mapping:启用默认参数映射pre_process.func:指定前处理函数名称及其参数列表将 Python 端在调用_C_ops前的其他前处理逻辑,修改为 C++的实现。在 paddle/fluid/pybind/arg_pre_process.h 声明,在 arg_pre_process.cc 实现。
关键要点:
Tensor*)和静态图版本(参数类型为 pir::Value*)arg_pre_process.cc 中已有实现,保持风格一致声明示例:
void LogsumexpPreProcess(Tensor *x, std::vector<int> *axis, bool *reduce_all); // 动态图
void LogsumexpPreProcess(pir::Value *x, std::vector<int> *axis, bool *reduce_all); // 静态图
_paddle_docs.py参考场景一的 Step 2 执行相同操作。
参考场景一的 Step 3 执行相同操作。
适用条件(全部满足):
ops.yaml中参数类型或数量不一致ops.yaml的参数差异典型示例: paddle.argmax/paddle.argmin
python_api_info.yaml- op : argmax
name : [paddle.argmax, paddle.Tensor.argmax]
args_mapper :
func : ArgMaxMinMapper # 自定义参数映射函数
关键点:
name:指定对应的 Python API 名称args_mapper.func:指定自定义 Mapper 函数名称args_mapper时,不会生成默认参数解析代码将 Python API 与ops.yaml中参数类型或数量不一致的差异,通过 C++自定义 Mapper 来进行匹配与转换。在 paddle/fluid/pybind/args_mapper.h 声明,在 args_mapper.cc 实现。
关键要点:
args_mapper 时不会生成默认参数解析代码,需手动解析所有参数args_mapper.cc 中已有实现,保持风格一致核心工具函数:
| 函数 | 用途 |
|---|---|
GetTensorFromArgsOrKWArgs | 解析 Tensor 参数,支持别名列表 |
GetItemFromArgsOrKWArgs | 获取通用 Python 对象 |
CastPyArg2Scalar/Boolean/DataType | 类型转换 |
CheckParamsCount / CheckRemainingParamsValidity | 参数校验 |
静态图特殊处理: 使用 pir::Value 代替 Tensor,常量需通过 paddle::dialect::full 转换为 Value 类型。
声明示例:
void ArgMaxMinMapper(PyObject* args, PyObject* kwargs,
Tensor* x, Scalar* axis, bool* keepdims, bool* flatten, DataType* dtype); // 动态图
void ArgMaxMinMapper(PyObject* args, PyObject* kwargs,
pir::Value* x, pir::Value* axis, ...); // 静态图
_paddle_docs.py除了完成场景一的文档迁移操作之外,场景三文档迁移还需要额外注意:
如果使用了自定义 Mapper,则 API 有可能支持了签名重载,需要分别描述两种签名,如下:
注:只需在文档正文中阐述两种签名(Paddle 在前,Pytorch 在后),文档其他位置如 Args/Returns 仍以 Paddle 风格签名为准
"""
This API has two signatures:
1. ``paddle.sum(x, axis=None, dtype=None, keepdim=False, name=None, *, out=None)`` (Paddle-style)
2. ``paddle.sum(input, dim=None, keepdim=False, dtype=None, *, out=None)`` (PyTorch-style)
Args:
...
Returns:
...
"""
参考场景一的 Step 3 执行相同操作。
_C_ops API 不同,属于特殊情况,Cpp 下沉方案无法实现,需要使用 Python 装饰器方案out参数,必须在 API 签名中 out 参数generated_tensor_methods_patch.py,该文件是自动生成的,修改没有意义,如无法对齐可考虑放弃 C++下沉方案而不是改动该文件 .. code-block:: pycon
>>> # type: ignore
>>> import paddle
>>> x = paddle.to_tensor([1.0, 2.0])
错误现象:
TypeError: (InvalidType) all(): argument (position 1) must be Value, but got Variable
解决方法:
rm -rf test/deprecated/test_xxx.py
CMakeLists.txt中涉及的单测配置错误现象:
TypeError: argmax() got an unexpected keyword argument 'invalid_param'
解决方法:
负责《Paddle API 对齐 PyTorch 项目》中 Step5 更新文档,在 API 代码修改完成后,同步更新中文 API 文档,确保文档准确反映 API 的最新行为
负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『新增 API』方案。通过新增 Paddle API(新增 API 别名、新增 Python 层 API、新增 C++算子),覆盖 Pytorch API 调用路径,实现与 PyTorch API 行为对齐。
负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『新增 compat 类型 API』方案。在 `paddle.compat` 命名空间下新增 API,实现与 PyTorch API 行为对齐。
开展《Paddle API 对齐 PyTorch 项目》,负责项目整体统筹规划,调用多个 skill,完成输入的 API 对齐
负责《Paddle API 对齐 PyTorch 项目》中 Step3 兼容测试,为已修改的 Paddle API 添加兼容性单测并执行验证,确保 API 的 Paddle 用法与 PyTorch 用法均能正常工作。
负责《Paddle API 对齐 PyTorch 项目》中代码提交,分别对 Paddle、PaConvert、Docs 三个仓库创建或更新 Pull Request