From cc0970d959b12cc4f6fffbf5cf70d97c9de17dea Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Fri, 28 Apr 2023 17:17:47 +0800 Subject: [PATCH 01/12] c++ docs rfc --- ...26\344\270\216\345\261\225\347\244\272.md" | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 "rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" new file mode 100644 index 000000000..6522d8973 --- /dev/null +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -0,0 +1,158 @@ +# 飞桨框架 C++ 文档抽取与展示 + +|领域 | 飞桨框架 C++ 文档抽取与展示 | +|---|--------------------------------| +|提交作者 | Liyulingyue、gouzil | +|提交时间 | 2023-04-27 | +|版本号 | V1.0 | +|依赖飞桨版本 | paddlepaddle>2.4 | +|文件名 | 飞桨框架 C++ 文档抽取与展示.md
| + + +# 一、概述 +## 1、相关背景 + +自 paddle 2.3 版本开始,飞桨深度学习框架提供定义与用法与相应 Python API 类似的 C++ API,其 API 命名、参数顺序及类型均和相应的 paddle Python API 对齐,可以通过查找相应 Python API 的官方文档了解其用法,并在自定义算子开发时使用。通过调用这些接口,可以省去封装基础运算的时间,从而提高开发效率。 + +[中国软件开源创新大赛:飞桨框架任务挑战赛 赛题6](https://github.com/PaddlePaddle/Paddle/issues/53172#paddlepaddle06)要求为飞桨框架自动抽取和展示 C++ 文档,并上线至飞桨官网。 + +## 2、功能目标 + +在[飞桨API文档页面](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/index_cn.html)引入新的章节`PADDLE_API`,用于展示飞桨当前的类 Python 的 C++运算 API。 + +展示内容应与Python API文档对其,包括:API名称、对应的Python API名称、API介绍、参数、返回值、示例代码。 + +## 3、意义 + +提升c++开发用户的开发体验。 + +# 二、飞桨现状 + +## 1、文档生成与更新 +飞桨当前的英文文档信息保存在源代码的注释中,中文文档在`paddle/docs`目录下。每天,后台拉取develop分支,抽取英文文档和中文文档,转换为html后展示在官网上。 + +其中,英文文档的抽取代码可以开源。 + +## 2、 C++ API +飞桨的 C++ API 体系还在建设中,最终暴露给用户的API信息通过在安装根目录`site-packages/paddle/include/paddle`中搜索`PADDLE_API`获取。当前有12个class,450个API以及2个宏定义。 + +相比于Python API,无法在C++ API的源码中获取对应的API说明和示例代码。 + +# 三、设计思路与实现方案 + +## 1、 总述 +综合考虑对当前的框架体系,拟通过人工构造与自动化脚本相结合的方式构造C++ API 文档。 + +其中,能够通过自动化脚本获取的信息有: +- C++ API的文件路径、接口注释、命名空间、返回值信息。这些信息可以通过扫描源代码文件自动提取。 +- C++ API对应的Python API,由于两种语言的API命名几乎保持一直,可以通过搜索匹配的方式获取对应的Python API名称。 +- API对应的介绍文本。C++ API和Python API的介绍文本可以保持一直。 + +无法确定能够通过自动化脚本获取的信息有: +- C++ API的参数信息和返回值信息,如果C++ API的参数信息完全与Python对齐,则C++文档直接抽取Python文档的参数信息即可,否则,则需要人工补足。 +- C++ API的示例代码,C++API的示例代码目前需要人工补足。 + +此外,可以进一步在docs下构造C++的示例代码运行测试脚本,以提高文档质量。 + +## 2、 C++ API抽取 + +C++ API抽取可以通过Python脚本解析`site-packages/paddle/include/paddle`文件实现。 + +## 3、 C++ API 与 Python API 对齐 + +C++ API 与 Python API 有两种对齐方案,其一是通过文件记录映射表,将C++ API名称映射到指定的Python API上;其二,根据C++ API文件名直接匹配对应的Python API。 + +本次优先使用后者,对于特殊的API,使用第一种方案进行铆定。 + +## 4、 C++ API文档 + +C++ API文档能够在一定程度上自动更新,但由于其中包含大量不可更新元素,故 C++ API文档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 + +以`PADDLE_API Tensor abs(const Tensor& x);`为例,其中文文档内容应为: + +```python +.. _cn_api_fluid_layers_abs: + +abs +------------------------------- + +.. cpp:function:: PADDLE_API Tensor abs(const Tensor& x) + +绝对值函数。 + +.. math:: + out = |x| + +参数 +::::::::: + - **x** (Tensor) - 输入的 Tensor。 + +返回 +::::::::: +输出 Tensor,与 ``x`` 维度相同。 + +代码示例 +::::::::: + +#include "paddle/extension.h" + +auto x = paddle::full({3, 4}, -1.0); +auto grad_x = paddle::abs(x); + +``` + +该API对应的Python文档为: + +```python +.. _cn_api_fluid_layers_abs: + +abs +------------------------------- + +.. py:function:: paddle.abs(x, name=None) + +绝对值函数。 + +.. math:: + out = |x| + +参数 +::::::::: + - **x** (Tensor) - 输入的 Tensor,数据类型为:float32、float64。 + - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 + +返回 +::::::::: +输出 Tensor,与 ``x`` 维度相同、数据类型相同。 + +代码示例 +::::::::: + +COPY-FROM: paddle.abs + +``` + +## 5、 更新与维护 + +每日更新时,拉取最新paddle源码,并编译对应的whl包,用于自动提取PADDLE_API。对于不同的提取结果,采用不同的策略: +- 对于没有提取到的API,可以被视为退场,docs目录下虽然保存对应的rst文件,但不在官网页面展示 +- 对于新增的API,通过脚本自动匹配已有的Python文档,填充Python文档信息,记录对应C++ API 到指定文档,用于后期审查。 +- 对于Python API描述发生改变,复制对应描述到C++ 的文档中。 +- 对于Python API函数参数、示例代码发生改变,记录对应C++ API 到指定文档,用于后期审查。 + +# 四、测试和验收的考量 + +C++文档上线官网的develop分支。 + +# 五、排期规划 +整个任务的规划实时步骤如下 +1. 构建API抽取脚本,实现API抽取 +2. 构建API对齐脚本,用于根据抽取的API匹配当前已有的Python文档,生成对应rst。 +3. 开放Tracking Issue,募集开发者人工审查文档信息,并补充C++ 示例代码 +4. C++ 文档接入官网文档页面develop分支 +5. C++ 文档自动化更新脚本接入官网文档页面develop分支 +6. (可选) 在Docs仓库下构建C++ 代码审查CI + +# 六、影响面 + +仅对文档展示页面存在影响。 From 2e71b653aaa781d3cc0d3042b5dcc976acd3d1cf Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Sun, 30 Apr 2023 20:27:38 +0800 Subject: [PATCH 02/12] =?UTF-8?q?change=20the=202=E3=80=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=9B=AE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\275\345\217\226\344\270\216\345\261\225\347\244\272.md" | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 6522d8973..9d24787b8 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -18,9 +18,11 @@ ## 2、功能目标 -在[飞桨API文档页面](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/index_cn.html)引入新的章节`PADDLE_API`,用于展示飞桨当前的类 Python 的 C++运算 API。 +在[飞桨API文档页面](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/index_cn.html)引入新的章节`PADDLE_API`,用于展示飞桨当前暴露给用户的C++ 接口。 -展示内容应与Python API文档对其,包括:API名称、对应的Python API名称、API介绍、参数、返回值、示例代码。 +展示的内容为全部被`PADDLE_API`修饰的成员,包括但不仅包括API、Class、宏定义。 + +不失一般的,对于所有的展示的内容,应包含namespace、定义、 接口注释等。特别的,对于不同的被`PADDLE_API`修饰的成员,需要展示不同的信息。以class为例,不仅需要展示类定义,还需要展示对应的成员函数(如果有)、成员变量(如果有);对于类Python 的 API,展示内容应与Python API文档对其,包括对应的Python API名称、API介绍、参数、返回值、示例代码。 ## 3、意义 From 4dc4f0d23b2d56c6bc37ce25e5b3e2fbca34a84c Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Sun, 30 Apr 2023 21:57:13 +0800 Subject: [PATCH 03/12] =?UTF-8?q?change=20the=20=E4=B8=89=E3=80=81?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=80=9D=E8=B7=AF=E4=B8=8E=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=96=B9=E6=A1=88=20::=201=E3=80=81=20=E6=80=BB=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...226\344\270\216\345\261\225\347\244\272.md" | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 9d24787b8..61debb843 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -43,16 +43,22 @@ # 三、设计思路与实现方案 ## 1、 总述 -综合考虑对当前的框架体系,拟通过人工构造与自动化脚本相结合的方式构造C++ API 文档。 +综合考虑对当前的框架体系,拟通过人工构造与自动化脚本相结合的方式构造C++ 文档。 其中,能够通过自动化脚本获取的信息有: -- C++ API的文件路径、接口注释、命名空间、返回值信息。这些信息可以通过扫描源代码文件自动提取。 -- C++ API对应的Python API,由于两种语言的API命名几乎保持一直,可以通过搜索匹配的方式获取对应的Python API名称。 -- API对应的介绍文本。C++ API和Python API的介绍文本可以保持一直。 +- 每个文件或namespace包含的API名称、Class名称、宏定义等信息。可以通过遍历文件的方式构造能够在在主页上展示的`Overview`。 +- 每个API、Class等对应的文件路径、接口注释、命名空间、返回值信息。 +- 类Python 的 C++ API对应的Python API信息。由于两种语言的API命名几乎保持一致,可以通过搜索匹配的方式获取对应的Python API名称、说明等信息。 无法确定能够通过自动化脚本获取的信息有: -- C++ API的参数信息和返回值信息,如果C++ API的参数信息完全与Python对齐,则C++文档直接抽取Python文档的参数信息即可,否则,则需要人工补足。 -- C++ API的示例代码,C++API的示例代码目前需要人工补足。 +- C++ API的参数信息和返回值信息,如果C++ API的参数信息完全与Python对齐,则C++文档直接抽取Python文档的参数信息即可,否则,可能需要人工补足。 +- C++ API的示例代码。 + +考虑到赛题需求以及整个体系的维护性,仅通过人工补全`类 Python 的 C++ API`的参数信息、返回值信息、代码示例。 + +更进一步地,上述抽取和补足工作的成果应由两部份组成。 +- 总览,提供一个用于快速搜索的界面。例如,以 API、Class、Enum等定义类型为一级标题,namespace为二级标题的导航界面。 +- 单独介绍,对于每个API、Class、Enum都提供一个单独的介绍页面。 此外,可以进一步在docs下构造C++的示例代码运行测试脚本,以提高文档质量。 From b142cc55e4e1e15a802a4da82da8cbb6c6c13228 Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Sun, 30 Apr 2023 22:04:09 +0800 Subject: [PATCH 04/12] =?UTF-8?q?change=20the=20=E4=B8=89=E3=80=81?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=80=9D=E8=B7=AF=E4=B8=8E=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=96=B9=E6=A1=88=20::=204=E3=80=81=20C++=20API=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...226\344\270\216\345\261\225\347\244\272.md" | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 61debb843..28cb55ccc 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -76,7 +76,7 @@ C++ API 与 Python API 有两种对齐方案,其一是通过文件记录映射 C++ API文档能够在一定程度上自动更新,但由于其中包含大量不可更新元素,故 C++ API文档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 -以`PADDLE_API Tensor abs(const Tensor& x);`为例,其中文文档内容应为: +`PADDLE_API Tensor abs(const Tensor& x);`是一个类 Python 的 C++ API,故展示页面不仅要展示C++的信息,还要展示对应的 Python API 信息。以abs为例,其中文文档内容应为: ```python .. _cn_api_fluid_layers_abs: @@ -84,23 +84,31 @@ C++ API文档能够在一定程度上自动更新,但由于其中包含大量 abs ------------------------------- -.. cpp:function:: PADDLE_API Tensor abs(const Tensor& x) +.. cpp:function:: PADDLE_API Tensor paddle::experimental::abs(const Tensor& x) 绝对值函数。 .. math:: out = |x| +对应的Python API +::::::::::::::::::::: +[paddle.abs(x, name=None)](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/abs_cn.html) + +定义目录 +::::::::::::::::::::: +paddle\phi\api\include\api.h + 参数 -::::::::: +::::::::::::::::::::: - **x** (Tensor) - 输入的 Tensor。 返回 -::::::::: +::::::::::::::::::::: 输出 Tensor,与 ``x`` 维度相同。 代码示例 -::::::::: +::::::::::::::::::::: #include "paddle/extension.h" From b72b0309f861542c213ff1aa69dce46b3889bd75 Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Sun, 30 Apr 2023 22:06:04 +0800 Subject: [PATCH 05/12] =?UTF-8?q?change=20the=20=E4=B8=89=E3=80=81?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=80=9D=E8=B7=AF=E4=B8=8E=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=96=B9=E6=A1=88=20::=203=E3=80=81=20C++=20API=20=E4=B8=8E=20?= =?UTF-8?q?Python=20API=20=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...12\275\345\217\226\344\270\216\345\261\225\347\244\272.md" | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 28cb55ccc..c37c12250 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -68,9 +68,7 @@ C++ API抽取可以通过Python脚本解析`site-packages/paddle/include/paddle` ## 3、 C++ API 与 Python API 对齐 -C++ API 与 Python API 有两种对齐方案,其一是通过文件记录映射表,将C++ API名称映射到指定的Python API上;其二,根据C++ API文件名直接匹配对应的Python API。 - -本次优先使用后者,对于特殊的API,使用第一种方案进行铆定。 +仅类Python 的 C++ API 需要与 Python API 信息对齐。对于这部分API,首先根据C++ API文件名直接匹配对应的Python API,再对这部分信息进行核验,生成文档映射表。 ## 4、 C++ API文档 From d984e21a0ef6156da8fd8b8fbd033ab131521f62 Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Sun, 30 Apr 2023 22:12:36 +0800 Subject: [PATCH 06/12] =?UTF-8?q?change=20the=20=E4=B8=89=E3=80=81?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=80=9D=E8=B7=AF=E4=B8=8E=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=96=B9=E6=A1=88=20::=20=E4=BA=94=E3=80=81=E6=8E=92=E6=9C=9F?= =?UTF-8?q?=E8=A7=84=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...26\344\270\216\345\261\225\347\244\272.md" | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index c37c12250..8e33ab362 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -149,10 +149,9 @@ COPY-FROM: paddle.abs ## 5、 更新与维护 每日更新时,拉取最新paddle源码,并编译对应的whl包,用于自动提取PADDLE_API。对于不同的提取结果,采用不同的策略: -- 对于没有提取到的API,可以被视为退场,docs目录下虽然保存对应的rst文件,但不在官网页面展示 -- 对于新增的API,通过脚本自动匹配已有的Python文档,填充Python文档信息,记录对应C++ API 到指定文档,用于后期审查。 -- 对于Python API描述发生改变,复制对应描述到C++ 的文档中。 -- 对于Python API函数参数、示例代码发生改变,记录对应C++ API 到指定文档,用于后期审查。 +- 对于已有但是没有抽取到的信息,可以被视为退场,docs目录下虽然保存对应的rst文件,但不在官网页面展示 +- 对于新增或修改的信息,通过脚本自动抽取对应信息生成rst文档。 +- 对于类Python 的 C++ API,不仅需要解析C++的文件信息,还需要根据对应Python 文档修改rst内容。 # 四、测试和验收的考量 @@ -160,12 +159,13 @@ C++文档上线官网的develop分支。 # 五、排期规划 整个任务的规划实时步骤如下 -1. 构建API抽取脚本,实现API抽取 -2. 构建API对齐脚本,用于根据抽取的API匹配当前已有的Python文档,生成对应rst。 -3. 开放Tracking Issue,募集开发者人工审查文档信息,并补充C++ 示例代码 -4. C++ 文档接入官网文档页面develop分支 -5. C++ 文档自动化更新脚本接入官网文档页面develop分支 -6. (可选) 在Docs仓库下构建C++ 代码审查CI +1. 构建PADDLE_API抽取脚本,实现PADDLE_API抽取。 +2. 构建OverView页面和rst页面。 +3. 构建API对齐脚本,用于根据抽取的API匹配当前已有的Python文档,生成对应rst。 +4. 开放Tracking Issue,募集开发者人工审查文档信息,并补充C++ 示例代码。 +5. C++ 文档接入官网文档页面develop分支 +6. C++ 文档自动化更新脚本接入官网文档页面develop分支 +7. (可选) 在Docs仓库下构建C++ 代码审查CI # 六、影响面 From 86fb070cb8402baced7c4f052a998ab5b14ec0c1 Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Wed, 3 May 2023 13:50:53 +0800 Subject: [PATCH 07/12] add overview introduction --- ...26\344\270\216\345\261\225\347\244\272.md" | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 8e33ab362..c064b942e 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -70,9 +70,42 @@ C++ API抽取可以通过Python脚本解析`site-packages/paddle/include/paddle` 仅类Python 的 C++ API 需要与 Python API 信息对齐。对于这部分API,首先根据C++ API文件名直接匹配对应的Python API,再对这部分信息进行核验,生成文档映射表。 -## 4、 C++ API文档 +## 4、 OverView 页面 +Overview 页面风格应与 [Python 的 Overview](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/index_cn.html)保持一致。 -C++ API文档能够在一定程度上自动更新,但由于其中包含大量不可更新元素,故 C++ API文档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 +一个简易的示例页面如下: + +```python +# C++ 文档 +欢迎使用飞桨框架(PaddlePaddle),PaddlePaddle 是一个易用、高效、灵活、可扩展的深度学习框架,致力于让深度学习技术的创新与应用更简单。 + +在本版本中,飞桨框架对 C++ 接口做了许多优化,您可以参考下表来了解飞桨框架最新版的 C++ 目录结构与说明。更详细的说明,请参见 版本说明 。此外,您可参考 PaddlePaddle 的 GitHub 了解详情。 + +## namespace1 +namespace1的介绍 + +### class +- class name 1 +- class name 2 +### API +- API name 1 +- API name 2 + +## namespace2 +namespace2的介绍 + +### class +- class name 1 +- class name 2 +### API +- API name 1 +- API name 2 + +``` + +## 5、 C++ 文档 + +C++ 文档能够在一定程度上自动更新,但由于其中包含大量不可更新元素,故 C++ 文档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 `PADDLE_API Tensor abs(const Tensor& x);`是一个类 Python 的 C++ API,故展示页面不仅要展示C++的信息,还要展示对应的 Python API 信息。以abs为例,其中文文档内容应为: @@ -146,7 +179,7 @@ COPY-FROM: paddle.abs ``` -## 5、 更新与维护 +## 6、 更新与维护 每日更新时,拉取最新paddle源码,并编译对应的whl包,用于自动提取PADDLE_API。对于不同的提取结果,采用不同的策略: - 对于已有但是没有抽取到的信息,可以被视为退场,docs目录下虽然保存对应的rst文件,但不在官网页面展示 From caf1b7708289970c108b9dfb7b2149f6d045975e Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Sat, 6 May 2023 07:33:21 +0800 Subject: [PATCH 08/12] add c++ class demo --- ...26\344\270\216\345\261\225\347\244\272.md" | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index c064b942e..8b1d7482a 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -103,7 +103,7 @@ namespace2的介绍 ``` -## 5、 C++ 文档 +## 5、 C++ API文档 C++ 文档能够在一定程度上自动更新,但由于其中包含大量不可更新元素,故 C++ 文档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 @@ -179,7 +179,55 @@ COPY-FROM: paddle.abs ``` -## 6、 更新与维护 +## 6、 C++ class文档 + +C++ class文档的示例模板如下: + +```python + +.. _cn_api_classname: + +classname +------------------------------- + +.. cpp:class:: classname(para1, para2, para3) +介绍文本 + +定义目录 +::::::::::::::::::::: +path + +参数 +::::::::::::::::::::: + - **para1** (type) - 介绍文本。 + - **para2** (type) - 介绍文本。 + - **para3** (type) - 介绍文本。 + +方法 +::::::::::::::::::::: + +fun1 +''''''''' +介绍文本 + +**参数** + - **para1** (type) - 介绍文本 + +**返回** +介绍文本 + +fun2 +''''''''' +介绍文本 + +**参数** + - **para1** (type) - 介绍文本 + +**返回** +介绍文本 +``` + +## 7、 更新与维护 每日更新时,拉取最新paddle源码,并编译对应的whl包,用于自动提取PADDLE_API。对于不同的提取结果,采用不同的策略: - 对于已有但是没有抽取到的信息,可以被视为退场,docs目录下虽然保存对应的rst文件,但不在官网页面展示 From 0b7c296f6f1d7c295ffcec0b55a0c9dd04da61bb Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Wed, 10 May 2023 23:18:41 +0800 Subject: [PATCH 09/12] fix sth. --- ...26\344\270\216\345\261\225\347\244\272.md" | 66 +++++++++++++------ 1 file changed, 46 insertions(+), 20 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 8b1d7482a..26028f751 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -36,7 +36,7 @@ 其中,英文文档的抽取代码可以开源。 ## 2、 C++ API -飞桨的 C++ API 体系还在建设中,最终暴露给用户的API信息通过在安装根目录`site-packages/paddle/include/paddle`中搜索`PADDLE_API`获取。当前有12个class,450个API以及2个宏定义。 +飞桨的 C++ API 体系还在建设中,最终暴露给用户的API信息通过在安装根目录`site-packages/paddle/include/paddle`中搜索`PADDLE_API`获取。当前有11个class,450个API以及2个宏定义。其中6个class、3个API是具有注释说明的。 相比于Python API,无法在C++ API的源码中获取对应的API说明和示例代码。 @@ -54,7 +54,7 @@ - C++ API的参数信息和返回值信息,如果C++ API的参数信息完全与Python对齐,则C++文档直接抽取Python文档的参数信息即可,否则,可能需要人工补足。 - C++ API的示例代码。 -考虑到赛题需求以及整个体系的维护性,仅通过人工补全`类 Python 的 C++ API`的参数信息、返回值信息、代码示例。 +考虑到赛题需求以及整个体系的维护性,仅当`类 Python 的 C++ API`的参数信息能够与python文档完全对应时,拷贝python文档的参数解释信息。 更进一步地,上述抽取和补足工作的成果应由两部份组成。 - 总览,提供一个用于快速搜索的界面。例如,以 API、Class、Enum等定义类型为一级标题,namespace为二级标题的导航界面。 @@ -105,9 +105,34 @@ namespace2的介绍 ## 5、 C++ API文档 -C++ 文档能够在一定程度上自动更新,但由于其中包含大量不可更新元素,故 C++ 文档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 +C++ 文档能够自动更新,C++ 文档的历史存档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 -`PADDLE_API Tensor abs(const Tensor& x);`是一个类 Python 的 C++ API,故展示页面不仅要展示C++的信息,还要展示对应的 Python API 信息。以abs为例,其中文文档内容应为: +下面是一个 C++ API文档的示例: + +```python +.. _cn_api_functionname: + +functionname +------------------------------- + +.. cpp:function::functionname(para1, para2, para3) +介绍文本 + +定义目录 +::::::::::::::::::::: +path + +返回值 +::::::::::::::::::::: +介绍文本 + +``` + +## 6、 类 Python 的 C++ API文档 + +对于类 Python 的 C++ API,如果参数信息能够与Python完全对齐,则需要同步展示Python的信息,并且复用部分Python的说明文本。 + +`PADDLE_API Tensor abs(const Tensor& x);`是一个类 Python 的 C++ API,API 能够完全与 Python 端对齐,故展示页面不仅要展示C++的信息,还要展示对应的 Python API 信息。以abs为例,其中文文档内容应为: ```python .. _cn_api_fluid_layers_abs: @@ -138,14 +163,6 @@ paddle\phi\api\include\api.h ::::::::::::::::::::: 输出 Tensor,与 ``x`` 维度相同。 -代码示例 -::::::::::::::::::::: - -#include "paddle/extension.h" - -auto x = paddle::full({3, 4}, -1.0); -auto grad_x = paddle::abs(x); - ``` 该API对应的Python文档为: @@ -179,7 +196,7 @@ COPY-FROM: paddle.abs ``` -## 6、 C++ class文档 +## 7、 C++ class文档 C++ class文档的示例模板如下: @@ -227,26 +244,35 @@ fun2 介绍文本 ``` -## 7、 更新与维护 +## 8、 日常更新与维护 每日更新时,拉取最新paddle源码,并编译对应的whl包,用于自动提取PADDLE_API。对于不同的提取结果,采用不同的策略: - 对于已有但是没有抽取到的信息,可以被视为退场,docs目录下虽然保存对应的rst文件,但不在官网页面展示 - 对于新增或修改的信息,通过脚本自动抽取对应信息生成rst文档。 - 对于类Python 的 C++ API,不仅需要解析C++的文件信息,还需要根据对应Python 文档修改rst内容。 +## 9、 扩展与维护成本 + +综合考虑赛题要求、赛题导师和参赛成员的意见,当前的 rfc 方案侧重于0人工维护。当前的解决方案几乎可以实现0人工维护,但在下述情况下,仍需要进行人工维护: +1. 补充注释:随着C++ 算子的开发,注释必然日趋规范,目前的API注释比仅为 3/460,即当前的注释规范可能并不稳定。在后续的工作中,注释规范可能发生变化,当我们确定了注释的格式后,需要对文档抽取函数进行少量更改,以适配新的注释格式抽取API的说明。维护量:低 + +此外,Paddle的文档应保持对用户友好,为了达成这一要求,仍需进行的工作,以及这些工作在后续API变更中带来的维护压力如下: +1. 补充说明注释:补充C++ 所有函数、类的注释。补充后,文档信息可以自动抽取与展示。工作量:大、维护压力:中。 +2. 补充示例代码:补充C++ 所有函数、类的示例代码。补充后,文档信息可以自动抽取与展示。工作量:大、维护压力:中。 +3. 补充中文信息:补充C++ 所有函数、类的中文信息,包括但不限于说明、参数解释、返回值表述。以目前的Python 中文文档为例,这些内容需要手动更改,无法自动地和代码内容对齐。工作量:大、维护压力:大。 +4. 映射类 Python C++:对所有的类Python 的 C++ API进行映射,包括但不限于两者的区别和差异,这些内容需要手动更改,可能在某次更新后,C++ API彻底与Python API割裂,不具有对应关系。工作量:大、维护压力:大。 + # 四、测试和验收的考量 C++文档上线官网的develop分支。 # 五、排期规划 整个任务的规划实时步骤如下 -1. 构建PADDLE_API抽取脚本,实现PADDLE_API抽取。 -2. 构建OverView页面和rst页面。 +1. 构建PADDLE_API抽取脚本,实现PADDLE_API抽取。(基于CppHeaderParser已实现) +2. 构建OverView页面和rst页面。(部分实现) 3. 构建API对齐脚本,用于根据抽取的API匹配当前已有的Python文档,生成对应rst。 -4. 开放Tracking Issue,募集开发者人工审查文档信息,并补充C++ 示例代码。 -5. C++ 文档接入官网文档页面develop分支 -6. C++ 文档自动化更新脚本接入官网文档页面develop分支 -7. (可选) 在Docs仓库下构建C++ 代码审查CI +4. C++ 文档接入官网文档页面develop分支 +5. C++ 文档自动化更新脚本接入官网文档页面develop分支 # 六、影响面 From c23c622ab5d074f69dcf5245902a379fc307eb89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=98=A5=E4=B9=94?= <83450930+Liyulingyue@users.noreply.github.com> Date: Wed, 10 May 2023 23:38:17 +0800 Subject: [PATCH 10/12] =?UTF-8?q?Update=20=E9=A3=9E=E6=A1=A8=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=20C++=20=E6=96=87=E6=A1=A3=E6=8A=BD=E5=8F=96=E4=B8=8E?= =?UTF-8?q?=E5=B1=95=E7=A4=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...75\345\217\226\344\270\216\345\261\225\347\244\272.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 26028f751..16f8d69c0 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -81,8 +81,8 @@ Overview 页面风格应与 [Python 的 Overview](https://www.paddlepaddle.org.c 在本版本中,飞桨框架对 C++ 接口做了许多优化,您可以参考下表来了解飞桨框架最新版的 C++ 目录结构与说明。更详细的说明,请参见 版本说明 。此外,您可参考 PaddlePaddle 的 GitHub 了解详情。 -## namespace1 -namespace1的介绍 +## name1.h +name1.h的介绍 ### class - class name 1 @@ -91,8 +91,8 @@ namespace1的介绍 - API name 1 - API name 2 -## namespace2 -namespace2的介绍 +## name2.h +name1.h的介绍 ### class - class name 1 From 7ef4924a31c01a4e21d427275b3e2ae5bffdca01 Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Sun, 14 May 2023 02:01:31 +0800 Subject: [PATCH 11/12] add sth. --- ...26\344\270\216\345\261\225\347\244\272.md" | 103 ++++++++++++++++-- 1 file changed, 93 insertions(+), 10 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 16f8d69c0..80a458fdb 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -18,12 +18,14 @@ ## 2、功能目标 -在[飞桨API文档页面](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/index_cn.html)引入新的章节`PADDLE_API`,用于展示飞桨当前暴露给用户的C++ 接口。 +在[飞桨API文档页面](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/index_cn.html)引入新的章节`C++ API`,用于展示飞桨当前暴露给用户的C++ 接口。C++ 文档标题的位置,level 与 python 的 “API 文档” 相同,放到 “API 文档” 标题的右边。 -展示的内容为全部被`PADDLE_API`修饰的成员,包括但不仅包括API、Class、宏定义。 +展示的内容为编译后全部被`PADDLE_API`修饰的c++ 成员,包括但不仅包括API、Class、宏定义。 不失一般的,对于所有的展示的内容,应包含namespace、定义、 接口注释等。特别的,对于不同的被`PADDLE_API`修饰的成员,需要展示不同的信息。以class为例,不仅需要展示类定义,还需要展示对应的成员函数(如果有)、成员变量(如果有);对于类Python 的 API,展示内容应与Python API文档对其,包括对应的Python API名称、API介绍、参数、返回值、示例代码。 +本次工作的重心为工具的建设,而非 C++ 文档内容的建设,因此仅构造用于自动抽取并生成文档的工具。本次工作不通过人工的方式对中英文内容进行翻译或补充示例代码。 + ## 3、意义 提升c++开发用户的开发体验。 @@ -51,7 +53,7 @@ - 类Python 的 C++ API对应的Python API信息。由于两种语言的API命名几乎保持一致,可以通过搜索匹配的方式获取对应的Python API名称、说明等信息。 无法确定能够通过自动化脚本获取的信息有: -- C++ API的参数信息和返回值信息,如果C++ API的参数信息完全与Python对齐,则C++文档直接抽取Python文档的参数信息即可,否则,可能需要人工补足。 +- C++ API的参数说明,如果C++ API的参数信息完全与Python对齐,则C++文档直接抽取Python文档的参数信息即可。 - C++ API的示例代码。 考虑到赛题需求以及整个体系的维护性,仅当`类 Python 的 C++ API`的参数信息能够与python文档完全对应时,拷贝python文档的参数解释信息。 @@ -60,7 +62,7 @@ - 总览,提供一个用于快速搜索的界面。例如,以 API、Class、Enum等定义类型为一级标题,namespace为二级标题的导航界面。 - 单独介绍,对于每个API、Class、Enum都提供一个单独的介绍页面。 -此外,可以进一步在docs下构造C++的示例代码运行测试脚本,以提高文档质量。 +本次工作的重心为工具的建设,而非 C++ 文档内容的建设,因此仅通过自动化的方式来生成 C++ 文档,本次工作不通过人工的方式对中英文内容进行翻译或补充示例代码。 ## 2、 C++ API抽取 @@ -107,6 +109,13 @@ name1.h的介绍 C++ 文档能够自动更新,C++ 文档的历史存档以类似于Paddle Python中文文档的形式,存放在Docs目录下。 +C++ API 文档包含: +- 函数名 +- 函数说明 +- 定义目录:能够连接到对应的paddle源代码 +- 参数:对于无注释文本,仅展示参数名和参数类型即可,对于有注释文本需要展示对应注释 +- 返回:对于无注释文本,仅展示返回值类型即可,对于有注释文本需要展示对应注释 + 下面是一个 C++ API文档的示例: ```python @@ -122,16 +131,29 @@ functionname ::::::::::::::::::::: path -返回值 +参数 +::::::::::::::::::::: + - **x** (Tensor) - 介绍文本 + +返回 ::::::::::::::::::::: 介绍文本 ``` + ## 6、 类 Python 的 C++ API文档 对于类 Python 的 C++ API,如果参数信息能够与Python完全对齐,则需要同步展示Python的信息,并且复用部分Python的说明文本。 +类 Python 的 C++ API 文档包含: +- 函数名 +- 函数说明:可以直接从Python端复用说明文本。 +- 对应Python API名称与链接 +- 定义目录:能够连接到对应的paddle源代码 +- 参数:对于无注释文本,仅展示参数名和参数类型即可,对于有注释文本需要展示对应注释。此外,可以直接从Python端复用说明文本。 +- 返回:对于无注释文本,仅展示返回值类型即可,对于有注释文本需要展示对应注释。此外,可以直接从Python端复用说明文本。 + `PADDLE_API Tensor abs(const Tensor& x);`是一个类 Python 的 C++ API,API 能够完全与 Python 端对齐,故展示页面不仅要展示C++的信息,还要展示对应的 Python API 信息。以abs为例,其中文文档内容应为: ```python @@ -198,6 +220,13 @@ COPY-FROM: paddle.abs ## 7、 C++ class文档 +C++ class 文档包含: +- 函数名 +- 函数说明 +- 定义目录:能够连接到对应的paddle源代码 +- 参数:对于无注释文本,仅展示参数名和参数类型即可,对于有注释文本需要展示对应注释。此外,可以直接从Python端复用说明文本。 +- 类函数:展示对应名称和参数。 + C++ class文档的示例模板如下: ```python @@ -251,13 +280,67 @@ fun2 - 对于新增或修改的信息,通过脚本自动抽取对应信息生成rst文档。 - 对于类Python 的 C++ API,不仅需要解析C++的文件信息,还需要根据对应Python 文档修改rst内容。 -## 9、 扩展与维护成本 - -综合考虑赛题要求、赛题导师和参赛成员的意见,当前的 rfc 方案侧重于0人工维护。当前的解决方案几乎可以实现0人工维护,但在下述情况下,仍需要进行人工维护: -1. 补充注释:随着C++ 算子的开发,注释必然日趋规范,目前的API注释比仅为 3/460,即当前的注释规范可能并不稳定。在后续的工作中,注释规范可能发生变化,当我们确定了注释的格式后,需要对文档抽取函数进行少量更改,以适配新的注释格式抽取API的说明。维护量:低 +## 9、 其他说明 +特别说明如下: +- 对齐工作可以参考 paddle/phi/api/ext/tensor_compat.h 文件,这个文件里维护了 C++ 和 Python API 完全对齐的 API 列表。 +- 部分API可以通过`paddle::`的形式进行使用,部分需要更进一步的命名空间`paddle::experimental::`进行使用。目前的解决方案是人工在代码中增加逻辑,对tensor_compat.h 文件中的API介绍时,增加说明`可以通过paddle::进行调用用`。 +- 仅对于类Python的 C++ API,我们提供中文页面,对于其他API、class,仅保证中英页面一致,不做翻译处理。 + +## 10、 扩展与维护成本 + +综合考虑赛题要求、赛题导师和参赛成员的意见,当前的 rfc 方案侧重于零人工维护,但在下述情况下,仍需要进行人工维护: +1. 补充注释:随着C++ 算子的开发,注释必然日趋规范,在后续的工作中,注释规范可能发生变化,当我们确定了注释的格式后,需要对文档抽取函数进行少量更改,以适配新的注释格式抽取API的说明。维护量:低 + - 当前仓库中注释方式有以下几类: + - 使用brief + ```python + /*! \brief Set nccl communicators. */ + ``` + - `//`和标记`NOTE`结合使用 + ```python + // NOTE: DeviceContext hold resources. Used in training scenarios. + // The interface used by the training scene, DeviceContext will initialize + // all resources and delete them when destructing. + // Note that you must set the Allocator before calling Init function. + ``` + - 使用`@`标记 + ```python + /** + * @brief Given two tensors x and y, compute Lp-norm of (x-y). + * It is not a norm in a strict sense, only as a measure of distance. + * The shapes of x and y must be broadcastable. Where, z = x - y, + * + * When p = 0, defining $0^0 = 0$, the zero-norm of z is simply + * the number of non-zero elements of z. + * $$ + * ||z||_{0} = \lim_{p \rightarrow 0} \sum_{i=1}^{m} |z_i|^p + * $$ + * + * When p = inf, the inf-norm of z is the maximum element of z. + * $$ + * ||z||_\infty=\max_i |z_i| + * $$ + * + * When p = -inf, the negative-inf-norm of z is the minimum element of z. + * $$ + * ||z||_{-\infty}=\min_i |z_i| + * $$ + * + * Otherwise, the p-norm of z follows the formula, + * $$ + * ||z||_{p} = (\sum_{i=i}^{m} |z_i|^p)^{1/p} + * $$ + * @param ctx device context + * @param x the input Tensor of Dist + * @param y the Right-hand-side input Tensor of Dist + * @param p the norm to be computed + * @param out the output of Dist, which is the p-norm of (x - y) + */ + ``` + + 其中第三种方式对于文本的描述最为清晰,但每次增加API时的工作成本都会偏大。 此外,Paddle的文档应保持对用户友好,为了达成这一要求,仍需进行的工作,以及这些工作在后续API变更中带来的维护压力如下: -1. 补充说明注释:补充C++ 所有函数、类的注释。补充后,文档信息可以自动抽取与展示。工作量:大、维护压力:中。 +1. 补充说明注释:补充C++ 所有函数、类的注释。补充后,文档信息可以自动抽取与展示。工作量:中、维护压力:小。 2. 补充示例代码:补充C++ 所有函数、类的示例代码。补充后,文档信息可以自动抽取与展示。工作量:大、维护压力:中。 3. 补充中文信息:补充C++ 所有函数、类的中文信息,包括但不限于说明、参数解释、返回值表述。以目前的Python 中文文档为例,这些内容需要手动更改,无法自动地和代码内容对齐。工作量:大、维护压力:大。 4. 映射类 Python C++:对所有的类Python 的 C++ API进行映射,包括但不限于两者的区别和差异,这些内容需要手动更改,可能在某次更新后,C++ API彻底与Python API割裂,不具有对应关系。工作量:大、维护压力:大。 From ca3953b1c8f9b3c617fd762c82b4a7cb3204b724 Mon Sep 17 00:00:00 2001 From: Liyulingyue <852433440@qq.com> Date: Mon, 15 May 2023 19:53:28 +0800 Subject: [PATCH 12/12] update file --- ...26\344\270\216\345\261\225\347\244\272.md" | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" index 80a458fdb..33828e038 100644 --- "a/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" +++ "b/rfcs/Docs/\351\243\236\346\241\250\346\241\206\346\236\266 C++ \346\226\207\346\241\243\346\212\275\345\217\226\344\270\216\345\261\225\347\244\272.md" @@ -22,7 +22,7 @@ 展示的内容为编译后全部被`PADDLE_API`修饰的c++ 成员,包括但不仅包括API、Class、宏定义。 -不失一般的,对于所有的展示的内容,应包含namespace、定义、 接口注释等。特别的,对于不同的被`PADDLE_API`修饰的成员,需要展示不同的信息。以class为例,不仅需要展示类定义,还需要展示对应的成员函数(如果有)、成员变量(如果有);对于类Python 的 API,展示内容应与Python API文档对其,包括对应的Python API名称、API介绍、参数、返回值、示例代码。 +不失一般的,对于所有的展示的内容,应包含namespace、定义、 接口注释等。特别的,对于不同的被`PADDLE_API`修饰的成员,需要展示不同的信息。以class为例,不仅需要展示类定义,还需要展示对应的成员函数(如果有)、成员变量(如果有);对于类Python 的 API,展示内容应与Python API文档对齐,包括对应的Python API名称、API介绍、参数、返回值、示例代码。 本次工作的重心为工具的建设,而非 C++ 文档内容的建设,因此仅构造用于自动抽取并生成文档的工具。本次工作不通过人工的方式对中英文内容进行翻译或补充示例代码。 @@ -144,15 +144,15 @@ path ## 6、 类 Python 的 C++ API文档 -对于类 Python 的 C++ API,如果参数信息能够与Python完全对齐,则需要同步展示Python的信息,并且复用部分Python的说明文本。 +对于类 Python 的 C++ API,提示用户该API对齐Python API。 类 Python 的 C++ API 文档包含: - 函数名 -- 函数说明:可以直接从Python端复用说明文本。 +- 函数说明 - 对应Python API名称与链接 - 定义目录:能够连接到对应的paddle源代码 -- 参数:对于无注释文本,仅展示参数名和参数类型即可,对于有注释文本需要展示对应注释。此外,可以直接从Python端复用说明文本。 -- 返回:对于无注释文本,仅展示返回值类型即可,对于有注释文本需要展示对应注释。此外,可以直接从Python端复用说明文本。 +- 参数:对于无注释文本,仅展示参数名和参数类型即可,对于有注释文本需要展示对应注释。 +- 返回:对于无注释文本,仅展示返回值类型即可,对于有注释文本需要展示对应注释。 `PADDLE_API Tensor abs(const Tensor& x);`是一个类 Python 的 C++ API,API 能够完全与 Python 端对齐,故展示页面不仅要展示C++的信息,还要展示对应的 Python API 信息。以abs为例,其中文文档内容应为: @@ -169,9 +169,7 @@ abs .. math:: out = |x| -对应的Python API -::::::::::::::::::::: -[paddle.abs(x, name=None)](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/abs_cn.html) +本 API 与 Python API 对齐,详细用法可参考链接:[paddle.abs(x, name=None)](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/abs_cn.html) 定义目录 ::::::::::::::::::::: @@ -276,7 +274,6 @@ fun2 ## 8、 日常更新与维护 每日更新时,拉取最新paddle源码,并编译对应的whl包,用于自动提取PADDLE_API。对于不同的提取结果,采用不同的策略: -- 对于已有但是没有抽取到的信息,可以被视为退场,docs目录下虽然保存对应的rst文件,但不在官网页面展示 - 对于新增或修改的信息,通过脚本自动抽取对应信息生成rst文档。 - 对于类Python 的 C++ API,不仅需要解析C++的文件信息,还需要根据对应Python 文档修改rst内容。 @@ -337,7 +334,7 @@ fun2 */ ``` - 其中第三种方式对于文本的描述最为清晰,但每次增加API时的工作成本都会偏大。 + 其中第三种方式对于文本的描述最为清晰,在后续的工作中应当要求注释始终以此种方式呈现。另外在之后的Paddle仓库代码修改中,应通过CI拦截和检测未添加注释的被PADDLE_API 修饰的C++ 函数和类。 此外,Paddle的文档应保持对用户友好,为了达成这一要求,仍需进行的工作,以及这些工作在后续API变更中带来的维护压力如下: 1. 补充说明注释:补充C++ 所有函数、类的注释。补充后,文档信息可以自动抽取与展示。工作量:中、维护压力:小。 @@ -356,6 +353,8 @@ C++文档上线官网的develop分支。 3. 构建API对齐脚本,用于根据抽取的API匹配当前已有的Python文档,生成对应rst。 4. C++ 文档接入官网文档页面develop分支 5. C++ 文档自动化更新脚本接入官网文档页面develop分支 +6. 修改当前仓库中的注释代码格式。 +7. (补充)添加CI,检查新增代码是否包含未添加注释的被PADDLE_API 修饰的C++ 函数和类,并进行拦截。 # 六、影响面