diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 45fdc772502..2bf34f9ae5d 100755
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,31 +1,38 @@
repos:
- repo: https://github.com/pre-commit/mirrors-yapf.git
- rev: v0.16.0
+ rev: v0.32.0
hooks:
- id: yapf
files: \.py$
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: a11d9314b22d8f8c7556443875b731ef05965464
+ rev: v4.1.0
hooks:
- id: check-merge-conflict
- id: check-symlinks
- id: detect-private-key
files: (?!.*paddle)^.*$
- id: end-of-file-fixer
- files: \.md$
+ files: \.md$|\.rst$
- id: trailing-whitespace
- files: \.md$
+ files: \.md$|\.rst$
- repo: https://github.com/Lucas-C/pre-commit-hooks
- rev: v1.0.1
+ rev: v1.1.14
hooks:
- id: forbid-crlf
- files: \.md$
+ files: \.md$|\.rst$
- id: remove-crlf
- files: \.md$
+ files: \.md$|\.rst$
- id: forbid-tabs
- files: \.md$
+ files: \.md$|\.rst$
- id: remove-tabs
- files: \.md$
+ files: \.md$|\.rst$
+- repo: https://github.com/ShigureLab/dochooks
+ rev: v0.3.0
+ hooks:
+ - id: check-whitespace-between-cn-and-en-char
+ files: \.md$|\.rst$
+ - id: insert-whitespace-between-cn-and-en-char
+ files: \.md$|\.rst$
- repo: https://github.com/reyoung/pre-commit-hooks-jinja-compile.git
rev: 4a369cc72a4a2b8d3813ab8cc17abb5f5b21ef6c
hooks:
diff --git a/CONTRIBUTING_cn.md b/CONTRIBUTING_cn.md
index 03d9789c769..b43b77ea3d7 100644
--- a/CONTRIBUTING_cn.md
+++ b/CONTRIBUTING_cn.md
@@ -8,7 +8,7 @@
- 使用教程
- 应用实践
-- API文档
+- API 文档
### 使用教程
@@ -16,26 +16,26 @@
### 应用实践
-应用实践主要是使用飞桨框架进行具体的案例实现。目前已经有许多开发者贡献了非常优秀的案例,如OCR识别、人脸关键点检测等,我们非常欢迎你提交你的项目到我们的repo中来,并最终呈现在飞桨的官网上。
+应用实践主要是使用飞桨框架进行具体的案例实现。目前已经有许多开发者贡献了非常优秀的案例,如 OCR 识别、人脸关键点检测等,我们非常欢迎你提交你的项目到我们的 repo 中来,并最终呈现在飞桨的官网上。
-### API文档
+### API 文档
-API文档是飞桨框架的API文档,包含了飞桨框架API的说明介绍。我们非常欢迎你对我们的API文档提出修改,不管是typo或者是修改说明与示例,我们都非常感谢你对于API文档所作出的任何贡献。
+API 文档是飞桨框架的 API 文档,包含了飞桨框架 API 的说明介绍。我们非常欢迎你对我们的 API 文档提出修改,不管是 typo 或者是修改说明与示例,我们都非常感谢你对于 API 文档所作出的任何贡献。
## 参与方式
### 使用教程
-这部分内容存放在 [docs/docs/guides](https://github.com/PaddlePaddle/docs/tree/develop/docs/guides) 目录下,你可以通过提交PR的方式,来作出你的修改。具体修改方式请参考:[文档贡献指南](https://github.com/PaddlePaddle/docs/wiki/%E6%96%87%E6%A1%A3%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)。
+这部分内容存放在 [docs/docs/guides](https://github.com/PaddlePaddle/docs/tree/develop/docs/guides) 目录下,你可以通过提交 PR 的方式,来作出你的修改。具体修改方式请参考:[文档贡献指南](https://github.com/PaddlePaddle/docs/wiki/%E6%96%87%E6%A1%A3%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)。
### 应用实践
-这部分内容分为源代码与官网文档两部分,源代码的部分以notebook的形式,存放在 [book/paddle2.0_docs](https://github.com/PaddlePaddle/book/tree/develop/paddle2.0_docs) 目录下,你可以提交你的notebook格式的源码于该目录中;在你的notebook文件被合入后,我们会将其转为md文件,存储在[docs/docs/tutorial](https://github.com/PaddlePaddle/docs/tree/develop/docs/tutorial)中,然后呈现到官网。具体信息请参考:[[Call for Contribution] Tutorials for PaddlePaddle 2.0](https://github.com/PaddlePaddle/book/issues/905).
+这部分内容分为源代码与官网文档两部分,源代码的部分以 notebook 的形式,存放在 [book/paddle2.0_docs](https://github.com/PaddlePaddle/book/tree/develop/paddle2.0_docs) 目录下,你可以提交你的 notebook 格式的源码于该目录中;在你的 notebook 文件被合入后,我们会将其转为 md 文件,存储在[docs/docs/tutorial](https://github.com/PaddlePaddle/docs/tree/develop/docs/tutorial)中,然后呈现到官网。具体信息请参考:[[Call for Contribution] Tutorials for PaddlePaddle 2.0](https://github.com/PaddlePaddle/book/issues/905).
-### API文档
+### API 文档
-飞桨框架同时提供中英文API文档。其中,英文API文档存于[Paddle](https://github.com/PaddlePaddle/Paddle/tree/develop/python/paddle)源代码中,绝大部分通过官网文档的源代码即可链接到,你可以在此位置对英文文档进行修改;而中文API文档存放在[docs/docs/api](https://github.com/PaddlePaddle/docs/tree/develop/docs/api)目录下。你可以针对文档中的任何错误与内容进行修复与完善,或者是新增你认为该文档中所需要的内容,我们非常感谢你对于API文档所付出的一切。具体修改方式请参考:[英文API文档贡献指南](https://github.com/PaddlePaddle/docs/wiki/%E8%8B%B1%E6%96%87API%E6%96%87%E6%A1%A3%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)、[中文API文档贡献指南](https://github.com/PaddlePaddle/docs/wiki/%E4%B8%AD%E6%96%87API%E6%96%87%E6%A1%A3%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)。
+飞桨框架同时提供中英文 API 文档。其中,英文 API 文档存于[Paddle](https://github.com/PaddlePaddle/Paddle/tree/develop/python/paddle)源代码中,绝大部分通过官网文档的源代码即可链接到,你可以在此位置对英文文档进行修改;而中文 API 文档存放在[docs/docs/api](https://github.com/PaddlePaddle/docs/tree/develop/docs/api)目录下。你可以针对文档中的任何错误与内容进行修复与完善,或者是新增你认为该文档中所需要的内容,我们非常感谢你对于 API 文档所付出的一切。具体修改方式请参考:[英文 API 文档贡献指南](https://github.com/PaddlePaddle/docs/wiki/%E8%8B%B1%E6%96%87API%E6%96%87%E6%A1%A3%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)、[中文 API 文档贡献指南](https://github.com/PaddlePaddle/docs/wiki/%E4%B8%AD%E6%96%87API%E6%96%87%E6%A1%A3%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97)。
-## 提交PR
+## 提交 PR
-你对于飞桨文档的任何修改,都应该通过提交PR的方式来完成,具体的方法可以参考[提交PR](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/08_contribution/local_dev_guide.html)
+你对于飞桨文档的任何修改,都应该通过提交 PR 的方式来完成,具体的方法可以参考[提交 PR](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/08_contribution/local_dev_guide.html)
diff --git a/README_cn.md b/README_cn.md
index 345c490eb45..f80db11e27a 100644
--- a/README_cn.md
+++ b/README_cn.md
@@ -4,12 +4,12 @@
docs 是 [PaddlePaddle 官网文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/index_cn.html) 的源文件。
-注意:英文版API文档直接从[PaddlePaddle/Paddle](https://github.com/PaddlePaddle/Paddle) 的 docstring 中生成,[飞桨其他项目](https://www.paddlepaddle.org.cn/overview)的文档分别在其对应的位置中管理。
+注意:英文版 API 文档直接从[PaddlePaddle/Paddle](https://github.com/PaddlePaddle/Paddle) 的 docstring 中生成,[飞桨其他项目](https://www.paddlepaddle.org.cn/overview)的文档分别在其对应的位置中管理。
## 仓库结构
- [docs](docs): 飞桨框架 2.0 以及之后版本文档的源文件。
-- [docs/api](docs/api): 飞桨中文 API文档的源文件。
+- [docs/api](docs/api): 飞桨中文 API 文档的源文件。
- [docs/guides](docs/guides): 飞桨官方教程的源文件。
- [docs/tutorial](docs/tutorial): 飞桨相关案例的源文件。
- [ci_scripts](ci_scripts): docs CI 相关的文件。
diff --git a/ci_scripts/api_white_list.txt b/ci_scripts/api_white_list.txt
index 19d4458fcf8..c2cf551a5b4 100644
--- a/ci_scripts/api_white_list.txt
+++ b/ci_scripts/api_white_list.txt
@@ -1,12 +1,9 @@
-paddle/fluid/DistributeTranspiler_cn.rst
-paddle/fluid/DistributeTranspilerConfig_cn.rst
+paddle/fluid/transpiler/DistributeTranspiler_cn.rst
+paddle/fluid/transpiler/DistributeTranspilerConfig_cn.rst
paddle/fluid/transpiler/HashName_cn.rst
-paddle/fluid/memory_optimize_cn.rst
-paddle/fluid/release_memory_cn.rst
-paddle/optimizer/Dpsgd_cn.rst
-paddle/reader/ComposeNotAligned_cn.rst
+paddle/fluid/transpiler/memory_optimize_cn.rst
+paddle/fluid/transpiler/release_memory_cn.rst
paddle/fluid/layers/scatter_cn.rst
-paddle/tensor/manipulation/scatter_cn.rst
paddle/distributed/init_parallel_env_cn.rst
paddle/distributed/spawn_cn.rst
paddle/distributed/ReduceOp_cn.rst
@@ -18,25 +15,16 @@ paddle/distributed/barrier_cn.rst
paddle/distributed/broadcast_cn.rst
paddle/distributed/split_cn.rst
paddle/distributed/fleet/Fleet_cn.rst
-paddle/distributed/fleet/utils/fs/ExecuteError_cn.rst
-paddle/distributed/fleet/utils/fs/FSFileExistsError_cn.rst
-paddle/distributed/fleet/utils/fs/FSFileNotExistsError_cn.rst
-paddle/distributed/fleet/utils/fs/FSShellCmdAborted_cn.rst
-paddle/distributed/fleet/utils/fs/FSTimeOut_cn.rst
-paddle/distributed/fleet/utils/fs/FS_cn.rst
-paddle/distributed/fleet/utils/fs/HDFSClient_cn.rst
-paddle/distributed/fleet/utils/fs/LocalFS_cn.rst
-paddle/fluid/dygraph/parallel/DataParallel_cn.rst
-paddle/fluid/dygraph/parallel/ParallelEnv_cn.rst
-paddle/fluid/framework/is_compiled_with_xpu_cn.rst
-paddle/fluid/framework/xpu_places_cn.rst
-paddle/fluid/core/XPUPlace_cn.rst
+paddle/distributed/fleet/utils/HDFSClient_cn.rst
+paddle/distributed/fleet/utils/LocalFS_cn.rst
+paddle/DataParallel_cn.rst
+paddle/distributed/ParallelEnv_cn.rst
+paddle/device/is_compiled_with_xpu_cn.rst
+paddle/static/xpu_places_cn.rst
+paddle/device/XPUPlace_cn.rst
paddle/utils/cpp_extension/load_cn.rst
paddle/utils/cpp_extension/setup_cn.rst
paddle/utils/cpp_extension/CppExtension_cn.rst
paddle/utils/cpp_extension/CUDAExtension_cn.rst
-upgrade_guide_cn.md
-paddle/hapi/hub/Overview_cn.rst
-paddle/hapi/hub/help_cn.rst
-paddle/hapi/hub/list_cn.rst
-paddle/hapi/hub/load_cn.rst
+paddle/hub/Overview_cn.rst
+paddle/incubate/autograd/Overview_cn.rst
\ No newline at end of file
diff --git a/ci_scripts/check_api_cn.sh b/ci_scripts/check_api_cn.sh
index f2923e99045..34d688b8778 100644
--- a/ci_scripts/check_api_cn.sh
+++ b/ci_scripts/check_api_cn.sh
@@ -11,7 +11,7 @@ function filter_cn_api_files() {
local __resultvar=$2
local need_check_files=""
for file in `echo $git_files`;do
- grep "code-block" ../docs/$file > /dev/null
+ grep 'code-block:: python' ../docs/$file > /dev/null
if [ $? -eq 0 ] ;then
api_file=`echo $file | sed 's#api/##g'`
grep -w "${api_file}" ${DIR_PATH}/api_white_list.txt > /dev/null
diff --git a/docs/advanced_guide/index_en.rst b/docs/advanced_guide/index_en.rst
index d6401bceb56..f44212dadfb 100644
--- a/docs/advanced_guide/index_en.rst
+++ b/docs/advanced_guide/index_en.rst
@@ -17,4 +17,3 @@ So far you have already been familiar with PaddlePaddle. And the next expectatio
inference_deployment/index_en.rst
flags/flags_en.rst
-
diff --git a/docs/advanced_guide/performance_improving/amp/amp.md b/docs/advanced_guide/performance_improving/amp/amp.md
index 3a41a447f78..d0b8866bfb3 100644
--- a/docs/advanced_guide/performance_improving/amp/amp.md
+++ b/docs/advanced_guide/performance_improving/amp/amp.md
@@ -1,30 +1,30 @@
# 混合精度训练最佳实践
-Automatic Mixed Precision (AMP) 是一种自动混合使用半精度(FP16)和单精度(FP32)来加速模型训练的技术。AMP技术可方便用户快速将使用 FP32 训练的模型修改为使用混合精度训练,并通过黑白名单和动态`loss scaling`来保证训练时的数值稳定性进而避免梯度Infinite或者NaN(Not a Number)。借力于新一代NVIDIA GPU中Tensor Cores的计算性能,PaddlePaddle AMP技术在ResNet50、Transformer等模型上训练速度相对于FP32训练加速比可达1.5~2.9。
+Automatic Mixed Precision (AMP) 是一种自动混合使用半精度(FP16)和单精度(FP32)来加速模型训练的技术。AMP 技术可方便用户快速将使用 FP32 训练的模型修改为使用混合精度训练,并通过黑白名单和动态`loss scaling`来保证训练时的数值稳定性进而避免梯度 Infinite 或者 NaN(Not a Number)。借力于新一代 NVIDIA GPU 中 Tensor Cores 的计算性能,PaddlePaddle AMP 技术在 ResNet50、Transformer 等模型上训练速度相对于 FP32 训练加速比可达 1.5~2.9。
-### 半精度浮点类型FP16
+### 半精度浮点类型 FP16
-如图 1 所示,半精度(Float Precision16,FP16)是一种相对较新的浮点类型,在计算机中使用2字节(16位)存储。在IEEE 754-2008标准中,它亦被称作binary16。与计算中常用的单精度(FP32)和双精度(FP64)类型相比,FP16更适于在精度要求不高的场景中使用。
+如图 1 所示,半精度(Float Precision16,FP16)是一种相对较新的浮点类型,在计算机中使用 2 字节(16 位)存储。在 IEEE 754-2008 标准中,它亦被称作 binary16。与计算中常用的单精度(FP32)和双精度(FP64)类型相比,FP16 更适于在精度要求不高的场景中使用。
-### 英伟达GPU的FP16算力
+### 英伟达 GPU 的 FP16 算力
-在使用相同的超参数下,混合精度训练使用半精度浮点(FP16)和单精度(FP32)浮点即可达到与使用纯单精度训练相同的准确率,并可加速模型的训练速度。这主要得益于英伟达推出的Volta及Turing架构GPU在使用FP16计算时具有如下特点:
+在使用相同的超参数下,混合精度训练使用半精度浮点(FP16)和单精度(FP32)浮点即可达到与使用纯单精度训练相同的准确率,并可加速模型的训练速度。这主要得益于英伟达推出的 Volta 及 Turing 架构 GPU 在使用 FP16 计算时具有如下特点:
-* FP16可降低一半的内存带宽和存储需求,这使得在相同的硬件条件下研究人员可使用更大更复杂的模型以及更大的batch size大小。
-* FP16可以充分利用英伟达Volta及Turing架构GPU提供的Tensor Cores技术。在相同的GPU硬件上,Tensor Cores的FP16计算吞吐量是FP32的8倍。
+* FP16 可降低一半的内存带宽和存储需求,这使得在相同的硬件条件下研究人员可使用更大更复杂的模型以及更大的 batch size 大小。
+* FP16 可以充分利用英伟达 Volta 及 Turing 架构 GPU 提供的 Tensor Cores 技术。在相同的 GPU 硬件上,Tensor Cores 的 FP16 计算吞吐量是 FP32 的 8 倍。
-### PaddlePaddle AMP功能——牛刀小试
+### PaddlePaddle AMP 功能——牛刀小试
-如前文所述,使用FP16数据类型可能会造成计算精度上的损失,但对深度学习领域而言,并不是所有计算都要求很高的精度,一些局部的精度损失对最终训练效果影响很微弱,却能使吞吐和训练速度带来大幅提升。因此,混合精度计算的需求应运而生。具体而言,训练过程中将一些对精度损失不敏感且能利用Tensor Cores进行加速的运算使用半精度处理,而对精度损失敏感部分依然保持FP32计算精度,用以最大限度提升访存和计算效率。
+如前文所述,使用 FP16 数据类型可能会造成计算精度上的损失,但对深度学习领域而言,并不是所有计算都要求很高的精度,一些局部的精度损失对最终训练效果影响很微弱,却能使吞吐和训练速度带来大幅提升。因此,混合精度计算的需求应运而生。具体而言,训练过程中将一些对精度损失不敏感且能利用 Tensor Cores 进行加速的运算使用半精度处理,而对精度损失敏感部分依然保持 FP32 计算精度,用以最大限度提升访存和计算效率。
-为了避免对每个具体模型人工地去设计和尝试精度混合的方法,PaddlePaadle框架提供自动混合精度训练(AMP)功能,解放"炼丹师"的双手。在PaddlePaddle中使用AMP训练是一件十分容易的事情,用户只需要增加一行代码即可将原有的FP32训练转变为AMP训练。下面以`MNIST`为例介绍PaddlePaddle AMP功能的使用示例。
+为了避免对每个具体模型人工地去设计和尝试精度混合的方法,PaddlePaadle 框架提供自动混合精度训练(AMP)功能,解放"炼丹师"的双手。在 PaddlePaddle 中使用 AMP 训练是一件十分容易的事情,用户只需要增加一行代码即可将原有的 FP32 训练转变为 AMP 训练。下面以`MNIST`为例介绍 PaddlePaddle AMP 功能的使用示例。
-**MNIST网络定义**
+**MNIST 网络定义**
```python
import paddle.fluid as fluid
@@ -41,16 +41,16 @@ def MNIST(data, class_dim):
return fc2
```
-针对CV(Computer Vision)类模型组网,为获得更高的训练性能需要注意如下三点:
+针对 CV(Computer Vision)类模型组网,为获得更高的训练性能需要注意如下三点:
-* `conv2d`、`batch_norm`以及`pool2d`等需要将数据布局设置为`NHWC`,这样有助于使用TensorCore技术加速计算过程1。
-* Tensor Cores要求在使用FP16加速卷积运算时conv2d的输入/输出通道数为8的倍数2,因此设计网络时推荐将conv2d层的输入/输出通道数设置为8的倍数。
-* Tensor Cores要求在使用FP16加速矩阵乘运算时矩阵行数和列数均为8的倍数3,因此设计网络时推荐将fc层的size参数设置为8的倍数。
+* `conv2d`、`batch_norm`以及`pool2d`等需要将数据布局设置为`NHWC`,这样有助于使用 TensorCore 技术加速计算过程1。
+* Tensor Cores 要求在使用 FP16 加速卷积运算时 conv2d 的输入/输出通道数为 8 的倍数2,因此设计网络时推荐将 conv2d 层的输入/输出通道数设置为 8 的倍数。
+* Tensor Cores 要求在使用 FP16 加速矩阵乘运算时矩阵行数和列数均为 8 的倍数3,因此设计网络时推荐将 fc 层的 size 参数设置为 8 的倍数。
**FP32 训练**
-为了训练 MNIST 网络,还需要定义损失函数来更新权重参数,此处使用的优化器是SGDOptimizer。为了简化说明,这里省略了迭代训练的相关代码,仅体现损失函数及优化器定义相关的内容。
+为了训练 MNIST 网络,还需要定义损失函数来更新权重参数,此处使用的优化器是 SGDOptimizer。为了简化说明,这里省略了迭代训练的相关代码,仅体现损失函数及优化器定义相关的内容。
```python
import paddle
@@ -68,48 +68,48 @@ sgd = fluid.optimizer.SGDOptimizer(learning_rate=1e-3)
sgd.minimize(avg_loss)
```
-**AMP训练**
+**AMP 训练**
-与FP32训练相比,用户仅需使用PaddlePaddle提供的`fluid.contrib.mixed_precision.decorate` 函数将原来的优化器SGDOptimizer进行封装,然后使用封装后的优化器(mp_sgd)更新参数梯度即可完成向AMP训练的转换,代码如下所示:
+与 FP32 训练相比,用户仅需使用 PaddlePaddle 提供的`fluid.contrib.mixed_precision.decorate` 函数将原来的优化器 SGDOptimizer 进行封装,然后使用封装后的优化器(mp_sgd)更新参数梯度即可完成向 AMP 训练的转换,代码如下所示:
```python
sgd = SGDOptimizer(learning_rate=1e-3)
-# 此处只需要使用fluid.contrib.mixed_precision.decorate将sgd封装成AMP训练所需的
-# 优化器mp_sgd,并使用mp_sgd.minimize(avg_loss)代替原来的sgd.minimize(avg_loss)语句即可。
+# 此处只需要使用 fluid.contrib.mixed_precision.decorate 将 sgd 封装成 AMP 训练所需的
+# 优化器 mp_sgd,并使用 mp_sgd.minimize(avg_loss)代替原来的 sgd.minimize(avg_loss)语句即可。
mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd)
mp_sgd.minimize(avg_loss)
```
-运行上述混合精度训练python脚本时为得到更好的执行性能可配置如下环境参数,并保证cudnn版本在7.4.1及以上。
+运行上述混合精度训练 python 脚本时为得到更好的执行性能可配置如下环境参数,并保证 cudnn 版本在 7.4.1 及以上。
```shell
-export FLAGS_conv_workspace_size_limit=1024 # MB,根据所使用的GPU显存容量及模型特点设置数值,值越大越有可能选择到更快的卷积算法
+export FLAGS_conv_workspace_size_limit=1024 # MB,根据所使用的 GPU 显存容量及模型特点设置数值,值越大越有可能选择到更快的卷积算法
export FLAGS_cudnn_exhaustive_search=1 # 使用穷举搜索方法来选择快速卷积算法
-export FLAGS_cudnn_batchnorm_spatial_persistent=1 # 用于触发batch_norm和relu的融合
+export FLAGS_cudnn_batchnorm_spatial_persistent=1 # 用于触发 batch_norm 和 relu 的融合
```
-上述即为最简单的PaddlePaddle AMP功能使用方法。ResNet50模型的AMP训练示例可[点击此处](https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README.md#%E6%B7%B7%E5%90%88%E7%B2%BE%E5%BA%A6%E8%AE%AD%E7%BB%83)查看,其他模型使用PaddlePaddle AMP的方法也与此类似。若AMP训练过程中出现连续的loss nan等不收敛现象,可尝试使用[check nan inf工具](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/flags/check_nan_inf_cn.html#span-id-speed-span)进行调试。
+上述即为最简单的 PaddlePaddle AMP 功能使用方法。ResNet50 模型的 AMP 训练示例可[点击此处](https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README.md#%E6%B7%B7%E5%90%88%E7%B2%BE%E5%BA%A6%E8%AE%AD%E7%BB%83)查看,其他模型使用 PaddlePaddle AMP 的方法也与此类似。若 AMP 训练过程中出现连续的 loss nan 等不收敛现象,可尝试使用[check nan inf 工具](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/flags/check_nan_inf_cn.html#span-id-speed-span)进行调试。
-### PaddlePaddle AMP功能——进阶使用
+### PaddlePaddle AMP 功能——进阶使用
-上一小节所述均为默认AMP训练行为,用户当然也可以改变一些默认的参数设置来满足特定的模型训练场景需求。接下来的章节将介绍PaddlePaddle AMP功能使用中用户可配置的参数行为,即进阶使用技巧。
+上一小节所述均为默认 AMP 训练行为,用户当然也可以改变一些默认的参数设置来满足特定的模型训练场景需求。接下来的章节将介绍 PaddlePaddle AMP 功能使用中用户可配置的参数行为,即进阶使用技巧。
#### 自定义黑白名单
-PaddlePaddle AMP功能实现中根据FP16数据类型计算稳定性和加速效果在框架内部定义了算子(Op)的黑白名单。具体来说,将对FP16计算友好且能利用Tensor Cores的Op归类于白名单,将使用FP16计算会导致数值不稳定的Op归类于黑名单,将对FP16计算没有多少影响的Op归类于灰名单。然而,框架开发人员不可能考虑到所有的网络模型情况,尤其是那些特殊场景中使用到的模型。用户可以在使用`fluid.contrib.mixed_precision.decorate` 函数时通过指定自定义的黑白名单列表来改变默认的FP16计算行为。
+PaddlePaddle AMP 功能实现中根据 FP16 数据类型计算稳定性和加速效果在框架内部定义了算子(Op)的黑白名单。具体来说,将对 FP16 计算友好且能利用 Tensor Cores 的 Op 归类于白名单,将使用 FP16 计算会导致数值不稳定的 Op 归类于黑名单,将对 FP16 计算没有多少影响的 Op 归类于灰名单。然而,框架开发人员不可能考虑到所有的网络模型情况,尤其是那些特殊场景中使用到的模型。用户可以在使用`fluid.contrib.mixed_precision.decorate` 函数时通过指定自定义的黑白名单列表来改变默认的 FP16 计算行为。
```python
sgd = SGDOptimizer(learning_rate=1e-3)
-# list1是白名单op列表,list2是黑名单op列表,list3是黑名单var_name列表(凡是以这些黑名单var_name为输入或输出的op均会被视为黑名单op)
+# list1 是白名单 op 列表,list2 是黑名单 op 列表,list3 是黑名单 var_name 列表(凡是以这些黑名单 var_name 为输入或输出的 op 均会被视为黑名单 op)
amp_list = AutoMixedPrecisionLists(custom_white_list=list1, custom_black_list=list2, custom_black_varnames=list3)
mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd, amp_list)
mp_sgd.minimize(avg_loss)
```
-#### 自动loss scaling
+#### 自动 loss scaling
-为了避免梯度Infinite或者NAN,PaddlePaddle AMP功能支持根据训练过程中梯度的数值自动调整loss scale值。用户在使用`fluid.contrib.mixed_precision.decorate` 函数时也可以改变与loss scaling相关的参数设置,示例如下:
+为了避免梯度 Infinite 或者 NAN,PaddlePaddle AMP 功能支持根据训练过程中梯度的数值自动调整 loss scale 值。用户在使用`fluid.contrib.mixed_precision.decorate` 函数时也可以改变与 loss scaling 相关的参数设置,示例如下:
```python
sgd = SGDOptimizer(learning_rate=1e-3)
@@ -124,43 +124,43 @@ mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd,
mp_sgd.minimize(avg_loss)
```
-`init_loss_scaling `、`incr_every_n_steps` 以及`decr_every_n_nan_or_inf`等参数控制着自动loss scaling的行为。它们仅当 `use_dynamic_loss_scaling`设置为True时有效。下面详述这些参数的意义:
+`init_loss_scaling `、`incr_every_n_steps` 以及`decr_every_n_nan_or_inf`等参数控制着自动 loss scaling 的行为。它们仅当 `use_dynamic_loss_scaling`设置为 True 时有效。下面详述这些参数的意义:
-* init_loss_scaling(float):初始loss scaling值。
-* incr_every_n_steps(int):每经过incr_every_n_steps个连续的正常梯度值才会增大loss scaling值。
-* decr_every_n_nan_or_inf(int):每经过decr_every_n_nan_or_inf个连续的无效梯度值(nan或者inf)才会减小loss scaling值。
-* incr_ratio(float):每次增大loss scaling值的扩增倍数,其为大于1的浮点数。
-* decr_ratio(float):每次减小loss scaling值的比例系数,其为小于1的浮点数。
+* init_loss_scaling(float):初始 loss scaling 值。
+* incr_every_n_steps(int):每经过 incr_every_n_steps 个连续的正常梯度值才会增大 loss scaling 值。
+* decr_every_n_nan_or_inf(int):每经过 decr_every_n_nan_or_inf 个连续的无效梯度值(nan 或者 inf)才会减小 loss scaling 值。
+* incr_ratio(float):每次增大 loss scaling 值的扩增倍数,其为大于 1 的浮点数。
+* decr_ratio(float):每次减小 loss scaling 值的比例系数,其为小于 1 的浮点数。
-### 多卡GPU训练的优化
+### 多卡 GPU 训练的优化
-PaddlePaddle AMP功能对多卡GPU训练进行了深度优化。如图 2 所示,优化之前的参数梯度更新特点:梯度计算时虽然使用的是FP16数据类型,但是不同GPU卡之间的梯度传输数据类型仍为FP32。
+PaddlePaddle AMP 功能对多卡 GPU 训练进行了深度优化。如图 2 所示,优化之前的参数梯度更新特点:梯度计算时虽然使用的是 FP16 数据类型,但是不同 GPU 卡之间的梯度传输数据类型仍为 FP32。
-为了降低GPU多卡之间的梯度传输带宽,我们将梯度传输提前至`Cast`操作之前,而每个GPU卡在得到对应的FP16梯度后再执行`Cast`操作将其转变为FP32类型,具体操作详见图2。这一优化在训练大模型时对减少带宽占用尤其有效,如多卡训练BERT-Large模型。
+为了降低 GPU 多卡之间的梯度传输带宽,我们将梯度传输提前至`Cast`操作之前,而每个 GPU 卡在得到对应的 FP16 梯度后再执行`Cast`操作将其转变为 FP32 类型,具体操作详见图 2。这一优化在训练大模型时对减少带宽占用尤其有效,如多卡训练 BERT-Large 模型。
### 训练性能对比(AMP VS FP32)
-PaddlePaddle AMP技术在ResNet50、Transformer等模型上训练速度相对于FP32训练上均有可观的加速比,下面是ResNet50和ERNIE Large模型的AMP训练相对于FP32训练的加速效果。
+PaddlePaddle AMP 技术在 ResNet50、Transformer 等模型上训练速度相对于 FP32 训练上均有可观的加速比,下面是 ResNet50 和 ERNIE Large 模型的 AMP 训练相对于 FP32 训练的加速效果。
-图 4. Paddle AMP训练加速效果(横坐标为卡数,如8*8代表8机8卡)
+图 4. Paddle AMP 训练加速效果(横坐标为卡数,如 8*8 代表 8 机 8 卡)
|
|
-从图4所示的图表可以看出,ResNet50的AMP训练相对与FP32训练加速比可达$2.8 \times$以上,而ERNIE Large的AMP训练相对与FP32训练加速比亦可达 $1.7 \times -- 2.1 \times$ 。
+从图 4 所示的图表可以看出,ResNet50 的 AMP 训练相对与 FP32 训练加速比可达$2.8 \times$以上,而 ERNIE Large 的 AMP 训练相对与 FP32 训练加速比亦可达 $1.7 \times -- 2.1 \times$ 。
### 参考文献
diff --git a/docs/advanced_guide/performance_improving/inference_improving/paddle_xpu_infer_cn.md b/docs/advanced_guide/performance_improving/inference_improving/paddle_xpu_infer_cn.md
index 8faf2504553..e08fdb781e9 100644
--- a/docs/advanced_guide/performance_improving/inference_improving/paddle_xpu_infer_cn.md
+++ b/docs/advanced_guide/performance_improving/inference_improving/paddle_xpu_infer_cn.md
@@ -1,16 +1,16 @@
# 使用昆仑预测
-百度的昆仑芯⽚是⼀款⾼性能的AI SoC芯⽚,⽀持推理和训练。昆仑芯⽚采⽤百度的先进AI架构,⾮常适合常⽤的深度学习和机器学习算法的云端计算需求,并能适配诸如⾃然语⾔处理、⼤规模语⾳识别、⾃动驾驶、⼤规模推荐等多种终端场景的计算需求。
+百度的昆仑芯⽚是⼀款⾼性能的 AI SoC 芯⽚,⽀持推理和训练。昆仑芯⽚采⽤百度的先进 AI 架构,⾮常适合常⽤的深度学习和机器学习算法的云端计算需求,并能适配诸如⾃然语⾔处理、⼤规模语⾳识别、⾃动驾驶、⼤规模推荐等多种终端场景的计算需求。
-Paddle Inference集成了[Paddle-Lite预测引擎](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/baidu_xpu.html)在昆仑xpu上进行预测部署。
+Paddle Inference 集成了[Paddle-Lite 预测引擎](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/baidu_xpu.html)在昆仑 xpu 上进行预测部署。
## 编译注意事项
-请确保编译的时候设置了WITH_LITE=ON,且XPU_SDK_ROOT设置了正确的路径。
+请确保编译的时候设置了 WITH_LITE=ON,且 XPU_SDK_ROOT 设置了正确的路径。
## 使用介绍
-在使用Predictor时,我们通过配置Config中的接口,在XPU上运行。
+在使用 Predictor 时,我们通过配置 Config 中的接口,在 XPU 上运行。
```c++
config->EnableLiteEngine(
@@ -21,12 +21,12 @@ config->EnableLiteEngine(
)
```
-- **`precision_mode`**,类型:`enum class PrecisionType {kFloat32 = 0, kHalf, kInt8,};`, 默认值为`PrecisionType::kFloat32`。指定lite子图的运行精度。
-- **`zero_copy`**,类型:bool,lite子图与Paddle之间的数据传递是否是零拷贝模式。
+- **`precision_mode`**,类型:`enum class PrecisionType {kFloat32 = 0, kHalf, kInt8,};`, 默认值为`PrecisionType::kFloat32`。指定 lite 子图的运行精度。
+- **`zero_copy`**,类型:bool,lite 子图与 Paddle 之间的数据传递是否是零拷贝模式。
- **`passes_filter`**,类型:`std::vector`,默认为空,扩展借口,暂不使用。
-- **`ops_filer`**,类型:`std::vector`,默认为空,显示指定哪些op不使用lite子图运行。
+- **`ops_filer`**,类型:`std::vector`,默认为空,显示指定哪些 op 不使用 lite 子图运行。
-Python接口如下:
+Python 接口如下:
```python
config.enable_lite_engine(
@@ -39,9 +39,9 @@ config.enable_lite_engine(
### Python demo
-因目前Paddle-Inference目前未将xpu sdk打包到whl包内,所以需要用户下载xpu sdk,并加入到环境变量中,之后会考虑解决该问题。
+因目前 Paddle-Inference 目前未将 xpu sdk 打包到 whl 包内,所以需要用户下载 xpu sdk,并加入到环境变量中,之后会考虑解决该问题。
-下载[xpu_tool_chain](https://paddle-inference-dist.bj.bcebos.com/inference_demo/xpu_tool_chain.tgz),解压后将shlib加入到LD_LIBRARY_PATH
+下载[xpu_tool_chain](https://paddle-inference-dist.bj.bcebos.com/inference_demo/xpu_tool_chain.tgz),解压后将 shlib 加入到 LD_LIBRARY_PATH
```
tar xzf xpu_tool_chain.tgz
@@ -56,7 +56,7 @@ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/output/XTDK/shlib/:$PWD/output/XTDK
python resnet50_subgraph.py --model_file ./ResNet50/model --params_file ./ResNet50/params
```
-resnet50_subgraph.py的内容是:
+resnet50_subgraph.py 的内容是:
```
import argparse
diff --git a/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice.rst b/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice.rst
index 453b54a08f7..c50b4506d21 100644
--- a/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice.rst
+++ b/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice.rst
@@ -1,18 +1,18 @@
.. _api_guide_cpu_training_best_practice:
####################
-分布式CPU训练优秀实践
+分布式 CPU 训练优秀实践
####################
-提高CPU分布式训练的训练速度,主要要从四个方面来考虑:
-1)提高训练速度,主要是提高CPU的使用率;2)提高通信速度,主要是减少通信传输的数据量;3)提高数据IO速度;4)更换分布式训练策略,提高分布式训练速度。
+提高 CPU 分布式训练的训练速度,主要要从四个方面来考虑:
+1)提高训练速度,主要是提高 CPU 的使用率;2)提高通信速度,主要是减少通信传输的数据量;3)提高数据 IO 速度;4)更换分布式训练策略,提高分布式训练速度。
-提高CPU的使用率
+提高 CPU 的使用率
=============
-提高CPU使用率主要依赖 :code:`ParallelExecutor`,可以充分利用多个CPU的计算能力来加速计算。
+提高 CPU 使用率主要依赖 :code:`ParallelExecutor`,可以充分利用多个 CPU 的计算能力来加速计算。
-API详细使用方法参考 :ref:`cn_api_fluid_ParallelExecutor` ,简单实例用法:
+API 详细使用方法参考 :ref:`cn_api_fluid_ParallelExecutor` ,简单实例用法:
.. code-block:: python
@@ -20,7 +20,7 @@ API详细使用方法参考 :ref:`cn_api_fluid_ParallelExecutor` ,简单实例
exec_strategy = fluid.ExecutionStrategy()
exec_strategy.num_threads = 8
- # 配置构图策略,对于CPU训练而言,应该使用Reduce模式进行训练
+ # 配置构图策略,对于 CPU 训练而言,应该使用 Reduce 模式进行训练
build_strategy = fluid.BuildStrategy()
if int(os.getenv("CPU_NUM")) > 1:
build_strategy.reduce_strategy = fluid.BuildStrategy.ReduceStrategy.Reduce
@@ -34,13 +34,13 @@ API详细使用方法参考 :ref:`cn_api_fluid_ParallelExecutor` ,简单实例
以上参数中:
-- :code:`num_threads` : 模型训练使用的线程数,最好和训练所在机器的物理CPU核数接近
-- :code:`reduce_strategy` : 对于CPU训练而言,应该选择 fluid.BuildStrategy.ReduceStrategy.Reduce
+- :code:`num_threads` : 模型训练使用的线程数,最好和训练所在机器的物理 CPU 核数接近
+- :code:`reduce_strategy` : 对于 CPU 训练而言,应该选择 fluid.BuildStrategy.ReduceStrategy.Reduce
通用环境变量配置:
-- :code:`CPU_NUM` :模型副本replica的个数,最好和num_threads一致
+- :code:`CPU_NUM` :模型副本 replica 的个数,最好和 num_threads 一致
提高通信速度
@@ -55,17 +55,17 @@ API详细使用方法参考 :ref:`cn_api_fluid_ParallelExecutor` ,简单实例
以上参数中:
-- :code:`is_sparse` : 配置embedding使用稀疏更新,如果embedding的dict_size很大,而每次数据data很少,建议使用sparse更新方式。
+- :code:`is_sparse` : 配置 embedding 使用稀疏更新,如果 embedding 的 dict_size 很大,而每次数据 data 很少,建议使用 sparse 更新方式。
-提高数据IO速度
+提高数据 IO 速度
==========
-要提高CPU分布式的数据IO速度,可以首先考虑使用dataset API进行数据读取。 dataset是一种多生产者多消费者模式的数据读取方法,默认情况下耦合数据读取线程与训练线程,在多线程的训练中,dataset表现出极高的性能优势。
+要提高 CPU 分布式的数据 IO 速度,可以首先考虑使用 dataset API 进行数据读取。 dataset 是一种多生产者多消费者模式的数据读取方法,默认情况下耦合数据读取线程与训练线程,在多线程的训练中,dataset 表现出极高的性能优势。
-API接口介绍可以参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/dataset_cn/QueueDataset_cn.html
+API 接口介绍可以参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/dataset_cn/QueueDataset_cn.html
-结合实际的网络,比如CTR-DNN模型,引入的方法可以参考:https://github.com/PaddlePaddle/models/tree/release/1.7/PaddleRec/ctr/dnn
+结合实际的网络,比如 CTR-DNN 模型,引入的方法可以参考:https://github.com/PaddlePaddle/models/tree/release/1.7/PaddleRec/ctr/dnn
最后使用 :code:`train_from_dataset` 接口来进行网络的训练:
@@ -80,7 +80,7 @@ API接口介绍可以参考:https://www.paddlepaddle.org.cn/documentation/docs
更换分布式训练策略
==========
-CPU分布式训练速度进一步提高的核心在于选择合适的分布式训练策略,比如定义通信策略、编译策略、执行策略等等。paddlepaddle于v1.7版本发布了 :code:`DistributedStrategy` 功能,可以十分灵活且方便的指定分布式运行策略。
+CPU 分布式训练速度进一步提高的核心在于选择合适的分布式训练策略,比如定义通信策略、编译策略、执行策略等等。paddlepaddle 于 v1.7 版本发布了 :code:`DistributedStrategy` 功能,可以十分灵活且方便的指定分布式运行策略。
首先需要在代码中引入相关库:
@@ -90,29 +90,29 @@ CPU分布式训练速度进一步提高的核心在于选择合适的分布式
import paddle.fluid.incubate.fleet.base.role_maker as role_maker
from paddle.fluid.incubate.fleet.parameter_server.distribute_transpiler.distributed_strategy_factory import DistributedStrategyFactory
-然后指定CPU分布式运行的训练策略,目前可选配置有四种:同步训练(Sync)、异步训练(Async)、半异步训练(Half-Async)以及GEO训练。
+然后指定 CPU 分布式运行的训练策略,目前可选配置有四种:同步训练(Sync)、异步训练(Async)、半异步训练(Half-Async)以及 GEO 训练。
-通过如下代码引入上述策略的默认配置,并进行CPU分布式训练:
+通过如下代码引入上述策略的默认配置,并进行 CPU 分布式训练:
.. code-block:: python
- # step1: 引入CPU分布式训练策略
+ # step1: 引入 CPU 分布式训练策略
# 同步训练策略
strategy = DistributedStrategyFactory.create_sync_strategy()
# 半异步训练策略
strategy = DistributedStrategyFactory.create_half_async_strategy()
# 异步训练策略
strategy = DistributedStrategyFactory.create_async_strategy()
- # GEO训练策略
+ # GEO 训练策略
strategy = DistributedStrategyFactory.create_geo_strategy(update_frequency=400)
# step2: 定义节点角色
role = role_maker.PaddleCloudRoleMaker()
fleet.init(role)
- # step3: 分布式训练program构建
- optimizer = fluid.optimizer.SGD(learning_rate) # 以SGD优化器为例
+ # step3: 分布式训练 program 构建
+ optimizer = fluid.optimizer.SGD(learning_rate) # 以 SGD 优化器为例
optimizer = fleet.distributed_optimizer(optimizer, strategy)
optimizer.minimize(loss)
@@ -125,37 +125,37 @@ CPU分布式训练速度进一步提高的核心在于选择合适的分布式
elif fleet.is_worker():
fleet.init_worker()
exe.run(fleet.startup_program)
- # Do training
+ # Do training
exe.run(fleet.main_program)
fleet.stop_worker()
-paddlepaddle支持对训练策略中的细节进行调整:
+paddlepaddle 支持对训练策略中的细节进行调整:
-- 创建compiled_program所需的build_strategy及exec_strategy可以直接基于strategy获得
+- 创建 compiled_program 所需的 build_strategy 及 exec_strategy 可以直接基于 strategy 获得
.. code-block:: python
compiled_program = fluid.compiler.CompiledProgram(fleet.main_program).with_data_parallel(
- loss_name=loss.name,
- build_strategy=strategy.get_build_strategy(),
+ loss_name=loss.name,
+ build_strategy=strategy.get_build_strategy(),
exec_strategy=strategy.get_execute_strategy())
-- 自定义训练策略细节,支持对DistributeTranspilerConfig、TrainerRuntimeConfig、ServerRuntimeConfig、fluid.ExecutionStrategy、fluid.BuildStrategy进行自定义配置。以DistributeTranspilerConfig为例,修改方式如下所示:
+- 自定义训练策略细节,支持对 DistributeTranspilerConfig、TrainerRuntimeConfig、ServerRuntimeConfig、fluid.ExecutionStrategy、fluid.BuildStrategy 进行自定义配置。以 DistributeTranspilerConfig 为例,修改方式如下所示:
.. code-block:: python
strategy = DistributedStrategyFactory.create_sync_strategy()
-
+
# 方式一(推荐):
config = strategy.get_program_config()
config.min_block_size = 81920
-
-
- # 方式二:调用set_program_config修改组网相关配置,支持DistributeTranspilerConfig和dict两种数据类型
+
+
+ # 方式二:调用 set_program_config 修改组网相关配置,支持 DistributeTranspilerConfig 和 dict 两种数据类型
config = DistributeTranspilerConfig()
config.min_block_size = 81920
# config = dict()
# config['min_block_size'] = 81920
- strategy.set_program_config(config)
\ No newline at end of file
+ strategy.set_program_config(config)
diff --git a/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice_en.rst b/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice_en.rst
index f072828b153..350606f34ea 100644
--- a/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice_en.rst
+++ b/docs/advanced_guide/performance_improving/multinode_training_improving/cpu_train_best_practice_en.rst
@@ -6,12 +6,12 @@ Best practices of distributed training on CPU
To improve the training speed of CPU distributed training, we must consider two aspects:
-1. Improve the training speed mainly by improving utilization rate of CPU;
+1. Improve the training speed mainly by improving utilization rate of CPU;
2. Improve the communication speed mainly by reducing the amount of data transmitted in the communication;
3. Improve the data IO speed by dataset API;
4. Improve the distributed training speed by changing distributed training strategy.
-Improve CPU utilization
+Improve CPU utilization
=============================
The CPU utilization mainly depends on :code:`ParallelExecutor`, which can make full use of the computing power of multiple CPUs to speed up the calculation.
@@ -20,21 +20,21 @@ For detailed API usage, please refer to :ref:`api_fluid_ParallelExecutor` . A si
.. code-block:: python
- # Configure the execution strategy, mainly to set the number of threads
- exec_strategy = fluid.ExecutionStrategy()
- exec_strategy.num_threads = 8
+ # Configure the execution strategy, mainly to set the number of threads
+ exec_strategy = fluid.ExecutionStrategy()
+ exec_strategy.num_threads = 8
- # Configure the composition strategy, for CPU training, you should use the Reduce mode for training.
- build_strategy = fluid.BuildStrategy()
- if int(os.getenv("CPU_NUM")) > 1:
- build_strategy.reduce_strategy=fluid.BuildStrategy.ReduceStrategy.Reduce
+ # Configure the composition strategy, for CPU training, you should use the Reduce mode for training.
+ build_strategy = fluid.BuildStrategy()
+ if int(os.getenv("CPU_NUM")) > 1:
+ build_strategy.reduce_strategy=fluid.BuildStrategy.ReduceStrategy.Reduce
- pe = fluid.ParallelExecutor(
- use_cuda=False,
- loss_name=avg_cost.name,
- main_program=main_program,
- build_strategy=build_strategy,
- exec_strategy=exec_strategy)
+ pe = fluid.ParallelExecutor(
+ use_cuda=False,
+ loss_name=avg_cost.name,
+ main_program=main_program,
+ build_strategy=build_strategy,
+ exec_strategy=exec_strategy)
Among the parameters above:
@@ -54,8 +54,8 @@ To reduce the amount of communication data and improve communication speed is ac
.. code-block:: python
- data = fluid.layers.data(name='ids', shape=[1], dtype='int64')
- fc = fluid.layers.embedding(input=data, size=[dict_size, 16], is_sparse=True)
+ data = fluid.layers.data(name='ids', shape=[1], dtype='int64')
+ fc = fluid.layers.embedding(input=data, size=[dict_size, 16], is_sparse=True)
Among the parameters above:
@@ -116,7 +116,7 @@ The default configuration of the above policy is introduced by the following cod
fleet.init(role)
# step3: get distributed training program
- optimizer = fluid.optimizer.SGD(learning_rate) # 以SGD优化器为例
+ optimizer = fluid.optimizer.SGD(learning_rate) # 以 SGD 优化器为例
optimizer = fleet.distributed_optimizer(optimizer, strategy)
optimizer.minimize(loss)
@@ -129,7 +129,7 @@ The default configuration of the above policy is introduced by the following cod
elif fleet.is_worker():
fleet.init_worker()
exe.run(fleet.startup_program)
- # Do training
+ # Do training
exe.run(fleet.main_program)
fleet.stop_worker()
@@ -140,8 +140,8 @@ PaddlePaddle supports adjusting the details of the training strategy:
.. code-block:: python
compiled_program = fluid.compiler.CompiledProgram(fleet.main_program).with_data_parallel(
- loss_name=loss.name,
- build_strategy=strategy.get_build_strategy(),
+ loss_name=loss.name,
+ build_strategy=strategy.get_build_strategy(),
exec_strategy=strategy.get_execute_strategy())
@@ -150,15 +150,15 @@ PaddlePaddle supports adjusting the details of the training strategy:
.. code-block:: python
strategy = DistributedStrategyFactory.create_sync_strategy()
-
+
# Mode 1 (recommended):
config = strategy.get_program_config()
config.min_block_size = 81920
-
-
- # Mode 2
+
+
+ # Mode 2
config = DistributeTranspilerConfig()
config.min_block_size = 81920
# config = dict()
# config['min_block_size'] = 81920
- strategy.set_program_config(config)
\ No newline at end of file
+ strategy.set_program_config(config)
diff --git a/docs/advanced_guide/performance_improving/multinode_training_improving/dist_training_gpu.rst b/docs/advanced_guide/performance_improving/multinode_training_improving/dist_training_gpu.rst
index 18a8c703d48..ff808bc1d17 100644
--- a/docs/advanced_guide/performance_improving/multinode_training_improving/dist_training_gpu.rst
+++ b/docs/advanced_guide/performance_improving/multinode_training_improving/dist_training_gpu.rst
@@ -1,24 +1,24 @@
.. _best_practice_dist_training_gpu:
#####################
-分布式GPU训练优秀实践
+分布式 GPU 训练优秀实践
#####################
-开始优化您的GPU分布式训练任务
+开始优化您的 GPU 分布式训练任务
---------------------------
-PaddlePaddle Fluid支持在现代GPU [#]_ 服务器集群上完成高性能分布式训练。通常可以通过以下方法优化在多机多卡环境训练性能,建议在进行性能优化时,检查每项优化点并验证对应提升,从而提升最终的性能。
+PaddlePaddle Fluid 支持在现代 GPU [#]_ 服务器集群上完成高性能分布式训练。通常可以通过以下方法优化在多机多卡环境训练性能,建议在进行性能优化时,检查每项优化点并验证对应提升,从而提升最终的性能。
-一个简单的验证当前的训练程序是否需要进一步优化性能的方法,是查看GPU的计算利用率 [#]_ ,通常用 :code:`nvidia-smi` 命令查看。如果GPU利用率较低,则可能存在较大的优化空间。下面主要从数据准备、训练策略设置和训练方式三个方面介绍GPU分布式训练中常用的优化方法。
+一个简单的验证当前的训练程序是否需要进一步优化性能的方法,是查看 GPU 的计算利用率 [#]_ ,通常用 :code:`nvidia-smi` 命令查看。如果 GPU 利用率较低,则可能存在较大的优化空间。下面主要从数据准备、训练策略设置和训练方式三个方面介绍 GPU 分布式训练中常用的优化方法。
1、数据准备
===========
-数据读取的优化在GPU训练中至关重要,尤其在不断增加batch_size提升吞吐时,计算对reader性能会有更高对要求,优化reader性能需要考虑的点包括:
+数据读取的优化在 GPU 训练中至关重要,尤其在不断增加 batch_size 提升吞吐时,计算对 reader 性能会有更高对要求,优化 reader 性能需要考虑的点包括:
- - 使用 :code:`DataLoader` 。参考 `这里 `_ 使用DataLoader,并建议开启 :code:`use_double_buffer` 。
- - reader返回uint8类型数据。图片在解码后一般会以uint8类型存储,如果在reader中转换成float类型数据,会将数据体积扩大4倍。直接返回uint8数据,然后在GPU上转化成float类型进行训练可以提升数据读取效率。
- - 减少reader初始化时间 (infinite read)。在训练任务开始执行第一轮训练时,reader开始不断异步地从磁盘或其他存储中读取数据并执行预处理,然后将处理好的数据填充到队列中供计算使用。从0开始填充这个队列直到数据可以源源不断供给计算,需要一定时间的预热。所以,如果每轮训练都重新填充队列,会产生一些时间的开销。所以,在使用DataLoader时,可以让reader函数不断地产生数据,直到训练循环结束:
+ - 使用 :code:`DataLoader` 。参考 `这里 `_ 使用 DataLoader,并建议开启 :code:`use_double_buffer` 。
+ - reader 返回 uint8 类型数据。图片在解码后一般会以 uint8 类型存储,如果在 reader 中转换成 float 类型数据,会将数据体积扩大 4 倍。直接返回 uint8 数据,然后在 GPU 上转化成 float 类型进行训练可以提升数据读取效率。
+ - 减少 reader 初始化时间 (infinite read)。在训练任务开始执行第一轮训练时,reader 开始不断异步地从磁盘或其他存储中读取数据并执行预处理,然后将处理好的数据填充到队列中供计算使用。从 0 开始填充这个队列直到数据可以源源不断供给计算,需要一定时间的预热。所以,如果每轮训练都重新填充队列,会产生一些时间的开销。所以,在使用 DataLoader 时,可以让 reader 函数不断地产生数据,直到训练循环结束:
.. code-block:: python
:linenos:
@@ -39,32 +39,32 @@ PaddlePaddle Fluid支持在现代GPU [#]_ 服务器集群上完成高性能分
data_loader.reset()
-另外,可以使用DALI库提升数据处理性能。DALI是NVIDIA开发的数据加载库,更多内容请参考 `官网文档 `_ 。飞桨中如何结合使用DALI库请参考 `使用示例 `_ 。
+另外,可以使用 DALI 库提升数据处理性能。DALI 是 NVIDIA 开发的数据加载库,更多内容请参考 `官网文档 `_ 。飞桨中如何结合使用 DALI 库请参考 `使用示例 `_ 。
2、训练策略设置
===========
训练参数设置表
-.. csv-table::
+.. csv-table::
:header: "选项", "类型", "默认值", "说明"
:widths: 3, 3, 3, 5
- ":code:`num_threads`", "int", "1", "CPU线程数"
- ":code:`nccl_comm_num`", "int", "1", "nccl通信器数量"
- ":code:`fuse_all_reduce_ops`", "bool", "False", "多卡训练时,将AllReduce操纵进行融合"
- ":code:`use_hierarchical_allreduce` ", "bool", "False", "分级式reduce"
- ":code:`num_iteration_per_drop_scope`", "int", "1", "scope drop频率,设置每隔几个batch的迭代之后执行一次清理scope"
- ":code:`fetch_frequency`", "int", "1", "fetch的刷新频率"
- ":code:`fuse_bn_act_ops`", "bool", "False", "是否开启batch normalization和激活函数的融合"
- ":code:`fuse_elewise_add_act_ops`", "bool", "False", "是否开启elementwise add函数和激活函数的融合"
+ ":code:`num_threads`", "int", "1", "CPU 线程数"
+ ":code:`nccl_comm_num`", "int", "1", "nccl 通信器数量"
+ ":code:`fuse_all_reduce_ops`", "bool", "False", "多卡训练时,将 AllReduce 操纵进行融合"
+ ":code:`use_hierarchical_allreduce` ", "bool", "False", "分级式 reduce"
+ ":code:`num_iteration_per_drop_scope`", "int", "1", "scope drop 频率,设置每隔几个 batch 的迭代之后执行一次清理 scope"
+ ":code:`fetch_frequency`", "int", "1", "fetch 的刷新频率"
+ ":code:`fuse_bn_act_ops`", "bool", "False", "是否开启 batch normalization 和激活函数的融合"
+ ":code:`fuse_elewise_add_act_ops`", "bool", "False", "是否开启 elementwise add 函数和激活函数的融合"
说明:
-- 关于设置合适的CPU线程数 :code:`num_threads` 和nccl通信器数量 :code:`nccl_comm_num` 。PaddlePaddle Fluid使用“线程池” [#]_ 模型调度并执行Op,Op在启动GPU计算之前,通常需要CPU的协助,然而如果Op本身占用时间很小,“线程池”模型下又会带来额外的调度开销。使用多进程模式时,如果神经网络的计算图 [#]_ 节点间有较高的并发度,即使每个进程只在一个GPU上运行,使用多个线程可以更大限度的提升GPU利用率。nccl通信器数量 :code:`nccl_comm_num` 可以加快GPU之间的通信效率,建议单机设置为1,多机设置为2。针对CPU线程数 :code:`num_threads` ,建议单机设置为1,多机设置为 :code:`nccl_comm_num` +1。
-- 关于AllReduce融合 :code:`fuse_all_reduce_ops` ,默认情况下会将同一layer中参数的梯度的AllReduce操作合并成一个,比如对于 :code:`fluid.layers.fc` 中有Weight和Bias两个参数,打开该选项之后,原本需要两次AllReduce操作,现在只用一次AllReduce 操作。此外,为支持更大粒度的参数梯度融合,Paddle提供了 :code:`FLAGS_fuse_parameter_memory_size` 和 :code:`FLAGS_fuse_parameter_groups_size` 两个环境变量选项。用户可以指定融合AllReduce操作之后,每个AllReduce操作的梯度字节数,比如希望每次AllReduce调用传输16MB的梯度,:code:`export FLAGS_fuse_parameter_memory_size=16` ,经验值为总通信量的十分之一。可以指定每次AllReduce操作的最大层数,即到达该层数就进行AllReduce,如指定50层 :code:`export FLAGS_fuse_parameter_groups_size=50` 。注意:目前不支持sparse参数梯度。
-- 关于使用分级式reduce :code:`use_hierarchical_allreduce` 。对于多机模式,针对小数据量的通信,Ring AllReduce通信效率低,采用Hierarchical AllReduce可以解决该问题。
-- 关于降低scope drop频率 :code:`num_iteration_per_drop_scope` 和fetch频率 :code:`fetch_frequency` 。减少scope drop和fetch频率,可以减少频繁的变量内存申请、释放和拷贝,从而提升性能。
+- 关于设置合适的 CPU 线程数 :code:`num_threads` 和 nccl 通信器数量 :code:`nccl_comm_num` 。PaddlePaddle Fluid 使用“线程池” [#]_ 模型调度并执行 Op,Op 在启动 GPU 计算之前,通常需要 CPU 的协助,然而如果 Op 本身占用时间很小,“线程池”模型下又会带来额外的调度开销。使用多进程模式时,如果神经网络的计算图 [#]_ 节点间有较高的并发度,即使每个进程只在一个 GPU 上运行,使用多个线程可以更大限度的提升 GPU 利用率。nccl 通信器数量 :code:`nccl_comm_num` 可以加快 GPU 之间的通信效率,建议单机设置为 1,多机设置为 2。针对 CPU 线程数 :code:`num_threads` ,建议单机设置为 1,多机设置为 :code:`nccl_comm_num` +1。
+- 关于 AllReduce 融合 :code:`fuse_all_reduce_ops` ,默认情况下会将同一 layer 中参数的梯度的 AllReduce 操作合并成一个,比如对于 :code:`fluid.layers.fc` 中有 Weight 和 Bias 两个参数,打开该选项之后,原本需要两次 AllReduce 操作,现在只用一次 AllReduce 操作。此外,为支持更大粒度的参数梯度融合,Paddle 提供了 :code:`FLAGS_fuse_parameter_memory_size` 和 :code:`FLAGS_fuse_parameter_groups_size` 两个环境变量选项。用户可以指定融合 AllReduce 操作之后,每个 AllReduce 操作的梯度字节数,比如希望每次 AllReduce 调用传输 16MB 的梯度,:code:`export FLAGS_fuse_parameter_memory_size=16` ,经验值为总通信量的十分之一。可以指定每次 AllReduce 操作的最大层数,即到达该层数就进行 AllReduce,如指定 50 层 :code:`export FLAGS_fuse_parameter_groups_size=50` 。注意:目前不支持 sparse 参数梯度。
+- 关于使用分级式 reduce :code:`use_hierarchical_allreduce` 。对于多机模式,针对小数据量的通信,Ring AllReduce 通信效率低,采用 Hierarchical AllReduce 可以解决该问题。
+- 关于降低 scope drop 频率 :code:`num_iteration_per_drop_scope` 和 fetch 频率 :code:`fetch_frequency` 。减少 scope drop 和 fetch 频率,可以减少频繁的变量内存申请、释放和拷贝,从而提升性能。
- 关于操作融合:通过参数融合可以提升训练性能。
设置这些参数可以参考:
@@ -73,12 +73,12 @@ PaddlePaddle Fluid支持在现代GPU [#]_ 服务器集群上完成高性能分
:linenos:
dist_strategy = DistributedStrategy()
- dist_strategy.nccl_comm_num = 2 #建议多机设置为2,单机设置为1
+ dist_strategy.nccl_comm_num = 2 #建议多机设置为 2,单机设置为 1
exec_strategy = fluid.ExecutionStrategy()
- exe_st.num_threads = 3 #建议多机设置为nccl_comm_num+1,单机设置为1
- exec_strategy.num_iteration_per_drop_scope = 30 #scope drop频率
+ exe_st.num_threads = 3 #建议多机设置为 nccl_comm_num+1,单机设置为 1
+ exec_strategy.num_iteration_per_drop_scope = 30 #scope drop 频率
dist_strategy.exec_strategy = exec_strategy
- dist_strategy.fuse_all_reduce_ops = True #AllReduce是否融合
+ dist_strategy.fuse_all_reduce_ops = True #AllReduce 是否融合
...
with fluid.program_guard(main_prog, startup_prog): #组网
params = model.params
@@ -89,7 +89,7 @@ PaddlePaddle Fluid支持在现代GPU [#]_ 服务器集群上完成高性能分
for pass_id in range(PASS_NUM):
batch_id = 0
while True:
- if batch_id % fetch_frequency == 0: #fetch频率
+ if batch_id % fetch_frequency == 0: #fetch 频率
fetched = exe.run(main_prog, fetch_list)
else:
exe.run([])
@@ -100,34 +100,34 @@ PaddlePaddle Fluid支持在现代GPU [#]_ 服务器集群上完成高性能分
1、Local SGD
-GPU多机多卡同步训练过程中存在慢trainer现象,即每步中训练快的trainer的同步通信需要等待训练慢的trainer。由于每步中慢trainer的rank具有随机性,因此我们使用局部异步训练的方式——LocalSGD,通过多步异步训练(无通信阻塞)实现慢trainer时间均摊,从而提升同步训练性能。Local SGD训练方式主要有三个参数,分别是:
+GPU 多机多卡同步训练过程中存在慢 trainer 现象,即每步中训练快的 trainer 的同步通信需要等待训练慢的 trainer。由于每步中慢 trainer 的 rank 具有随机性,因此我们使用局部异步训练的方式——LocalSGD,通过多步异步训练(无通信阻塞)实现慢 trainer 时间均摊,从而提升同步训练性能。Local SGD 训练方式主要有三个参数,分别是:
-.. csv-table::
+.. csv-table::
:header: "选项", "类型", "可选值", "说明"
:widths: 3, 3, 3, 5
- ":code:`use_local_sgd`", "bool", "False/True", "是否开启Local SGD,默认不开启"
- ":code:`local_sgd_is_warm_steps`", "int", "大于0", "训练多少轮之后才使用Local SGD方式训练"
- ":code:`local_sgd_steps`", "int", "大于0", "Local SGD的步长"
+ ":code:`use_local_sgd`", "bool", "False/True", "是否开启 Local SGD,默认不开启"
+ ":code:`local_sgd_is_warm_steps`", "int", "大于 0", "训练多少轮之后才使用 Local SGD 方式训练"
+ ":code:`local_sgd_steps`", "int", "大于 0", "Local SGD 的步长"
说明:
-- Local SGD的warmup步长 :code:`local_sgd_is_warm_steps` 影响最终模型的泛化能力,一般需要等到模型参数稳定之后在进行Local SGD训练,经验值可以将学习率第一次下降时的epoch作为warmup步长,之后再进行Local SGD训练。
-- Local SGD步长 :code:`local_sgd_steps` ,一般该值越大,通信次数越少,训练速度越快,但随之而来的时模型精度下降。经验值设置为2或者4。
+- Local SGD 的 warmup 步长 :code:`local_sgd_is_warm_steps` 影响最终模型的泛化能力,一般需要等到模型参数稳定之后在进行 Local SGD 训练,经验值可以将学习率第一次下降时的 epoch 作为 warmup 步长,之后再进行 Local SGD 训练。
+- Local SGD 步长 :code:`local_sgd_steps` ,一般该值越大,通信次数越少,训练速度越快,但随之而来的时模型精度下降。经验值设置为 2 或者 4。
-具体的Local SGD的训练代码可以参考:https://github.com/PaddlePaddle/FleetX/tree/old_develop/deprecated/examples/local_sgd/resnet
+具体的 Local SGD 的训练代码可以参考:https://github.com/PaddlePaddle/FleetX/tree/old_develop/deprecated/examples/local_sgd/resnet
2、使用混合精度训练
-V100 GPU提供了 `Tensor Core `_ 可以在混合精度计算场景极大的提升性能。使用混合精度计算的例子可以参考:https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/image_classification#using-mixed-precision-training
+V100 GPU 提供了 `Tensor Core `_ 可以在混合精度计算场景极大的提升性能。使用混合精度计算的例子可以参考:https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/image_classification#using-mixed-precision-training
-目前Paddle只提供在两个模型(ResNet, BERT)的混合精度计算实现并支持static loss scaling,其他模型使用混合精度也可以参考以上的实现完成验证。
+目前 Paddle 只提供在两个模型(ResNet, BERT)的混合精度计算实现并支持 static loss scaling,其他模型使用混合精度也可以参考以上的实现完成验证。
附录
----
-.. [#] 现代GPU:指至少支持运行 `CUDA `_ 版本7.5以上的GPU
-.. [#] GPU利用率:这里指GPU计算能力被使用部分所占的百分比
+.. [#] 现代 GPU:指至少支持运行 `CUDA `_ 版本 7.5 以上的 GPU
+.. [#] GPU 利用率:这里指 GPU 计算能力被使用部分所占的百分比
.. [#] https://en.wikipedia.org/wiki/Thread_pool
.. [#] https://en.wikipedia.org/wiki/Data-flow_diagram
diff --git a/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_low_bandwidth_dgc.md b/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_low_bandwidth_dgc.md
index 7da97430c9e..16c36ab14a8 100644
--- a/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_low_bandwidth_dgc.md
+++ b/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_low_bandwidth_dgc.md
@@ -1,120 +1,120 @@
-# 低配网络的分布式GPU训练
+# 低配网络的分布式 GPU 训练
## 1. 背景
- 大规模分布式训练需要较高的网络带宽以便进行梯度的聚合更新,这限制了多节点训练时的可扩展性同时也需要昂贵的高带宽设备。在低带宽云网络等环境下进行分布式训练会变得更加糟糕。现有[Deep Gradient Compression](https://arxiv.org/abs/1712.01887)研究表明,分布式SGD中有99.9%的梯度交换都是冗余的,可以使用深度梯度压缩选择重要梯度进行通信来减少通信量,降低对通信带宽的依赖。Paddle目前实现了DGC的稀疏通信方式,可有效在低配网络下进行GPU分布式训练。下面将介绍DGC稀疏通信方式的使用方法、适用场景及基本原理。
+ 大规模分布式训练需要较高的网络带宽以便进行梯度的聚合更新,这限制了多节点训练时的可扩展性同时也需要昂贵的高带宽设备。在低带宽云网络等环境下进行分布式训练会变得更加糟糕。现有[Deep Gradient Compression](https://arxiv.org/abs/1712.01887)研究表明,分布式 SGD 中有 99.9%的梯度交换都是冗余的,可以使用深度梯度压缩选择重要梯度进行通信来减少通信量,降低对通信带宽的依赖。Paddle 目前实现了 DGC 的稀疏通信方式,可有效在低配网络下进行 GPU 分布式训练。下面将介绍 DGC 稀疏通信方式的使用方法、适用场景及基本原理。
## 2. 使用方法
-`注意:使用DGC请使用1.6.2及其之后版本,之前版本存在有若干bug。`
-DGC稀疏通信算法以DGCMomentumOptimizer接口的形式提供,目前只支持GPU多卡及GPU多机分布式,由于现有fuse策略会造成DGC失效,所以使用DGC时需设置`strategy.fuse_all_reduce_ops=False`关闭fuse。DGC只支持Momentum优化器,使用时把当前代码中的Momentum优化器替换为DGCMomentumOptimizer,并添加DGC所需参数即可。如下代码所示,其中rampup_begin_step表示从第几步开始使用DGC,更详细参数可见[api文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/optimizer_cn/DGCMomentumOptimizer_cn.html#dgcmomentumoptimizer)。
+`注意:使用 DGC 请使用 1.6.2 及其之后版本,之前版本存在有若干 bug。`
+DGC 稀疏通信算法以 DGCMomentumOptimizer 接口的形式提供,目前只支持 GPU 多卡及 GPU 多机分布式,由于现有 fuse 策略会造成 DGC 失效,所以使用 DGC 时需设置`strategy.fuse_all_reduce_ops=False`关闭 fuse。DGC 只支持 Momentum 优化器,使用时把当前代码中的 Momentum 优化器替换为 DGCMomentumOptimizer,并添加 DGC 所需参数即可。如下代码所示,其中 rampup_begin_step 表示从第几步开始使用 DGC,更详细参数可见[api 文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/optimizer_cn/DGCMomentumOptimizer_cn.html#dgcmomentumoptimizer)。
``` python
import paddle.fluid as fluid
# optimizer = fluid.optimizer.Momentum(learning_rate=0.001, momentum=0.9)
-# 替换Momentum优化器,添加DGC所需参数
+# 替换 Momentum 优化器,添加 DGC 所需参数
optimizer = fluid.optimizer.DGCMomentumOptimizer(
learning_rate=0.001, momentum=0.9, rampup_begin_step=0)
optimizer.minimize(cost)
```
-在fleet中我们提供了[DGC的示例](https://github.com/PaddlePaddle/FleetX/tree/old_develop/deprecated/examples/dgc_example)。示例中以数字手写体识别为例,将程序移植为分布式版本(注:DGC亦支持单机多卡),再加上DGC优化器。可参照此示例将单机单卡程序迁移到DGC。在单机单卡迁移到DGC过程中,一般需要先对齐多机Momentum的精度,再对齐DGC的精度。
+在 fleet 中我们提供了[DGC 的示例](https://github.com/PaddlePaddle/FleetX/tree/old_develop/deprecated/examples/dgc_example)。示例中以数字手写体识别为例,将程序移植为分布式版本(注:DGC 亦支持单机多卡),再加上 DGC 优化器。可参照此示例将单机单卡程序迁移到 DGC。在单机单卡迁移到 DGC 过程中,一般需要先对齐多机 Momentum 的精度,再对齐 DGC 的精度。
## 3. 调参&适用场景
### 3.1 预热调参
-对于正常的训练,使用DGC一般需进行预热训练,否则可能会有精度损失。如下图是ResNet50模型Imagenet数据集的训练结果,未进行预热训练的DGC最终损失了约0.3%的精度。
+对于正常的训练,使用 DGC 一般需进行预热训练,否则可能会有精度损失。如下图是 ResNet50 模型 Imagenet 数据集的训练结果,未进行预热训练的 DGC 最终损失了约 0.3%的精度。
![DGC Resnet50 acc1](images/dgc_resnet50_acc1.png)
-预热训练调参可参照论文的设置。对图像分类,论文在Cifar10和ImageNet数据集上共164和90个epochs的训练中都采用了4个epochs的预热训练。在语言模型PTB数据集上,在共40个epochs的训练中选择了1个epoch进行预热训练。在语音识别AN4数据集上,80个epochs中选择1个epoch进行预热训练。
-论文中使用了75%, 93.75%, 98.4375%, 99.6%, 99.9%稀疏度逐渐提升的策略。由于paddle稀疏梯度聚合通信使用了AllGather,通信量会随卡数增加而增长,所以在卡数较多时不推荐较低稀疏度的预热训练。如75%稀疏度时每张卡会选择25%的梯度进行通信,卡数为32时通信量是正常dense通信的32\*(1-0.75)=8倍,所以前几个epoch使用正常的dense通信为佳。可参照如下写法
+预热训练调参可参照论文的设置。对图像分类,论文在 Cifar10 和 ImageNet 数据集上共 164 和 90 个 epochs 的训练中都采用了 4 个 epochs 的预热训练。在语言模型 PTB 数据集上,在共 40 个 epochs 的训练中选择了 1 个 epoch 进行预热训练。在语音识别 AN4 数据集上,80 个 epochs 中选择 1 个 epoch 进行预热训练。
+论文中使用了 75%, 93.75%, 98.4375%, 99.6%, 99.9%稀疏度逐渐提升的策略。由于 paddle 稀疏梯度聚合通信使用了 AllGather,通信量会随卡数增加而增长,所以在卡数较多时不推荐较低稀疏度的预热训练。如 75%稀疏度时每张卡会选择 25%的梯度进行通信,卡数为 32 时通信量是正常 dense 通信的 32\*(1-0.75)=8 倍,所以前几个 epoch 使用正常的 dense 通信为佳。可参照如下写法
``` python
-# 1. 以1252个step为一个epoch,前2个epochs使用正常dense通信,后3个epochs逐步提升稀疏度为99.9%
+# 1. 以 1252 个 step 为一个 epoch,前 2 个 epochs 使用正常 dense 通信,后 3 个 epochs 逐步提升稀疏度为 99.9%
optimizer = fluid.optimizer.DGCMomentumOptimizer(
learning_rate=0.001, momentum=0.9, rampup_begin_step=1252*2,
rampup_step=1252*3, sparsity=[0.984375, 0.996, 0.999])
-# 2. 前面4个epochs都使用dense通信,之后默认0.999稀疏度运行
+# 2. 前面 4 个 epochs 都使用 dense 通信,之后默认 0.999 稀疏度运行
optimizer = fluid.optimizer.DGCMomentumOptimizer(
learning_rate=0.001, momentum=0.9, rampup_begin_step=1252*4)
```
-对于Fine-tuning训练,现测试可无需预热训练,从第0个epoch直接使用DGC即可。
+对于 Fine-tuning 训练,现测试可无需预热训练,从第 0 个 epoch 直接使用 DGC 即可。
``` python
-# 从第0步开始DGC稀疏通信
+# 从第 0 步开始 DGC 稀疏通信
optimizer = fluid.optimizer.DGCMomentumOptimizer(
learning_rate=0.001, momentum=0.9, rampup_begin_step=0)
```
### 3.2 适用场景
-DGC稀疏通信在低带宽通信瓶颈时会有较大的性能提升,但在单机多卡及RDMA网络通信并非瓶颈情况下,并不会带来性能上的提升。同时由于AllGather的通信量会随卡数的增多而增大,所以DGC的多机训练规模也不宜过大。故DGC适用于低配网络,同时节点规模不宜过大,如>128张卡。在云网络或高带宽网络设备昂贵时,DGC可有效降低训练成本。
+DGC 稀疏通信在低带宽通信瓶颈时会有较大的性能提升,但在单机多卡及 RDMA 网络通信并非瓶颈情况下,并不会带来性能上的提升。同时由于 AllGather 的通信量会随卡数的增多而增大,所以 DGC 的多机训练规模也不宜过大。故 DGC 适用于低配网络,同时节点规模不宜过大,如>128 张卡。在云网络或高带宽网络设备昂贵时,DGC 可有效降低训练成本。
## 4. 原理
本节原理部分基本来自[Deep Gradient Compression](https://arxiv.org/abs/1712.01887)论文,本文进行了部分理解翻译,英文较好者建议直接阅读论文。
### 4.1 梯度稀疏
-DGC的基本思路是通过只传送重要梯度,即只发送大于给定阈值的梯度来减少通信带宽的使用。为避免信息的丢失,DGC会将剩余梯度在局部累加起来,最终这些梯度会累加大到足以传输。
-换个角度,从理论依据上来看,局部梯度累加等同于随时间推移增加batch size,(DGC相当于每一个梯度有自己的batch size)。设定 $F(w)$ 为需要优化的loss函数,则有着N个训练节点的同步分布式SGD更新公式如下
+DGC 的基本思路是通过只传送重要梯度,即只发送大于给定阈值的梯度来减少通信带宽的使用。为避免信息的丢失,DGC 会将剩余梯度在局部累加起来,最终这些梯度会累加大到足以传输。
+换个角度,从理论依据上来看,局部梯度累加等同于随时间推移增加 batch size,(DGC 相当于每一个梯度有自己的 batch size)。设定 $F(w)$ 为需要优化的 loss 函数,则有着 N 个训练节点的同步分布式 SGD 更新公式如下
$$
F(w)=\\frac{1}{\|\\chi\|}\\sum\_{x\\in\\chi}f(x, w), \\qquad w\_{t+1}=w\_{t}-\\eta\\frac{1}{N b}\\sum\_{k=0}^{N}\\sum\_{x\\in\\mathcal{B}\_{k,t}}\\nabla f\\left(x, w\_{t}\\right) \\tag{1}
$$
-其中$\chi$是训练集,$w$是网络权值,$f(x, w)$是每个样本$x \in \chi$的loss,$\eta$是学习率,N是训练节点个数,$\mathcal{B}_{k, t}$代表第$k$个节点在第$t$个迭代时的minibatch,大小为b。
-考虑权重的第i个值,在T次迭代后,可获得
+其中$\chi$是训练集,$w$是网络权值,$f(x, w)$是每个样本$x \in \chi$的 loss,$\eta$是学习率,N 是训练节点个数,$\mathcal{B}_{k, t}$代表第$k$个节点在第$t$个迭代时的 minibatch,大小为 b。
+考虑权重的第 i 个值,在 T 次迭代后,可获得
$$
w\_{t+T}^{(i)}=w\_{t}^{(i)}-\\eta T \\cdot \\frac{1}{N b T} \\sum\_{k=1}^{N}\\left(\\sum\_{\\tau=0}^{T-1} \\sum\_{x \\in \\mathcal{B}\_{k, t+\\tau}} \\nabla^{(i)} f\\left(x, w\_{t+\\tau}\\right)\\right) \\tag{2}
$$
-等式2表明局部梯度累加可以被认为batch size从$Nb$增大为$NbT$,其中T是$w^{(i)}$两次更新的稀疏通信间隔。
+等式 2 表明局部梯度累加可以被认为 batch size 从$Nb$增大为$NbT$,其中 T 是$w^{(i)}$两次更新的稀疏通信间隔。
### 4.2 局部梯度累加改进
-正常情况,稀疏更新会严重影响收敛性。DGC中采用动量修正(Momentum Correction)和局部梯度裁减(local gradient clipping)来解决这个问题。
+正常情况,稀疏更新会严重影响收敛性。DGC 中采用动量修正(Momentum Correction)和局部梯度裁减(local gradient clipping)来解决这个问题。
#### 4.2.1 动量修正
-有着N个节点分布式训练中vanilla momentum SGD公式,
+有着 N 个节点分布式训练中 vanilla momentum SGD 公式,
$$
u\_{t}=m u\_{t-1}+\\sum\_{k=1}^{N}\\left(\\nabla\_{k, t}\\right), \\quad w\_{t+1}=w\_{t}-\\eta u\_{t} \\tag{3}
$$
其中$m$是动量因子,$N$是节点数,$\nabla_{k, t}=\frac{1}{N b} \sum_{x \in \mathcal{B}_{k, t}} \nabla f\left(x, w_{t}\right)$。
-考虑第i个权重$w^{(i)}$,在T次迭代后,权重更新公式如下,
+考虑第 i 个权重$w^{(i)}$,在 T 次迭代后,权重更新公式如下,
$$
w\_{t+T}^{(i)}=w\_{t}^{(i)}-\\eta\\left[\\cdots+\\left(\\sum\_{\\tau=0}^{T-2} m^{\\tau}\\right) \\nabla\_{k, t+1}^{(i)}+\\left(\\sum\_{\\tau=0}^{T-1} m^{\\tau}\\right) \\nabla\_{k, t}^{(i)}\\right] \\tag{4}
$$
-如果直接应用动量SGD到稀疏梯度更新中,则有公式,
+如果直接应用动量 SGD 到稀疏梯度更新中,则有公式,
$$
v_{k, t}=v_{k, t-1}+\\nabla_{k, t}, \\quad u_{t}=m u_{t-1}+\\sum_{k=1}^{N} \\operatorname{sparse}\\left(v_{k, t}\\right), \\quad w_{t+1}=w_{t}-\\eta u_{t} \\tag{5}
$$
-其中$v_k$是训练节点k上的局部梯度累加项,一旦$v_k$大于某一阈值,则会在第二项中压缩梯度进行动量更新,并使用sparse()函数获得mask清空大于阈值的梯度。
-$w^{(i)}$在T次稀疏更新后的权重为,
+其中$v_k$是训练节点 k 上的局部梯度累加项,一旦$v_k$大于某一阈值,则会在第二项中压缩梯度进行动量更新,并使用 sparse()函数获得 mask 清空大于阈值的梯度。
+$w^{(i)}$在 T 次稀疏更新后的权重为,
$$
w_{t+T}^{(i)}=w_{t}^{(i)}-\\eta\\left(\\cdots+\\nabla_{k, t+1}^{(i)}+\\nabla_{k, t}^{(i)}\\right) \\tag{6}
$$
-相比传统动量SGD,方程6缺失了累积衰减因子$\sum_{\tau=0}^{T-1} m^{\tau}$,会导致收敛精度的损失。如下图A,正常梯度更新从A点到B点,但是方程6则从A点到C点。当稀疏度很高时,会显著降低模型性能,所以需要在方程5基础上对梯度进行修正。
+相比传统动量 SGD,方程 6 缺失了累积衰减因子$\sum_{\tau=0}^{T-1} m^{\tau}$,会导致收敛精度的损失。如下图 A,正常梯度更新从 A 点到 B 点,但是方程 6 则从 A 点到 C 点。当稀疏度很高时,会显著降低模型性能,所以需要在方程 5 基础上对梯度进行修正。
-若将方程3中速度项$u_t$当作“梯度”,则方程3第二项可认为是在”梯度“$u_t$上应用传统SGD,前面已经证明了局部梯度累加在传统SGD上是有效的。因此,可以使用方程3局部累加速度项$u_t$而非累加真实的梯度$\nabla_{k, t}$来修正方程5,
+若将方程 3 中速度项$u_t$当作“梯度”,则方程 3 第二项可认为是在”梯度“$u_t$上应用传统 SGD,前面已经证明了局部梯度累加在传统 SGD 上是有效的。因此,可以使用方程 3 局部累加速度项$u_t$而非累加真实的梯度$\nabla_{k, t}$来修正方程 5,
$$
u_{k, t}=m u_{k, t-1}+\\nabla_{k, t}, \\quad v_{k, t}=v_{k, t-1}+u_{k, t}, \\quad w_{t+1}=w_{t}-\\eta \\sum_{k=1}^{N} \\operatorname{sparse}\\left(v_{k, t}\\right) \\tag{7}
$$
-修正后,如上图(b),方程可正常从A点到B点。除了传统动量方程修正,论文还给出了Nesterov动量SGD的修正方程。
+修正后,如上图(b),方程可正常从 A 点到 B 点。除了传统动量方程修正,论文还给出了 Nesterov 动量 SGD 的修正方程。
#### 4.2.2 局部梯度修剪
-梯度修剪是防止梯度爆炸的常用方法。这方法由Pascanu等人在2013年提出,当梯度的l2-norms和大于给定阈值时,就对梯度rescale。正常梯度修剪在梯度聚合后使用,而DGC因为每个节点独立的进行局部梯度累加,所以DGC在使用$G_t$累加前对其进行局部梯度修剪。阈值缩放为原来的$N^{-1/2}$
+梯度修剪是防止梯度爆炸的常用方法。这方法由 Pascanu 等人在 2013 年提出,当梯度的 l2-norms 和大于给定阈值时,就对梯度 rescale。正常梯度修剪在梯度聚合后使用,而 DGC 因为每个节点独立的进行局部梯度累加,所以 DGC 在使用$G_t$累加前对其进行局部梯度修剪。阈值缩放为原来的$N^{-1/2}$
$$
thr_{G^{k}}=N^{-1 / 2} \\cdot thr_{G} \\tag{8}
$$
### 4.3 克服迟滞效应
-因为推迟了较小梯度更新权重的时间,所以会有权重陈旧性问题。稀疏度为99.9%时大部分参数需600到1000步更新一次。迟滞效应会减缓收敛并降低模型精度。DGC中采用动量因子掩藏和预热训练来解决这问题。
+因为推迟了较小梯度更新权重的时间,所以会有权重陈旧性问题。稀疏度为 99.9%时大部分参数需 600 到 1000 步更新一次。迟滞效应会减缓收敛并降低模型精度。DGC 中采用动量因子掩藏和预热训练来解决这问题。
#### 4.3.1 动量因子掩藏
-DGC中使用下面方程来掩藏动量因子减缓陈旧性问题。
+DGC 中使用下面方程来掩藏动量因子减缓陈旧性问题。
$$
Mask \\leftarrow\\left|v_{k, t}\\right|>t h r, \\quad v_{k, t} \\leftarrow v_{k, t} \\odot \\neg Mask, \\quad u_{k, t} \\leftarrow u_{k, t} \\odot \\neg Mask \\tag{9}
$$
此掩码可以停止延迟梯度产生的动量,防止陈旧梯度把权重引入错误的方向。
#### 4.3.2 预热训练
-在训练初期,梯度变动剧烈,需要及时更新权重,此时迟滞效应影响会很大。为此DGC采用预热训练的方法,在预热期间使用更小的学习率来减缓网络的变化速度,并使用较小的稀疏度来减少需推迟更新的梯度数量。预热期间会线性增大学习率,指数型增加稀疏度到最终值。
+在训练初期,梯度变动剧烈,需要及时更新权重,此时迟滞效应影响会很大。为此 DGC 采用预热训练的方法,在预热期间使用更小的学习率来减缓网络的变化速度,并使用较小的稀疏度来减少需推迟更新的梯度数量。预热期间会线性增大学习率,指数型增加稀疏度到最终值。
### 4.4 正则化(Weight Decay)项修正
-Paddle框架以Weight Decay的形式实现正则化。以L2Decay为例,公式(3)中传统momentum添加weight decay后公式为
+Paddle 框架以 Weight Decay 的形式实现正则化。以 L2Decay 为例,公式(3)中传统 momentum 添加 weight decay 后公式为
$$
G_{t}=\\sum_{k=1}^{N}\\left(\\nabla_{k, t}\\right)+\\lambda w_{t}, \\quad u_{t}=m u_{t-1}+G_{t}, \\quad w_{t+1}=w_{t}-\\eta u_{t} \\tag{10}
$$
-其中$\lambda$为Weight Decay系数,$G_{t}$为添加L2Decay项之后的聚合梯度。由于在公式7中进行了局部动量修正,所以按照相同思路在局部梯度上运用修正的Weight Decay项。如下公式在局部梯度上添加局部Weight Decay项即可。
+其中$\lambda$为 Weight Decay 系数,$G_{t}$为添加 L2Decay 项之后的聚合梯度。由于在公式 7 中进行了局部动量修正,所以按照相同思路在局部梯度上运用修正的 Weight Decay 项。如下公式在局部梯度上添加局部 Weight Decay 项即可。
$$
\\nabla_{k, t}=\\nabla_{k, t}+\\frac{\\lambda}{N} w_{t} \\tag{11}
$$
-在模型实际训练中,通常会设置weight decay的系数$\lambda=10^{-4}$,在卡数较多如4机32卡的情况下局部weight decay系数为$\frac{\lambda}{N}=\frac{10^{-4}}{32}=3.125*10^{-6}$,在数值精度上偏低,测试训练时会损失一定精度。为此还需对局部weight decay项进行数值修正。如下公式,
+在模型实际训练中,通常会设置 weight decay 的系数$\lambda=10^{-4}$,在卡数较多如 4 机 32 卡的情况下局部 weight decay 系数为$\frac{\lambda}{N}=\frac{10^{-4}}{32}=3.125*10^{-6}$,在数值精度上偏低,测试训练时会损失一定精度。为此还需对局部 weight decay 项进行数值修正。如下公式,
$$
\\nabla_{k, t}^{'}=N \\nabla_{k, t}+\\lambda w_{t}, \\quad
G_{t}^{'}=\\sum_{k=1}^{N}\\left(\\nabla_{k, t}^{'}\\right)=N\\sum_{k=1}^{N}\\left(\\nabla_{k, t}\\right)+N\\lambda w_{t}, \\quad
diff --git a/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute.rst b/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute.rst
index b8e7ec5b2a4..8841973c398 100644
--- a/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute.rst
+++ b/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute.rst
@@ -1,11 +1,11 @@
-重计算:大Batch训练特性
+重计算:大 Batch 训练特性
=============
背景
---------
-
-随着训练数据规模的逐渐增加,训练更大、更深的深度学习模型成为一个主流趋势。目前的深度学习模型训练,通常要求保留前向计算的隐层结果,并且需要保存结果的数量会随着模型层数的增加线性增加,这对于目前能够使用的AI芯片的内存大小是个挑战。Forward Recomputation Backpropagation(FRB)可以在额外增加少量计算的情况下,显著增加模型的层数和宽度,同时也可以显著提升模型训练的batch大小。
+
+随着训练数据规模的逐渐增加,训练更大、更深的深度学习模型成为一个主流趋势。目前的深度学习模型训练,通常要求保留前向计算的隐层结果,并且需要保存结果的数量会随着模型层数的增加线性增加,这对于目前能够使用的 AI 芯片的内存大小是个挑战。Forward Recomputation Backpropagation(FRB)可以在额外增加少量计算的情况下,显著增加模型的层数和宽度,同时也可以显著提升模型训练的 batch 大小。
原理
---------
@@ -16,13 +16,13 @@
- **反向计算**:运行反向算子来计算参数(Parameter)的梯度
- **优化**:应用优化算法以更新参数值
-在前向计算过程中,前向算子会输出大量的中间计算结果,在Paddle中,使用
-Variable来存储这些隐层的中间结果。当模型层数加深时,其数量可达成千上万个,
-占据大量的内存。Paddle的 `显存回收机制 `_
+在前向计算过程中,前向算子会输出大量的中间计算结果,在 Paddle 中,使用
+Variable 来存储这些隐层的中间结果。当模型层数加深时,其数量可达成千上万个,
+占据大量的内存。Paddle 的 `显存回收机制 `_
会及时清除无用的中间结果,以节省存储。
-然而,有些中间结果是反向算子的输入,这些Variable必须存储在内存中,直到相应的反向算子计算完毕。
+然而,有些中间结果是反向算子的输入,这些 Variable 必须存储在内存中,直到相应的反向算子计算完毕。
-举个简单的例子, 我们定义一个由mul算子构成的网络,其前向计算为:
+举个简单的例子, 我们定义一个由 mul 算子构成的网络,其前向计算为:
.. math::
@@ -33,48 +33,48 @@ Variable来存储这些隐层的中间结果。当模型层数加深时,其数
其中 :math:`x, y, z` 为向量, :math:`W_1, W_2` 为矩阵。容易知道,求 :math:`W_2` 梯度的反向计算为:
.. math::
- W_{2}^{'} = z^{'} / y
+ W_{2}^{'} = z^{'} / y
可以看到反向计算中用到了前向计算生成的变量 :math:`y` ,因此变量 :math:`y` 必须存储在内存中,直到这个反向算子计算完毕。当模型加深时,我们会有大量的“ :math:`y` ”,占据了大量的内存。
-Forward Recomputation Backpropagation(FRB)的思想是将深度学习网络切分为k个部分(segments)。对每个segment而言:前向计算时,除了小部分必须存储在内存中的Variable外(我们后续会讨论这些特殊Variable),其他中间结果都将被删除;在反向计算中,首先重新计算一遍前向算子,以获得中间结果,再运行反向算子。简而言之,FRB和普通的网络迭代相比,多计算了一遍前向算子。
+Forward Recomputation Backpropagation(FRB)的思想是将深度学习网络切分为 k 个部分(segments)。对每个 segment 而言:前向计算时,除了小部分必须存储在内存中的 Variable 外(我们后续会讨论这些特殊 Variable),其他中间结果都将被删除;在反向计算中,首先重新计算一遍前向算子,以获得中间结果,再运行反向算子。简而言之,FRB 和普通的网络迭代相比,多计算了一遍前向算子。
-我们把切分网络的变量叫做checkpoints。
-那么问题来了,如何选择checkpoints呢?自从FRB方法提出以来 \ :sup:`[1], [2]`,大量学者在研究这一关键问题。
-我们知道深度学习网络通常是由一个个模块串联得到的,比如ResNet-50由16个block串联而成,
-Bert-Large由24个transformer串联而成,以两个子模块中间的变量作为切分点就是一个很好的选择。
-对于非串联的网络(比如含有大量shortcut结构的网络),FRB也支持对其做切分,
-只是可能多耗费一点内存(用于存储shortcut的Variable)。
+我们把切分网络的变量叫做 checkpoints。
+那么问题来了,如何选择 checkpoints 呢?自从 FRB 方法提出以来 \ :sup:`[1], [2]`,大量学者在研究这一关键问题。
+我们知道深度学习网络通常是由一个个模块串联得到的,比如 ResNet-50 由 16 个 block 串联而成,
+Bert-Large 由 24 个 transformer 串联而成,以两个子模块中间的变量作为切分点就是一个很好的选择。
+对于非串联的网络(比如含有大量 shortcut 结构的网络),FRB 也支持对其做切分,
+只是可能多耗费一点内存(用于存储 shortcut 的 Variable)。
Mitsuru Kusumoto \ :sup:`[3]` 等提出了一种基于动态规划的算法,
-可以根据指定的内存自动搜索合适的checkpoints,支持各种各样的网络结构。
+可以根据指定的内存自动搜索合适的 checkpoints,支持各种各样的网络结构。
-下图是由4个fc Layer、3个relu Layer、1个sigmoid Layer和1个log-loss Layer串联而成的一个网络:最左侧为其前向计算流程、中间是普通的前向计算和反向计算流程、最右侧为添加FRB后的前向计算和反向计算流程。其中方框代表算子(Operator),红点代表前向计算的中间结果、蓝点代表checkpoints。
+下图是由 4 个 fc Layer、3 个 relu Layer、1 个 sigmoid Layer 和 1 个 log-loss Layer 串联而成的一个网络:最左侧为其前向计算流程、中间是普通的前向计算和反向计算流程、最右侧为添加 FRB 后的前向计算和反向计算流程。其中方框代表算子(Operator),红点代表前向计算的中间结果、蓝点代表 checkpoints。
.. image:: images/recompute.png
注:该例子完整代码位于 `source `_
-添加FRB后,前向计算中需要存储的中间Variable从4个(红点)变为2个(蓝点),
+添加 FRB 后,前向计算中需要存储的中间 Variable 从 4 个(红点)变为 2 个(蓝点),
从而节省了这部分内存。当然了,重计算的部分也产生了新的中间变量,
这就需要根据实际情况来做权衡了。这个例子里的网络比较浅,通常来讲,
-对层数较深的网络,FRB节省的内存要远多于新增加的内存。
+对层数较深的网络,FRB 节省的内存要远多于新增加的内存。
使用方法
---------
-我们实现了基于Paddle的FRB算法,叫做RecomputeOptimizer,
+我们实现了基于 Paddle 的 FRB 算法,叫做 RecomputeOptimizer,
您可以根据其 `源码 `_
与
`文档 `_
-更深入地了解这一算法。我们为用户提供了两个使用RecomputeOptimizer的方法:
-直接调用与Fleet API中使用。在单机单卡或者CPU训练中建议您直接调用RecomputeOptimizer,
-在多卡训练或者多机训练任务上建议您在Fleet API中使用Recompute。
+更深入地了解这一算法。我们为用户提供了两个使用 RecomputeOptimizer 的方法:
+直接调用与 Fleet API 中使用。在单机单卡或者 CPU 训练中建议您直接调用 RecomputeOptimizer,
+在多卡训练或者多机训练任务上建议您在 Fleet API 中使用 Recompute。
**1. 直接调用**
-
-直接调用RecomputeOptimizer非常简单,首先要定义一个经典的Optimizer,比如Adam;
-然后在外面包一层RecomputeOptimizer;最后设置checkpoints即可。
-
+
+直接调用 RecomputeOptimizer 非常简单,首先要定义一个经典的 Optimizer,比如 Adam;
+然后在外面包一层 RecomputeOptimizer;最后设置 checkpoints 即可。
+
.. code-block:: python
import paddle.fluid as fluid
@@ -89,25 +89,25 @@ Mitsuru Kusumoto \ :sup:`[3]` 等提出了一种基于动态规划的算法,
input_x = fluid.layers.data(name="x", shape=[32], dtype='float32')
input_y = fluid.layers.data(name="y", shape=[1], dtype='int64')
cost, fc_1, pred = mlp(input_x, input_y)
- # 定义RecomputeOptimizer
+ # 定义 RecomputeOptimizer
sgd = fluid.optimizer.Adam(learning_rate=0.01)
sgd = fluid.optimizer.RecomputeOptimizer(sgd)
- # 设置checkpoints
+ # 设置 checkpoints
sgd._set_checkpoints([fc_1, pred])
# 运行优化算法
sgd.minimize(cost)
-Recompute原则上适用于所有Optimizer。
+Recompute 原则上适用于所有 Optimizer。
-**2. 在Fleet API中使用Recompute**
+**2. 在 Fleet API 中使用 Recompute**
-`Fleet API `_
-是基于Fluid的分布式计算高层API。在Fleet API中添加RecomputeOptimizer
-仅需要2步:
+`Fleet API `_
+是基于 Fluid 的分布式计算高层 API。在 Fleet API 中添加 RecomputeOptimizer
+仅需要 2 步:
-- 设置dist_strategy.forward_recompute为True;
+- 设置 dist_strategy.forward_recompute 为 True;
-- 设置dist_strategy.recompute_checkpoints。
+- 设置 dist_strategy.recompute_checkpoints。
.. code-block:: python
@@ -118,43 +118,43 @@ Recompute原则上适用于所有Optimizer。
optimizer = fleet.distributed_optimizer(optimizer, strategy=dist_strategy)
optimizer.minimize(loss)
-为了帮助您快速地用Fleet API使用Recompute任务,我们提供了一些例子,
+为了帮助您快速地用 Fleet API 使用 Recompute 任务,我们提供了一些例子,
并且给出了这些例子的计算速度、效果和显存节省情况:
-- 用Recompute做Bert Fine-tuning: `source `_
+- 用 Recompute 做 Bert Fine-tuning: `source `_
-- 用Recompute做目标检测:开发中.
+- 用 Recompute 做目标检测:开发中.
Q&A
-------
-- **是否支持带有随机性的Op?**
+- **是否支持带有随机性的 Op?**
- 目前Paddle中带随机性的Op有:dropout,Recompute支持
+ 目前 Paddle 中带随机性的 Op 有:dropout,Recompute 支持
dropout Operator,可以保证重计算与初次计算结果保持一致。
-- **有没有更多Recompute的官方例子?**
+- **有没有更多 Recompute 的官方例子?**
- 更多Recompute的例子将更新在 `examples `_
+ 更多 Recompute 的例子将更新在 `examples `_
和 `Fleet `_ 库下,欢迎关注。
-
-- **有没有添加checkpoints的建议?**
- 我们建议将子网络连接部分的变量添加为checkpoints,即:
- 如果一个变量能将网络完全分为前后两部分,那么建议将其加入checkpoints。
- checkpoints的数目会影响内存的消耗:如果checkpoints很少,
- 那么Recompute起的作用有限;如果checkpoints数量过多,
- 那么checkpoints本身占用的内存量就较大,内存消耗可能不降反升。
+- **有没有添加 checkpoints 的建议?**
+
+ 我们建议将子网络连接部分的变量添加为 checkpoints,即:
+ 如果一个变量能将网络完全分为前后两部分,那么建议将其加入 checkpoints。
+ checkpoints 的数目会影响内存的消耗:如果 checkpoints 很少,
+ 那么 Recompute 起的作用有限;如果 checkpoints 数量过多,
+ 那么 checkpoints 本身占用的内存量就较大,内存消耗可能不降反升。
我们后续会添加一个估算内存用量的工具,
- 可以对每个Operator运算前后的显存用量做可视化,
+ 可以对每个 Operator 运算前后的显存用量做可视化,
帮助用户定位问题。
[1] Tianqi Chen, Bing Xu, Chiyuan Zhang, and Carlos Guestrin . Training deep nets with sublinear memory cost.
-arXiv preprint, arXiv:1604.06174, 2016.
+arXiv preprint, arXiv:1604.06174, 2016.
[2] Audrunas Gruslys , Rémi Munos , Ivo Danihelka , Marc Lanctot , and Alex Graves. Memory efficient
backpropagation through time. In Advances in Neural Information Processing Systems (NIPS), pages 4125 4133,
2016.
-[3] Kusumoto, Mitsuru, et al. "A Graph Theoretic Framework of Recomputation Algorithms for Memory-Efficient Backpropagation." arXiv preprint arXiv:1905.11722 (2019).
+[3] Kusumoto, Mitsuru, et al. "A Graph Theoretic Framework of Recomputation Algorithms for Memory-Efficient Backpropagation." arXiv preprint arXiv:1905.11722 (2019).
diff --git a/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute_en.rst b/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute_en.rst
index b1431756f44..c20b390e010 100644
--- a/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute_en.rst
+++ b/docs/advanced_guide/performance_improving/multinode_training_improving/gpu_training_with_recompute_en.rst
@@ -10,7 +10,7 @@ and the number of outputs increases linearly with
the increase of the number of model layers,
which becomes a challenge of the memory size
for common devices.
-
+
Theory
---------
@@ -19,11 +19,11 @@ As we know, a training process of a deep-learning network contains 3 steps:
- **Forward Propagation**:Running forward operators and generate temporary variables as output
- **Backward Propagation**:Running backward operators to compute gradients of parameters
-- **Optimization**:Applying optimization algorithm to update parameters
+- **Optimization**:Applying optimization algorithm to update parameters
When the model becomes deeper, the number of temporary variables
generated in the forward propagation process can reach tens
-of thousands, occupying a large amount of memory.
+of thousands, occupying a large amount of memory.
The `Garbage Collection mechanism `_
in Paddle can delete useless variables for the sake of saving memory.
However, some variables serve as inputs of backward operators,
@@ -41,17 +41,17 @@ the forward propagation works as follows:
where :math:`x, y, z` are vectors, :math:`W_1, W_2` are matrix。It is easy to conduct that the gradient of :math:`W_2` is:
.. math::
- W_{2}^{'} = z^{'} / y
+ W_{2}^{'} = z^{'} / y
-We can see that :math:`y` is used in the backward propagation process,
+We can see that :math:`y` is used in the backward propagation process,
thus it must be kept in the memory during the whole forward propagation.
When network grows deeper, more 'y's need to be stored,
adding more requirements to the memory.
Forward Recomputation Backpropagation(FRB) splits a deep network to k segments.
-For each segment, in forward propagation,
-most of the temporary variables are erased in time,
-except for some special variables (we will talk about that later);
+For each segment, in forward propagation,
+most of the temporary variables are erased in time,
+except for some special variables (we will talk about that later);
in backward propagation, the forward operators will be recomputed
to get these temporary variables before running backward operators.
In short, FBR runs forward operators twice.
@@ -59,13 +59,13 @@ In short, FBR runs forward operators twice.
But how to split the network? A deep learning network usually consists
of connecting modules in series:
ResNet-50 contains 16 blocks and Bert-Large contains 24 transformers.
-It is a good choice to treat such modules as segments.
+It is a good choice to treat such modules as segments.
The variables among segments are
called as checkpoints.
-The following picture is a network with 4 fc layers, 3 relu layers,
+The following picture is a network with 4 fc layers, 3 relu layers,
1 sigmoid layer and 1 log-loss layer in series.
-The left column is the forward propagation,
+The left column is the forward propagation,
the middle column is the normal backward propagation,
and the right column is the FRB.
Rectangular boxes represent the operators, red dots represent
@@ -132,10 +132,10 @@ In principle, recompute is for all kinds of optimizers in Paddle.
**2. Using Recompute in Fleet API**
-`Fleet API `_
+`Fleet API `_
is a high-level API for distributed training in Fluid. Adding
RecomputeOptimizer to Fluid takes two steps:
-
+
- set dist_strategy.forward_recompute to True
- set dist_strategy.recompute_checkpoints
@@ -176,7 +176,7 @@ raise issues if you get any problem with these examples.
- **How should I set checkpoints?**
-The position of checkpoints is important:
+The position of checkpoints is important:
we suggest setting the variable between the sub-model as checkpoints,
that is, set a variable as a checkpoint if it
can separate the network into two parts without short-cut connections.
diff --git a/docs/api/index_cn.rst b/docs/api/index_cn.rst
index d72492835c6..2d2a7a796b4 100644
--- a/docs/api/index_cn.rst
+++ b/docs/api/index_cn.rst
@@ -4,76 +4,76 @@ API 文档
欢迎使用飞桨框架(PaddlePaddle), PaddlePaddle 是一个易用、高效、灵活、可扩展的深度学习框架,致力于让深度学习技术的创新与应用更简单。
-在本版本中,飞桨框架对API做了许多优化,您可以参考下表来了解飞桨框架最新版的API目录结构与说明。更详细的说明,请参见 `版本说明 <../release_note_cn.html>`_ 。此外,您可参考PaddlePaddle的 `GitHub `_ 了解详情。
+在本版本中,飞桨框架对 API 做了许多优化,您可以参考下表来了解飞桨框架最新版的 API 目录结构与说明。更详细的说明,请参见 `版本说明 <../release_note_cn.html>`_ 。此外,您可参考 PaddlePaddle 的 `GitHub `_ 了解详情。
-**注: paddle.fluid.\*, paddle.dataset.\* 会在未来的版本中废弃,请您尽量不要使用这两个目录下的API。**
+**注: paddle.fluid.\*, paddle.dataset.\* 会在未来的版本中废弃,请您尽量不要使用这两个目录下的 API。**
+-------------------------------+-------------------------------------------------------+
-| 目录 | 功能和包含的API |
+| 目录 | 功能和包含的 API |
+===============================+=======================================================+
| paddle.\* | paddle |
-| | 根目录下保留了常用API的别名,包括:paddle.tensor, |
-| | paddle.framework, paddle.device 目录下的所有API |
+| | 根目录下保留了常用 API 的别名,包括:paddle.tensor, |
+| | paddle.framework, paddle.device 目录下的所有 API |
+-------------------------------+-------------------------------------------------------+
-| paddle.tensor | Tensor操作相关的API,包括 创建zeros, |
-| | 矩阵运算matmul, 变换concat, 计算add, 查找argmax等 |
+| paddle.tensor | Tensor 操作相关的 API,包括 创建 zeros, |
+| | 矩阵运算 matmul, 变换 concat, 计算 add, 查找 argmax 等 |
+-------------------------------+-------------------------------------------------------+
-| paddle.framework | 框架通用API和动态图模式的API,包括 no_grad 、 |
+| paddle.framework | 框架通用 API 和动态图模式的 API,包括 no_grad 、 |
| | save 、 load 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.device | 设备管理相关API,包括 set_device, get_device 等。 |
+| paddle.device | 设备管理相关 API,包括 set_device, get_device 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.linalg | 线性代数相关API,包括 det, svd 等。 |
+| paddle.linalg | 线性代数相关 API,包括 det, svd 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.fft | 快速傅里叶变换的相关API,包括 fft, fft2 等。 |
+| paddle.fft | 快速傅里叶变换的相关 API,包括 fft, fft2 等。 |
+-------------------------------+-------------------------------------------------------+
| paddle.amp | 自动混合精度策略,包括 auto_cast 、 |
| | GradScaler 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.autograd | 自动求导相关API,包括 backward、PyLayer 等。 |
+| paddle.autograd | 自动求导相关 API,包括 backward、PyLayer 等。 |
+-------------------------------+-------------------------------------------------------+
| paddle.callbacks | 日志回调类,包括 ModelCheckpoint 、 |
| | ProgBarLogger 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.distributed | 分布式相关基础API。 |
+| paddle.distributed | 分布式相关基础 API。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.distributed.fleet | 分布式相关高层API。 |
+| paddle.distributed.fleet | 分布式相关高层 API。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.hub | 模型拓展相关的API,包括 list、load、help 等。 |
+| paddle.hub | 模型拓展相关的 API,包括 list、load、help 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.io | 数据输入输出相关API,包括 Dataset, DataLoader 等。 |
+| paddle.io | 数据输入输出相关 API,包括 Dataset, DataLoader 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.jit | 动态图转静态图相关API,包括 to_static、 |
+| paddle.jit | 动态图转静态图相关 API,包括 to_static、 |
| | ProgramTranslator、TracedLayer 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.metric | 评估指标计算相关的API,包括 Accuracy, Auc等。 |
+| paddle.metric | 评估指标计算相关的 API,包括 Accuracy, Auc 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.nn | 组网相关的API,包括 Linear 、卷积 Conv2D 、 |
+| paddle.nn | 组网相关的 API,包括 Linear 、卷积 Conv2D 、 |
| | 循环神经网络 RNN 、损失函数 CrossEntropyLoss 、 |
| | 激活函数 ReLU 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.onnx | paddle转换为onnx协议相关API,包括 export 等。 |
+| paddle.onnx | paddle 转换为 onnx 协议相关 API,包括 export 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.optimizer | 优化算法相关API,包括 SGD,Adagrad, Adam 等。 |
+| paddle.optimizer | 优化算法相关 API,包括 SGD,Adagrad, Adam 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.optimizer.lr | 学习率衰减相关API,包括 NoamDecay 、 StepDecay 、 |
+| paddle.optimizer.lr | 学习率衰减相关 API,包括 NoamDecay 、 StepDecay 、 |
| | PiecewiseDecay 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.regularizer | 正则化相关API,包括 L1Decay、L2Decay 等。 |
+| paddle.regularizer | 正则化相关 API,包括 L1Decay、L2Decay 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.static | 静态图下基础框架相关API,包括 Variable, Program, |
-| | Executor等 |
+| paddle.static | 静态图下基础框架相关 API,包括 Variable, Program, |
+| | Executor 等 |
+-------------------------------+-------------------------------------------------------+
-| paddle.static.nn | 静态图下组网专用API,包括 全连接层 fc 、控制流 |
+| paddle.static.nn | 静态图下组网专用 API,包括 全连接层 fc 、控制流 |
| | while_loop/cond 。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.text | NLP领域API,包括NLP领域相关的数据集, |
+| paddle.text | NLP 领域 API,包括 NLP 领域相关的数据集, |
| | 如 Imdb 、 Movielens 。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.utils | 工具类相关API,包括 CppExtension、CUDAExtension 等。 |
+| paddle.utils | 工具类相关 API,包括 CppExtension、CUDAExtension 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.vision | 视觉领域API,包括 数据集 Cifar10 、数据处理 |
+| paddle.vision | 视觉领域 API,包括 数据集 Cifar10 、数据处理 |
| | ColorJitter、常用基础网络结构 ResNet 等。 |
+-------------------------------+-------------------------------------------------------+
-| paddle.sparse | 稀疏领域的API。 |
+| paddle.sparse | 稀疏领域的 API。 |
+-------------------------------+-------------------------------------------------------+
diff --git a/docs/api/index_en.rst b/docs/api/index_en.rst
index fb0d778cce5..730ab8d4613 100644
--- a/docs/api/index_en.rst
+++ b/docs/api/index_en.rst
@@ -26,12 +26,12 @@ In this version, PaddlePaddle has made many optimizations to the APIs. You can r
| paddle.device | Device management related APIs, such as set_device, |
| | get_device, etc. |
+-------------------------------+-------------------------------------------------------+
-| paddle.linalg | Linear algebra related APIs, such as det, svd, etc. |
+| paddle.linalg | Linear algebra related APIs, such as det, svd, etc. |
+-------------------------------+-------------------------------------------------------+
| paddle.fft | Fast Fourier Transform related APIs, such as |
| | fft, fft2, etc. |
+-------------------------------+-------------------------------------------------------+
-| paddle.amp | Paddle automatic mixed precision strategy, including |
+| paddle.amp | Paddle automatic mixed precision strategy, including |
| | auto_cast, GradScaler, etc. |
+-------------------------------+-------------------------------------------------------+
| paddle.autograd | Auto grad API, including backward, PyLayer, etc. |
@@ -63,12 +63,12 @@ In this version, PaddlePaddle has made many optimizations to the APIs. You can r
| paddld.optimizer | APIs related to optimization algorithms such as SGD, |
| | Adagrad, and Adam |
+-------------------------------+-------------------------------------------------------+
-| paddle.optimizer.lr | APIs related to learning rate decay, such as |
+| paddle.optimizer.lr | APIs related to learning rate decay, such as |
| | NoamDecay, StepDecay, PiecewiseDecay, etc. |
+-------------------------------+-------------------------------------------------------+
| paddle.regularizer | Regularization APIs, including L1Decay, L2Decay, etc. |
+-------------------------------+-------------------------------------------------------+
-| paddle.static | Basic framework related APIs under static graph, |
+| paddle.static | Basic framework related APIs under static graph, |
| | such as Variable, Program, Executor, etc. |
+-------------------------------+-------------------------------------------------------+
| paddle.static.nn | Special APIs for networking under static graph such |
@@ -86,4 +86,3 @@ In this version, PaddlePaddle has made many optimizations to the APIs. You can r
+-------------------------------+-------------------------------------------------------+
| paddle.sparse | The Sparse domain API. |
+-------------------------------+-------------------------------------------------------+
-
diff --git a/docs/api/paddle/CUDAPlace_cn.rst b/docs/api/paddle/CUDAPlace_cn.rst
index db3a51d3929..077a4f1a24d 100644
--- a/docs/api/paddle/CUDAPlace_cn.rst
+++ b/docs/api/paddle/CUDAPlace_cn.rst
@@ -10,7 +10,7 @@ CUDAPlace
``CUDAPlace`` 是一个设备描述符,表示一个分配或将要分配 ``Tensor`` 或 ``LoDTensor`` 的 GPU 设备。
-每个 ``CUDAPlace`` 有一个 ``dev_id`` (设备id)来表明当前的 ``CUDAPlace`` 所代表的显卡编号,编号从 0 开始。
+每个 ``CUDAPlace`` 有一个 ``dev_id`` (设备 id)来表明当前的 ``CUDAPlace`` 所代表的显卡编号,编号从 0 开始。
``dev_id`` 不同的 ``CUDAPlace`` 所对应的内存不可相互访问。
这里编号指的是可见显卡的逻辑编号,而不是显卡实际的编号。
可以通过 ``CUDA_VISIBLE_DEVICES`` 环境变量限制程序能够使用的 GPU 设备,程序启动时会遍历当前的可见设备,并从 0 开始为这些设备编号。
@@ -19,7 +19,7 @@ CUDAPlace
参数
::::::::::::
- - **id** (int,可选) - GPU的设备ID。如果为 ``None``,则默认会使用 id 为 0 的设备。默认值为 ``None``。
+ - **id** (int,可选) - GPU 的设备 ID。如果为 ``None``,则默认会使用 id 为 0 的设备。默认值为 ``None``。
代码示例
::::::::::::
diff --git a/docs/api/paddle/DataParallel_cn.rst b/docs/api/paddle/DataParallel_cn.rst
index 1947069d4fa..d34cda1777d 100644
--- a/docs/api/paddle/DataParallel_cn.rst
+++ b/docs/api/paddle/DataParallel_cn.rst
@@ -26,11 +26,11 @@ DataParallel
::::::::::::
- **Layer** (Layer) - 需要通过数据并行方式执行的模型。
- - **strategy** (ParallelStrategy,可选) - (deprecated) 数据并行的策略,包括并行执行的环境配置。默认为None。
- - **comm_buffer_size** (int,可选) - 它是通信调用(如NCCLAllReduce)时,参数梯度聚合为一组的内存大小(MB)。默认值:25。
- - **last_comm_buffer_size** (float,可选)它限制通信调用中最后一个缓冲区的内存大小(MB)。减小最后一个通信缓冲区的大小有助于提高性能。默认值:1。默认值:1
- - **find_unused_parameters** (bool,可选) 是否在模型forward函数的返回值的所有张量中,遍历整个向后图。对于不包括在loss计算中的参数,其梯度将被预先标记为ready状态用于后续多卡间的规约操作。请注意,模型参数的所有正向输出必须参与loss的计算以及后续的梯度计算。否则,将发生严重错误。请注意,将find_unused_parameters设置为True会影响计算性能,因此,如果确定所有参数都参与了loss计算和自动反向图的构建,请将其设置为False。默认值:False。
-
+ - **strategy** (ParallelStrategy,可选) - (deprecated) 数据并行的策略,包括并行执行的环境配置。默认为 None。
+ - **comm_buffer_size** (int,可选) - 它是通信调用(如 NCCLAllReduce)时,参数梯度聚合为一组的内存大小(MB)。默认值:25。
+ - **last_comm_buffer_size** (float,可选)它限制通信调用中最后一个缓冲区的内存大小(MB)。减小最后一个通信缓冲区的大小有助于提高性能。默认值:1。默认值:1
+ - **find_unused_parameters** (bool,可选) 是否在模型 forward 函数的返回值的所有张量中,遍历整个向后图。对于不包括在 loss 计算中的参数,其梯度将被预先标记为 ready 状态用于后续多卡间的规约操作。请注意,模型参数的所有正向输出必须参与 loss 的计算以及后续的梯度计算。否则,将发生严重错误。请注意,将 find_unused_parameters 设置为 True 会影响计算性能,因此,如果确定所有参数都参与了 loss 计算和自动反向图的构建,请将其设置为 False。默认值:False。
+
返回
::::::::::::
支持数据并行的 ``Layer``。
@@ -40,7 +40,7 @@ DataParallel
COPY-FROM: paddle.DataParallel:dp-example
.. Note::
- 目前数据并行不支持PyLayer自定义算子。如有此类需求,推荐先使用no_sync接口暂停多卡通信,然后在优化器前手动实现梯度同步;具体实现过程可参考下述示例。
+ 目前数据并行不支持 PyLayer 自定义算子。如有此类需求,推荐先使用 no_sync 接口暂停多卡通信,然后在优化器前手动实现梯度同步;具体实现过程可参考下述示例。
代码示例
::::::::::::
@@ -48,7 +48,7 @@ COPY-FROM: paddle.DataParallel:dp-pylayer-example
.. py:function:: no_sync()
-用于暂停梯度同步的上下文管理器。在no_sync()中参数梯度只会在模型上累加;直到with之外的第一个forward-backward,梯度才会被同步。
+用于暂停梯度同步的上下文管理器。在 no_sync()中参数梯度只会在模型上累加;直到 with 之外的第一个 forward-backward,梯度才会被同步。
代码示例
::::::::::::
@@ -60,15 +60,15 @@ COPY-FROM: paddle.DataParallel.no_sync
state_dict(destination=None, include_sublayers=True)
'''''''''
-获取当前层及其子层的所有parameters和持久的buffers。并将所有parameters和buffers存放在dict结构中。
+获取当前层及其子层的所有 parameters 和持久的 buffers。并将所有 parameters 和 buffers 存放在 dict 结构中。
**参数**
- - **destination** (dict,可选) - 如果提供 ``destination``,则所有参数和持久的buffers都将存放在 ``destination`` 中。默认值:None。
- - **include_sublayers** (bool,可选) - 如果设置为True,则包括子层的参数和buffers。默认值:True。
+ - **destination** (dict,可选) - 如果提供 ``destination``,则所有参数和持久的 buffers 都将存放在 ``destination`` 中。默认值:None。
+ - **include_sublayers** (bool,可选) - 如果设置为 True,则包括子层的参数和 buffers。默认值:True。
**返回**
-dict,包含所有parameters和持久的buffers的dict。
+dict,包含所有 parameters 和持久的 buffers 的 dict。
**代码示例**
@@ -78,12 +78,12 @@ COPY-FROM: paddle.DataParallel.state_dict
set_state_dict(state_dict, use_structured_name=True)
'''''''''
-根据传入的 ``state_dict`` 设置parameters和持久的buffers。所有parameters和buffers将由 ``state_dict`` 中的 ``Tensor`` 设置。
+根据传入的 ``state_dict`` 设置 parameters 和持久的 buffers。所有 parameters 和 buffers 将由 ``state_dict`` 中的 ``Tensor`` 设置。
**参数**
- - **state_dict** (dict) - 包含所有parameters和可持久性buffers的dict。
- - **use_structured_name** (bool,可选) - 如果设置为True,将使用Layer的结构性变量名作为dict的key,否则将使用Parameter或者Buffer的变量名作为key。默认值:True。
+ - **state_dict** (dict) - 包含所有 parameters 和可持久性 buffers 的 dict。
+ - **use_structured_name** (bool,可选) - 如果设置为 True,将使用 Layer 的结构性变量名作为 dict 的 key,否则将使用 Parameter 或者 Buffer 的变量名作为 key。默认值:True。
**返回**
diff --git a/docs/api/paddle/Model_cn.rst b/docs/api/paddle/Model_cn.rst
index 71cab82b277..ce3ae79c04e 100644
--- a/docs/api/paddle/Model_cn.rst
+++ b/docs/api/paddle/Model_cn.rst
@@ -7,7 +7,7 @@ Model
``Model`` 对象是一个具备训练、测试、推理的神经网络。该对象同时支持静态图和动态图模式,飞桨框架默认为动态图模式,通过 ``paddle.enable_static()`` 来切换到静态图模式。需要注意的是,需要在实例化 ``Model`` 对象之前完成切换。
-在 GPU 上训练时,高层 API 支持自动混合精度(AMP)训练,并且在静态图下使用 Adam、AdamW、Momentum 优化器时还支持纯 float16 的训练。在使用纯 float16 训练之前,优化器初始化时 ``multi_precision`` 参数可以设置为 True,这样可以避免性能变差或是收敛变慢的问题。并且,在组网中可以使用 ``paddle.static.amp.fp16_guard`` 来限定使用纯float16训练的范围,否则需要把 ``use_fp16_guard`` 手动设置为False以开启全局纯 float16 训练。使用纯 float16 训练前,可能需要手动将 dtype 为 float32 的输入转成 float16 的输入。然而,使用自动混合精度训练(AMP)时,不支持限定混合精度训练的范围。
+在 GPU 上训练时,高层 API 支持自动混合精度(AMP)训练,并且在静态图下使用 Adam、AdamW、Momentum 优化器时还支持纯 float16 的训练。在使用纯 float16 训练之前,优化器初始化时 ``multi_precision`` 参数可以设置为 True,这样可以避免性能变差或是收敛变慢的问题。并且,在组网中可以使用 ``paddle.static.amp.fp16_guard`` 来限定使用纯 float16 训练的范围,否则需要把 ``use_fp16_guard`` 手动设置为 False 以开启全局纯 float16 训练。使用纯 float16 训练前,可能需要手动将 dtype 为 float32 的输入转成 float16 的输入。然而,使用自动混合精度训练(AMP)时,不支持限定混合精度训练的范围。
参数
:::::::::
@@ -15,7 +15,7 @@ Model
- **network** (paddle.nn.Layer) - 是 ``paddle.nn.Layer`` 的一个实例。
- **inputs** (InputSpec|list|tuple|dict|None,可选) - ``network`` 的输入,可以是 ``InputSpec`` 的实例,或者是一个 ``InputSpec`` 的 ``list``,或者是格式为 ``{name: InputSpec}`` 的 ``dict``,或者为 ``None``。默认值为 ``None``。
- **labels** (InputSpec|list|tuple|None,可选) - ``network`` 的标签,可以是 ``InputSpec`` 的实例,或者是一个 ``InputSpec`` 的 ``list``,或者为 ``None``。 默认值为 ``None``。
-
+
.. note::
在动态图中,``inputs`` 和 ``labels`` 都可以设置为 ``None``。但是,在静态图中,``input`` 不能设置为 ``None``。而如果损失函数需要标签(label)作为输入,则必须设置 ``labels``,否则,可以为 ``None``。
@@ -69,7 +69,7 @@ eval_batch(inputs, labels=None)
- **inputs** (numpy.ndarray|Tensor|list) - 一批次的输入数据。它可以是一个 numpy 数组或 paddle.Tensor,或者是它们的列表(在模型具有多输入的情况下)。
- **labels** (numpy.ndarray|Tensor|list,可选) - 一批次的标签。它可以是一个 numpy 数组或 paddle.Tensor,或者是它们的列表(在模型具有多输入的情况下)。如果无标签,请设置为 None。默认值:None。
-
+
**返回**
list,如果没有定义评估函数,则返回包含了预测损失函数的值的列表;如果定义了评估函数,则返回一个元组(损失函数的列表,评估指标的列表)。
@@ -89,7 +89,7 @@ predict_batch(inputs)
- **inputs** (numpy.ndarray|Tensor|list) - 一批次的输入数据。它可以是一个 numpy 数组或 paddle.Tensor,或者是它们的列表(在模型具有多输入的情况下)。
-
+
**返回**
一个列表,包含了模型的输出。
@@ -110,7 +110,7 @@ save(path, training=True)
- **path** (str) - 保存的文件名前缀。格式如 ``dirname/file_prefix`` 或者 ``file_prefix`` 。
- **training** (bool,可选) - 是否保存训练的状态,包括模型参数和优化器参数等。如果为 False,则只保存推理所需的参数与文件。默认值:True。
-
+
**返回**
无。
@@ -131,7 +131,7 @@ load(path, skip_mismatch=False, reset_optimizer=False)
- **path** (str) - 保存参数或优化器信息的文件前缀。格式如 ``path.pdparams`` 或者 ``path.pdopt`` ,后者是非必要的,如果不想恢复优化器信息。
- **skip_mismatch** (bool,可选) - 是否需要跳过保存的模型文件中形状或名称不匹配的参数,设置为 ``False`` 时,当遇到不匹配的参数会抛出一个错误。默认值:False。
- **reset_optimizer** (bool,可选) - 设置为 ``True`` 时,会忽略提供的优化器信息文件。否则会载入提供的优化器信息。默认值:False。
-
+
**返回**
无。
@@ -145,7 +145,7 @@ parameters(*args, **kwargs)
'''''''''
返回一个包含模型所有参数的列表。
-
+
**返回**
在静态图中返回一个包含 ``Parameter`` 的列表,在动态图中返回一个包含 ``ParamBase`` 的列表。
@@ -165,7 +165,7 @@ prepare(optimizer=None, loss=None, metrics=None, amp_configs=None)
- **optimizer** (OOptimizer|None,可选) - 当训练模型的,该参数必须被设定。当评估或测试的时候,该参数可以不设定。默认值:None。
- **loss** (Loss|Callable|None,可选) - 当训练模型的,该参数必须被设定。默认值:None。
- **metrics** (Metric|list[Metric]|None,可选) - 当该参数被设定时,所有给定的评估方法会在训练和测试时被运行,并返回对应的指标。默认值:None。
- - **amp_configs** (str|dict|None,可选) - 混合精度训练的配置,通常是个 dict,也可以是 str。当使用自动混合精度训练或者纯 float16 训练时,``amp_configs`` 的 key ``level`` 需要被设置为 O1 或者 O2,float32 训练时则默认为 O0。除了 ``level`` ,还可以传入更多的和混合精度API一致的参数,例如:``init_loss_scaling``、 ``incr_ratio`` 、 ``decr_ratio``、 ``incr_every_n_steps``、 ``decr_every_n_nan_or_inf``、 ``use_dynamic_loss_scaling``、 ``custom_white_list``、 ``custom_black_list`` ,在静态图下还支持传入 ``custom_black_varnames`` 和 ``use_fp16_guard`` 。详细使用方法可以参考参考混合精度 API 的文档 :ref:`auto_cast ` 和 :ref:`GradScaler ` 。为了方便起见,当不设置其他的配置参数时,也可以直接传入 ``'O1'`` 、``'O2'`` 。在使用 float32 训练时,该参数可以为 None。默认值:None。
+ - **amp_configs** (str|dict|None,可选) - 混合精度训练的配置,通常是个 dict,也可以是 str。当使用自动混合精度训练或者纯 float16 训练时,``amp_configs`` 的 key ``level`` 需要被设置为 O1 或者 O2,float32 训练时则默认为 O0。除了 ``level`` ,还可以传入更多的和混合精度 API 一致的参数,例如:``init_loss_scaling``、 ``incr_ratio`` 、 ``decr_ratio``、 ``incr_every_n_steps``、 ``decr_every_n_nan_or_inf``、 ``use_dynamic_loss_scaling``、 ``custom_white_list``、 ``custom_black_list`` ,在静态图下还支持传入 ``custom_black_varnames`` 和 ``use_fp16_guard`` 。详细使用方法可以参考参考混合精度 API 的文档 :ref:`auto_cast ` 和 :ref:`GradScaler ` 。为了方便起见,当不设置其他的配置参数时,也可以直接传入 ``'O1'`` 、``'O2'`` 。在使用 float32 训练时,该参数可以为 None。默认值:None。
fit(train_data=None, eval_data=None, batch_size=1, epochs=1, eval_freq=1, log_freq=10, save_dir=None, save_freq=1, verbose=2, drop_last=False, shuffle=True, num_workers=0, callbacks=None, accumulate_grad_batches=1, num_iters=None)
@@ -225,7 +225,7 @@ evaluate(eval_data, batch_size=1, log_freq=10, verbose=2, num_workers=0, callbac
**返回**
-dict, key是 ``prepare`` 时 Metric 的的名称,value 是该 Metric 的值。
+dict, key 是 ``prepare`` 时 Metric 的的名称,value 是该 Metric 的值。
**代码示例**
diff --git a/docs/api/paddle/NPUPlace_cn.rst b/docs/api/paddle/NPUPlace_cn.rst
index 182afc83c2e..cae5f890c8a 100644
--- a/docs/api/paddle/NPUPlace_cn.rst
+++ b/docs/api/paddle/NPUPlace_cn.rst
@@ -6,16 +6,16 @@ NPUPlace
.. py:class:: paddle.NPUPlace
``NPUPlace`` 是一个设备描述符,表示一个分配或将要分配 ``Tensor`` 或 ``LoDTensor`` 的 NPU 设备。
-每个 ``NPUPlace`` 有一个 ``dev_id`` (设备id)来表明当前的 ``NPUPlace`` 所代表的显卡编号,编号从 0 开始。
+每个 ``NPUPlace`` 有一个 ``dev_id`` (设备 id)来表明当前的 ``NPUPlace`` 所代表的显卡编号,编号从 0 开始。
``dev_id`` 不同的 ``NPUPlace`` 所对应的内存不可相互访问。
这里编号指的是显卡实际的编号,而不是显卡的逻辑编号。
参数
::::::::::::
- - **id** (int,可选) - NPU的设备ID。
+ - **id** (int,可选) - NPU 的设备 ID。
代码示例
::::::::::::
-COPY-FROM: paddle.NPUPlace
\ No newline at end of file
+COPY-FROM: paddle.NPUPlace
diff --git a/docs/api/paddle/Overview_cn.rst b/docs/api/paddle/Overview_cn.rst
index fe5dd774135..113f031234d 100755
--- a/docs/api/paddle/Overview_cn.rst
+++ b/docs/api/paddle/Overview_cn.rst
@@ -3,64 +3,64 @@
paddle
---------------------
-paddle 目录下包含tensor、device、framework相关API以及某些高层API。具体如下:
-
-- :ref:`tensor数学操作 `
-- :ref:`tensor逻辑操作 `
-- :ref:`tensor属性相关 `
-- :ref:`tensor创建相关 `
-- :ref:`tensor元素查找相关 `
-- :ref:`tensor初始化相关 `
-- :ref:`tensor random相关 `
-- :ref:`tensor线性代数相关 `
-- :ref:`tensor元素操作相关(如:转置,reshape等) `
+paddle 目录下包含 tensor、device、framework 相关 API 以及某些高层 API。具体如下:
+
+- :ref:`tensor 数学操作 `
+- :ref:`tensor 逻辑操作 `
+- :ref:`tensor 属性相关 `
+- :ref:`tensor 创建相关 `
+- :ref:`tensor 元素查找相关 `
+- :ref:`tensor 初始化相关 `
+- :ref:`tensor random 相关 `
+- :ref:`tensor 线性代数相关 `
+- :ref:`tensor 元素操作相关(如:转置,reshape 等) `
- :ref:`爱因斯坦求和 `
-- :ref:`framework相关 `
-- :ref:`device相关 `
-- :ref:`高层API相关 `
-- :ref:`稀疏API相关 `
+- :ref:`framework 相关 `
+- :ref:`device 相关 `
+- :ref:`高层 API 相关 `
+- :ref:`稀疏 API 相关 `
.. _tensor_math:
-tensor数学操作
+tensor 数学操作
::::::::::::::::::::
.. csv-table::
- :header: "API名称", "API功能"
+ :header: "API 名称", "API 功能"
:widths: 10, 30
" :ref:`paddle.abs ` ", "绝对值函数"
" :ref:`paddle.angle ` ", "相位角函数"
- " :ref:`paddle.acos ` ", "arccosine函数"
- " :ref:`paddle.add ` ", "Tensor逐元素相加"
- " :ref:`paddle.add_n ` ", "对输入的一至多个Tensor或LoDTensor求和"
- " :ref:`paddle.addmm ` ", "计算输入Tensor x和y的乘积,将结果乘以标量alpha,再加上input与beta的乘积,得到输出"
- " :ref:`paddle.all ` ", "对指定维度上的Tensor元素进行逻辑与运算"
- " :ref:`paddle.allclose ` ", "逐个检查输入Tensor x和y的所有元素是否均满足 ∣x−y∣≤atol+rtol×∣y∣"
- " :ref:`paddle.isclose ` ", "逐个检查输入Tensor x和y的所有元素是否满足 ∣x−y∣≤atol+rtol×∣y∣"
- " :ref:`paddle.any ` ", "对指定维度上的Tensor元素进行逻辑或运算"
- " :ref:`paddle.asin ` ", "arcsine函数"
- " :ref:`paddle.atan ` ", "arctangent函数"
- " :ref:`paddle.atan2 ` ", "arctangent2函数"
+ " :ref:`paddle.acos ` ", "arccosine 函数"
+ " :ref:`paddle.add ` ", "Tensor 逐元素相加"
+ " :ref:`paddle.add_n ` ", "对输入的一至多个 Tensor 或 LoDTensor 求和"
+ " :ref:`paddle.addmm ` ", "计算输入 Tensor x 和 y 的乘积,将结果乘以标量 alpha,再加上 input 与 beta 的乘积,得到输出"
+ " :ref:`paddle.all ` ", "对指定维度上的 Tensor 元素进行逻辑与运算"
+ " :ref:`paddle.allclose ` ", "逐个检查输入 Tensor x 和 y 的所有元素是否均满足 ∣x−y∣≤atol+rtol×∣y∣"
+ " :ref:`paddle.isclose ` ", "逐个检查输入 Tensor x 和 y 的所有元素是否满足 ∣x−y∣≤atol+rtol×∣y∣"
+ " :ref:`paddle.any ` ", "对指定维度上的 Tensor 元素进行逻辑或运算"
+ " :ref:`paddle.asin ` ", "arcsine 函数"
+ " :ref:`paddle.atan ` ", "arctangent 函数"
+ " :ref:`paddle.atan2 ` ", "arctangent2 函数"
" :ref:`paddle.ceil ` ", "向上取整运算函数"
" :ref:`paddle.clip ` ", "将输入的所有元素进行剪裁,使得输出元素限制在[min, max]内"
- " :ref:`paddle.conj ` ", "逐元素计算Tensor的共轭运算"
+ " :ref:`paddle.conj ` ", "逐元素计算 Tensor 的共轭运算"
" :ref:`paddle.cos ` ", "余弦函数"
" :ref:`paddle.cosh ` ", "双曲余弦函数"
" :ref:`paddle.count_nonzero ` ", "沿给定的轴 axis 统计非零元素的数量"
" :ref:`paddle.cumsum ` ", "沿给定 axis 计算张量 x 的累加和"
" :ref:`paddle.cumprod ` ", "沿给定 dim 计算张量 x 的累乘"
- " :ref:`paddle.digamma ` ", "逐元素计算输入x的digamma函数值"
+ " :ref:`paddle.digamma ` ", "逐元素计算输入 x 的 digamma 函数值"
" :ref:`paddle.divide ` ", "逐元素相除算子"
- " :ref:`paddle.equal ` ", "该OP返回 x==y 逐元素比较x和y是否相等,相同位置的元素相同则返回True,否则返回False"
- " :ref:`paddle.equal_all ` ", "如果所有相同位置的元素相同返回True,否则返回False"
- " :ref:`paddle.erf ` ", "逐元素计算 Erf 激活函数"
- " :ref:`paddle.exp ` ", "逐元素进行以自然数e为底指数运算"
- " :ref:`paddle.expm1 ` ", "逐元素进行exp(x)-1运算"
- " :ref:`paddle.floor ` ", "向下取整函数"
+ " :ref:`paddle.equal ` ", "该 OP 返回 x==y 逐元素比较 x 和 y 是否相等,相同位置的元素相同则返回 True,否则返回 False"
+ " :ref:`paddle.equal_all ` ", "如果所有相同位置的元素相同返回 True,否则返回 False"
+ " :ref:`paddle.erf ` ", "逐元素计算 Erf 激活函数"
+ " :ref:`paddle.exp ` ", "逐元素进行以自然数 e 为底指数运算"
+ " :ref:`paddle.expm1 ` ", "逐元素进行 exp(x)-1 运算"
+ " :ref:`paddle.floor ` ", "向下取整函数"
" :ref:`paddle.floor_divide ` ", "逐元素整除算子,输入 x 与输入 y 逐元素整除,并将各个位置的输出元素保存到返回结果中"
" :ref:`paddle.greater_equal ` ", "逐元素地返回 x>=y 的逻辑值"
" :ref:`paddle.greater_than ` ", "逐元素地返回 x>y 的逻辑值"
@@ -70,69 +70,69 @@ tensor数学操作
" :ref:`paddle.less_equal ` ", "逐元素地返回 x<=y 的逻辑值"
" :ref:`paddle.less_than ` ", "逐元素地返回 x` ", "计算输入 x 的 gamma 函数的自然对数并返回"
- " :ref:`paddle.log ` ", "Log激活函数(计算自然对数)"
- " :ref:`paddle.log10 ` ", "Log10激活函数(计算底为10的对数)"
- " :ref:`paddle.log2 ` ", "计算Log1p(加一的自然对数)结果"
+ " :ref:`paddle.log ` ", "Log 激活函数(计算自然对数)"
+ " :ref:`paddle.log10 ` ", "Log10 激活函数(计算底为 10 的对数)"
+ " :ref:`paddle.log2 ` ", "计算 Log1p(加一的自然对数)结果"
" :ref:`paddle.logcumsumexp ` ", "计算 x 的指数的前缀和的对数"
" :ref:`paddle.logical_and ` ", "逐元素的对 x 和 y 进行逻辑与运算"
- " :ref:`paddle.logical_not ` ", "逐元素的对 X Tensor进行逻辑非运算"
+ " :ref:`paddle.logical_not ` ", "逐元素的对 X Tensor 进行逻辑非运算"
" :ref:`paddle.logical_or ` ", "逐元素的对 X 和 Y 进行逻辑或运算"
" :ref:`paddle.logical_xor ` ", "逐元素的对 X 和 Y 进行逻辑异或运算"
- " :ref:`paddle.logit ` ", "计算logit结果"
+ " :ref:`paddle.logit ` ", "计算 logit 结果"
" :ref:`paddle.bitwise_and ` ", "逐元素的对 x 和 y 进行按位与运算"
- " :ref:`paddle.bitwise_not ` ", "逐元素的对 X Tensor进行按位取反运算"
+ " :ref:`paddle.bitwise_not ` ", "逐元素的对 X Tensor 进行按位取反运算"
" :ref:`paddle.bitwise_or ` ", "逐元素的对 X 和 Y 进行按位或运算"
" :ref:`paddle.bitwise_xor ` ", "逐元素的对 X 和 Y 进行按位异或运算"
- " :ref:`paddle.logsumexp ` ", "沿着 axis 计算 x 的以e为底的指数的和的自然对数"
- " :ref:`paddle.max ` ", "对指定维度上的Tensor元素求最大值运算"
- " :ref:`paddle.amax ` ", "对指定维度上的Tensor元素求最大值运算"
- " :ref:`paddle.maximum ` ", "逐元素对比输入的两个Tensor,并且把各个位置更大的元素保存到返回结果中"
+ " :ref:`paddle.logsumexp ` ", "沿着 axis 计算 x 的以 e 为底的指数的和的自然对数"
+ " :ref:`paddle.max ` ", "对指定维度上的 Tensor 元素求最大值运算"
+ " :ref:`paddle.amax ` ", "对指定维度上的 Tensor 元素求最大值运算"
+ " :ref:`paddle.maximum ` ", "逐元素对比输入的两个 Tensor,并且把各个位置更大的元素保存到返回结果中"
" :ref:`paddle.mean ` ", "沿 axis 计算 x 的平均值"
" :ref:`paddle.median ` ", "沿给定的轴 axis 计算 x 中元素的中位数"
- " :ref:`paddle.nanmedian ` ", "沿给定的轴 axis 忽略NAN元素计算 x 中元素的中位数"
- " :ref:`paddle.min ` ", "对指定维度上的Tensor元素求最小值运算"
- " :ref:`paddle.amin ` ", "对指定维度上的Tensor元素求最小值运算"
- " :ref:`paddle.minimum ` ", "逐元素对比输入的两个Tensor,并且把各个位置更小的元素保存到返回结果中"
+ " :ref:`paddle.nanmedian ` ", "沿给定的轴 axis 忽略 NAN 元素计算 x 中元素的中位数"
+ " :ref:`paddle.min ` ", "对指定维度上的 Tensor 元素求最小值运算"
+ " :ref:`paddle.amin ` ", "对指定维度上的 Tensor 元素求最小值运算"
+ " :ref:`paddle.minimum ` ", "逐元素对比输入的两个 Tensor,并且把各个位置更小的元素保存到返回结果中"
" :ref:`paddle.mm ` ", "用于两个输入矩阵的相乘"
" :ref:`paddle.inner ` ", "计算两个输入矩阵的内积"
" :ref:`paddle.outer ` ", "计算两个输入矩阵的外积"
- " :ref:`paddle.multiplex ` ", "从每个输入Tensor中选择特定行构造输出Tensor"
+ " :ref:`paddle.multiplex ` ", "从每个输入 Tensor 中选择特定行构造输出 Tensor"
" :ref:`paddle.multiply ` ", "逐元素相乘算子"
" :ref:`paddle.neg ` ", "计算输入 x 的相反数并返回"
- " :ref:`paddle.not_equal ` ", "逐元素地返回x!=y 的逻辑值"
- " :ref:`paddle.pow ` ", "指数算子,逐元素计算 x 的 y 次幂"
- " :ref:`paddle.prod ` ", "对指定维度上的Tensor元素进行求乘积运算"
- " :ref:`paddle.reciprocal ` ", "对输入Tensor取倒数"
+ " :ref:`paddle.not_equal ` ", "逐元素地返回 x!=y 的逻辑值"
+ " :ref:`paddle.pow ` ", "指数算子,逐元素计算 x 的 y 次幂"
+ " :ref:`paddle.prod ` ", "对指定维度上的 Tensor 元素进行求乘积运算"
+ " :ref:`paddle.reciprocal ` ", "对输入 Tensor 取倒数"
" :ref:`paddle.round ` ", "将输入中的数值四舍五入到最接近的整数数值"
- " :ref:`paddle.rsqrt ` ", "rsqrt激活函数"
+ " :ref:`paddle.rsqrt ` ", "rsqrt 激活函数"
" :ref:`paddle.scale ` ", "缩放算子"
- " :ref:`paddle.sign ` ", "对输入x中每个元素进行正负判断"
+ " :ref:`paddle.sign ` ", "对输入 x 中每个元素进行正负判断"
" :ref:`paddle.sin ` ", "计算输入的正弦值"
" :ref:`paddle.sinh ` ", "双曲正弦函数"
" :ref:`paddle.sqrt ` ", "计算输入的算数平方根"
- " :ref:`paddle.square ` ", "该OP执行逐元素取平方运算"
+ " :ref:`paddle.square ` ", "该 OP 执行逐元素取平方运算"
" :ref:`paddle.stanh ` ", "stanh 激活函数"
" :ref:`paddle.std ` ", "沿给定的轴 axis 计算 x 中元素的标准差"
" :ref:`paddle.subtract ` ", "逐元素相减算子"
- " :ref:`paddle.sum ` ", "对指定维度上的Tensor元素进行求和运算"
- " :ref:`paddle.tan ` ", "三角函数tangent"
- " :ref:`paddle.tanh ` ", "tanh激活函数"
+ " :ref:`paddle.sum ` ", "对指定维度上的 Tensor 元素进行求和运算"
+ " :ref:`paddle.tan ` ", "三角函数 tangent"
+ " :ref:`paddle.tanh ` ", "tanh 激活函数"
" :ref:`paddle.tanh_ ` ", "Inplace 版本的 tanh API,对输入 x 采用 Inplace 策略"
" :ref:`paddle.trace ` ", "计算输入 Tensor 在指定平面上的对角线元素之和"
" :ref:`paddle.var ` ", "沿给定的轴 axis 计算 x 中元素的方差"
" :ref:`paddle.diagonal ` ", "根据给定的轴 axis 返回输入 Tensor 的局部视图"
" :ref:`paddle.trunc ` ", "对输入 Tensor 每个元素的小数部分进行截断"
" :ref:`paddle.frac ` ", "得到输入 Tensor 每个元素的小数部分"
- " :ref:`paddle.log1p ` ", "该OP计算Log1p(加一的自然对数)结果"
- " :ref:`paddle.take_along_axis ` ", "根据axis和index获取输入 Tensor 的对应元素"
- " :ref:`paddle.put_along_axis ` ", "根据axis和index放置value值至输入 Tensor"
- " :ref:`paddle.lerp ` ", "该OP基于给定的 weight 计算 x 与 y 的线性插值"
- " :ref:`paddle.diff ` ", "沿着指定维度对输入Tensor计算n阶的前向差值"
+ " :ref:`paddle.log1p ` ", "该 OP 计算 Log1p(加一的自然对数)结果"
+ " :ref:`paddle.take_along_axis ` ", "根据 axis 和 index 获取输入 Tensor 的对应元素"
+ " :ref:`paddle.put_along_axis ` ", "根据 axis 和 index 放置 value 值至输入 Tensor"
+ " :ref:`paddle.lerp ` ", "该 OP 基于给定的 weight 计算 x 与 y 的线性插值"
+ " :ref:`paddle.diff ` ", "沿着指定维度对输入 Tensor 计算 n 阶的前向差值"
" :ref:`paddle.rad2deg ` ", "将元素从弧度的角度转换为度"
" :ref:`paddle.deg2rad ` ", "将元素从度的角度转换为弧度"
" :ref:`paddle.gcd ` ", "计算两个输入的按元素绝对值的最大公约数"
" :ref:`paddle.lcm ` ", "计算两个输入的按元素绝对值的最小公倍数"
- " :ref:`paddle.erfinv ` ", "计算输入Tensor的逆误差函数"
+ " :ref:`paddle.erfinv ` ", "计算输入 Tensor 的逆误差函数"
" :ref:`paddle.acosh ` ", "反双曲余弦函数"
" :ref:`paddle.asinh ` ", "反双曲正弦函数"
" :ref:`paddle.atanh ` ", "反双曲正切函数"
@@ -140,75 +140,75 @@ tensor数学操作
.. _tensor_logic:
-tensor逻辑操作
+tensor 逻辑操作
::::::::::::::::::::
.. csv-table::
- :header: "API名称", "API功能"
+ :header: "API 名称", "API 功能"
:widths: 10, 30
" :ref:`paddle.is_empty ` ", "测试变量是否为空"
- " :ref:`paddle.is_tensor ` ", "用来测试输入对象是否是paddle.Tensor"
- " :ref:`paddle.isfinite ` ", "返回输入tensor的每一个值是否为Finite(既非 +/-INF 也非 +/-NaN )"
- " :ref:`paddle.isinf ` ", "返回输入tensor的每一个值是否为 +/-INF"
- " :ref:`paddle.isnan ` ", "返回输入tensor的每一个值是否为 +/-NaN"
+ " :ref:`paddle.is_tensor ` ", "用来测试输入对象是否是 paddle.Tensor"
+ " :ref:`paddle.isfinite ` ", "返回输入 tensor 的每一个值是否为 Finite(既非 +/-INF 也非 +/-NaN )"
+ " :ref:`paddle.isinf ` ", "返回输入 tensor 的每一个值是否为 +/-INF"
+ " :ref:`paddle.isnan ` ", "返回输入 tensor 的每一个值是否为 +/-NaN"
.. _tensor_attribute:
-tensor属性相关
+tensor 属性相关
::::::::::::::::::::
.. csv-table::
- :header: "API名称", "API功能"
+ :header: "API 名称", "API 功能"
:widths: 10, 30
- " :ref:`paddle.imag ` ", "返回一个包含输入复数Tensor的虚部数值的新Tensor"
- " :ref:`paddle.real ` ", "返回一个包含输入复数Tensor的实部数值的新Tensor"
- " :ref:`paddle.shape ` ", "获得输入Tensor或SelectedRows的shape"
+ " :ref:`paddle.imag ` ", "返回一个包含输入复数 Tensor 的虚部数值的新 Tensor"
+ " :ref:`paddle.real ` ", "返回一个包含输入复数 Tensor 的实部数值的新 Tensor"
+ " :ref:`paddle.shape ` ", "获得输入 Tensor 或 SelectedRows 的 shape"
" :ref:`paddle.is_complex ` ", "判断输入 tensor 的数据类型是否为复数类型"
" :ref:`paddle.is_integer ` ", "判断输入 tensor 的数据类型是否为整数类型"
- " :ref:`paddle.broadcast_shape ` ", "返回对x_shape大小的张量和y_shape大小的张量做broadcast操作后得到的shape"
- " :ref:`paddle.is_floating_point ` ", "判断输入Tensor的数据类型是否为浮点类型"
+ " :ref:`paddle.broadcast_shape ` ", "返回对 x_shape 大小的张量和 y_shape 大小的张量做 broadcast 操作后得到的 shape"
+ " :ref:`paddle.is_floating_point ` ", "判断输入 Tensor 的数据类型是否为浮点类型"
.. _tensor_creation:
-tensor创建相关
+tensor 创建相关
::::::::::::::::::::
.. csv-table::
- :header: "API名称", "API功能"
+ :header: "API 名称", "API 功能"
:widths: 10, 30
- " :ref:`paddle.arange ` ", "返回以步长 step 均匀分隔给定数值区间[start, end)的1-D Tensor,数据类型为 dtype"
- " :ref:`paddle.diag ` ", "如果 x 是向量(1-D张量),则返回带有 x 元素作为对角线的2-D方阵;如果 x 是矩阵(2-D张量),则提取 x 的对角线元素,以1-D张量返回。"
+ " :ref:`paddle.arange ` ", "返回以步长 step 均匀分隔给定数值区间[start, end)的 1-D Tensor,数据类型为 dtype"
+ " :ref:`paddle.diag ` ", "如果 x 是向量(1-D 张量),则返回带有 x 元素作为对角线的 2-D 方阵;如果 x 是矩阵(2-D 张量),则提取 x 的对角线元素,以 1-D 张量返回。"
" :ref:`paddle.diagflat ` ", "如果 x 是一维张量,则返回带有 x 元素作为对角线的二维方阵;如果 x 是大于等于二维的张量,则返回一个二维张量,其对角线元素为 x 在连续维度展开得到的一维张量的元素。"
- " :ref:`paddle.empty ` ", "创建形状大小为shape并且数据类型为dtype的Tensor"
- " :ref:`paddle.empty_like ` ", "根据 x 的shape和数据类型 dtype 创建未初始化的Tensor"
- " :ref:`paddle.eye ` ", "构建二维Tensor(主对角线元素为1,其他元素为0)"
- " :ref:`paddle.full ` ", "创建形状大小为 shape 并且数据类型为 dtype 的Tensor"
- " :ref:`paddle.full_like ` ", "创建一个和 x 具有相同的形状并且数据类型为 dtype 的Tensor"
- " :ref:`paddle.linspace ` ", "返回一个Tensor,Tensor的值为在区间start和stop上均匀间隔的num个值,输出Tensor的长度为num"
+ " :ref:`paddle.empty ` ", "创建形状大小为 shape 并且数据类型为 dtype 的 Tensor"
+ " :ref:`paddle.empty_like ` ", "根据 x 的 shape 和数据类型 dtype 创建未初始化的 Tensor"
+ " :ref:`paddle.eye ` ", "构建二维 Tensor(主对角线元素为 1,其他元素为 0)"
+ " :ref:`paddle.full ` ", "创建形状大小为 shape 并且数据类型为 dtype 的 Tensor"
+ " :ref:`paddle.full_like ` ", "创建一个和 x 具有相同的形状并且数据类型为 dtype 的 Tensor"
+ " :ref:`paddle.linspace ` ", "返回一个 Tensor,Tensor 的值为在区间 start 和 stop 上均匀间隔的 num 个值,输出 Tensor 的长度为 num"
" :ref:`paddle.meshgrid ` ", "对每个张量做扩充操作"
- " :ref:`paddle.numel ` ", "返回一个长度为1并且元素值为输入 x 元素个数的Tensor"
- " :ref:`paddle.ones ` ", "创建形状为 shape 、数据类型为 dtype 且值全为1的Tensor"
- " :ref:`paddle.ones_like ` ", "返回一个和 x 具有相同形状的数值都为1的Tensor"
- " :ref:`paddle.Tensor ` ", "Paddle中最为基础的数据结构"
- " :ref:`paddle.to_tensor