未验证 提交 1695d88b 编写于 作者: D Daniel Yang 提交者: GitHub

test=develop, test=document_fix (#2125)

上级 01f02991
......@@ -168,7 +168,7 @@ class MulOpGradMaker : public framework::SingleGradOpMaker<T> {
- 有些Op的前向逻辑和反向逻辑是一样的,比如[`ScaleOp`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/scale_op.cc).这种情况下,前向Op和反向Op的Kernel可以为同一个。
- 有些前向Op所对应的反向Op可能有多个,比如[`SumOp`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/sum_op.cc),这种情况下,`GradMaker`需要继承`framework::GradOpDescMakerBase`
- 有些Op的反向对应另一个Op的前向,比如[`SplitOp`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/split_op.h),这种情况下,[`SplitGradMaker`](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/split_op.h#L157)中定义的`SplitOp`反向Op的Type就是`concat`
- 为高效地同时支持动态图和静态图,`SingleGradOpMaker`是一个模板类,在注册Operator时需要同时注册`MulOpGradMaker<OpDesc>`(静态图使用)和`MulOpGradMaker<OpBase>`(动态图使用)。
- 为高效地同时支持命令式编程模式(动态图)和声明式编程模式(静态图),`SingleGradOpMaker`是一个模板类,在注册Operator时需要同时注册`MulOpGradMaker<OpDesc>`(声明式编程模式使用)和`MulOpGradMaker<OpBase>`(命令式编程模式使用)。
### 定义Operator类
......@@ -303,7 +303,7 @@ MulOp(const std::string &type, const framework::VariableNameMap &inputs,
通常`OpProtoMaker``Op`类的定义写在`.cc`文件中,和下面将要介绍的注册函数一起放在`.cc`
### InferShape区分 compile time 和 run time
在我们的静态图网络中,`InferShape`操作在[编译时(compile time)和运行时(run time)](https://github.com/PaddlePaddle/FluidDoc/blob/release/1.2/doc/fluid/getstarted/Developer's_Guide_to_Paddle_Fluid.md#%E8%AE%A9%E6%88%91%E4%BB%AC%E5%9C%A8fluid%E7%A8%8B%E5%BA%8F%E5%AE%9E%E4%BE%8B%E4%B8%AD%E5%8C%BA%E5%88%86%E7%BC%96%E8%AF%91%E6%97%B6%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6)都会被调用,在compile time时,由于真实的维度未知,框架内部用-1来表示,在run time时,用实际的维度表示,因此维度的值在compile time和 run time时可能不一致,如果存在维度的判断和运算操作,InferShape就需要区分compile time 和 run time。
在我们的声明式编程模式网络中,`InferShape`操作在[编译时(compile time)和运行时(run time)](https://github.com/PaddlePaddle/FluidDoc/blob/release/1.2/doc/fluid/getstarted/Developer's_Guide_to_Paddle_Fluid.md#%E8%AE%A9%E6%88%91%E4%BB%AC%E5%9C%A8fluid%E7%A8%8B%E5%BA%8F%E5%AE%9E%E4%BE%8B%E4%B8%AD%E5%8C%BA%E5%88%86%E7%BC%96%E8%AF%91%E6%97%B6%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6)都会被调用,在compile time时,由于真实的维度未知,框架内部用-1来表示,在run time时,用实际的维度表示,因此维度的值在compile time和 run time时可能不一致,如果存在维度的判断和运算操作,InferShape就需要区分compile time 和 run time。
以下两种情况需要区分compile time和 run time。
......@@ -491,7 +491,7 @@ class MulKernel : public framework::OpKernel<T> {
ops::MulGradKernel<paddle::platform::CPUDeviceContext, double>);
```
在上面的代码中,使用`REGISTER_OPERATOR`注册了`ops::MulOp`类,类型名为`mul`,该类的`ProtoMaker`为`ops::MulOpMaker`,其`GradOpMaker`分别是`ops::MulOpGradMaker<paddle::framework::OpDesc>`(静态图使用)和`ops::MulOpGradMaker<paddle::imperative::OpBase>`(动态图使用),并使用`REGISTER_OPERATOR`注册`ops::MulGradOp`,类型名为`mul_grad`。然后,使用`REGISTER_OP_CPU_KERNEL`注册了`ops::MulKernel`类,并特化模板参数为设备为`paddle::platform::CPUPlace`、数据类型为`float`类型和`double`类型;同理,注册`ops::MulGradKernel`类。
在上面的代码中,使用`REGISTER_OPERATOR`注册了`ops::MulOp`类,类型名为`mul`,该类的`ProtoMaker`为`ops::MulOpMaker`,其`GradOpMaker`分别是`ops::MulOpGradMaker<paddle::framework::OpDesc>`(声明式编程模式使用)和`ops::MulOpGradMaker<paddle::imperative::OpBase>`(命令式编程模式使用),并使用`REGISTER_OPERATOR`注册`ops::MulGradOp`,类型名为`mul_grad`。然后,使用`REGISTER_OP_CPU_KERNEL`注册了`ops::MulKernel`类,并特化模板参数为设备为`paddle::platform::CPUPlace`、数据类型为`float`类型和`double`类型;同理,注册`ops::MulGradKernel`类。
-`.cu`文件中注册CUDA Kernel。
......
# VisualDL 工具简介
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/docs/images/vs-logo.png" width="60%" />
<img src="http://visualdl.bj.bcebos.com/images/vdl-logo.png" width="70%"/>
</p>
## 介绍
VisualDL是一个面向深度学习任务设计的可视化工具,包含了scalar、参数分布、模型结构、图像可视化等功能,项目正处于高速迭代中,新的组件会不断加入。
目前大多数DNN平台均使用Python作为配置语言,VisualDL原生支持python的使用,
通过在模型的Python配置中添加几行,便可以为训练过程提供丰富的可视化支持。
除了Python SDK之外,VisualDL底层采用C++编写,其暴露的C++ SDK也可以集成到其他平台中,
实现原生的性能和定制效果。
VisualDL是深度学习模型可视化分析工具,以丰富的图表呈现训练参数变化趋势、模型结构、数据样本、高维数据分布等。可帮助用户更清晰直观地理解深度学习模型训练过程及模型结构,进而实现高效的模型优化。
## 组件
VisualDL 目前支持以下组件:
VisualDL提供丰富的可视化功能,支持实时训练参数分析、图结构、数据样本可视化及高维数据降维呈现等诸多功能。具体功能使用方式,请参见 **VisualDL 使用指南**。项目正处于高速迭代中,敬请期待新组件的加入。
- scalar
- histogram
- image
- audio
- graph
- high dimensional
VisualDL原生支持python的使用, 通过在模型的Python配置中添加几行代码,便可为训练过程提供丰富的可视化支持。
### Scalar
可以用于展示训练测试的误差趋势
<p align="center">
<img src="https://raw.githubusercontent.com/daming-lu/large_files/master/loss_scalar.gif" width="60%"/>
</p>
### Histogram
用于可视化任何tensor中元素分布的变化趋势
<p align="center">
<img src="https://raw.githubusercontent.com/daming-lu/large_files/master/histogram.gif" width="60%"/>
</p>
## 核心亮点
### Image
可以用于可视化任何tensor,或模型生成的图片
### 简单易用
<p align="center">
<img src="https://raw.githubusercontent.com/daming-lu/large_files/master/loss_image.gif" width="60%"/>
</p>
API设计简洁易懂,使用简单。模型结构一键实现可视化。
### Audio
可用于播放输入或生成的音频样本
### 功能丰富
### Graph
功能覆盖训练参数、图结构、数据样本及数据降维可视化。
VisualDL的graph支持paddle program的展示,同时兼容 ONNX(Open Neural Network Exchange)[https://github.com/onnx/onnx],通过与 python SDK的结合,VisualDL可以兼容包括 PaddlePaddle, pytorch, mxnet在内的大部分主流DNN平台。
### 高兼容性
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/docs/images/graph_demo.gif" width="60%" />
</p>
全面支持Paddle、ONNX、Caffe等市面主流模型结构可视化,广泛支持各类用户进行可视化分析。
要进行paddle模型的展示,需要进行以下两步操作:
### 全面支持
1. 在paddle代码中,调用`fluid.io.save_inference_model()`接口保存模型
2. 在命令行界面,使用`visualdl --model_pb [paddle_model_dir]` 加载paddle模型
与飞桨服务平台及工具组件全面打通,为您在飞桨生态系统中提供最佳使用体验。
### High Dimensional
用高维度数据映射在2D/3D来可视化嵌入
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/docs/getting_started/high_dimensional_3d.png" width="60%"/>
</p>
## 安装方式
## 快速尝试
请使用下面的命令,来快速测试 VisualDL。
使用pip安装 VisualDL 运行范例:
```shell
pip install --upgrade visualdl==2.0.0a2
```
# 安装,建議是在虚拟环境或anaconda下。
pip install --upgrade visualdl
# 运行一个例子,vdl_create_scratch_log 将创建测试日志
vdl_create_scratch_log
visualdl --logdir=scratch_log --port=8080
# 访问 http://127.0.0.1:8080
```
如果出现`TypeError: __init__() got an unexpected keyword argument 'file'`, 是因为protobuf不是3.5以上,运行`pip install --upgrade protobuf`就能解决。
## 使用方式
如果以上步骤还有出现其他问题,很可能是因为python或pip不同版本或不同位置所致,以下安装方法能解决
VisualDL将训练过程中的数据、参数等信息储存至日志文件中后,启动面板即可查看可视化结果
## 使用 virtualenv 安装
### 1. 记录日志
[Virtualenv](https://virtualenv.pypa.io/en/stable/) 能创建独立Python环境,也能确保Python和pip的相对位置正确。
VisualDL的后端提供了Python SDK,可通过LogWriter定制一个日志记录器,接口如下:
在macOS上,安装pip和virtualenv如下:
```
sudo easy_install pip
pip install --upgrade virtualenv
```python
class LogWriter(
logdir=None,
comment='',
max_queue=10,
flush_secs=120,
filename_suffix='',
write_to_disk=True,
**kwargs
)
```
在Linux上,安装pip和virtualenv如下:
```
sudo apt-get install python3-pip python3-dev python-virtualenv
```
#### 接口参数
然后创建一个虚拟环境:
```
virtualenv ~/vdl # for Python2.7
virtualenv -p python3 ~/vdl for Python 3.x
```
| 参数 | 格式 | 含义 |
| --------------- | ------- | ------------------------------------------------------------ |
| logdir | string | 日志文件所在的路径,VisualDL将在此路径下建立日志文件并进行记录,如果不填则默认为`runs/${CURRENT_TIME}` |
| comment | string | 为日志文件夹名添加后缀,如果制定了logdir则此项无效 |
| max_queue | int | 日志记录消息队列的最大容量,达到此容量则立即写入到日志文件 |
| flush_secs | int | 日志记录消息队列的最大缓存时间,达到此时间则立即写入到日志文件 |
| filename_suffix | string | 为默认的日志文件名添加后缀 |
| write_to_disk | boolean | 是否写入到磁盘 |
```~/vdl``` 是你的Virtualenv目录, 你也可以选择任一目录。
#### 示例
激活虚拟环境如下:
```
source ~/vdl/bin/activate
```
设置日志文件并记录标量数据:
现在再安装 VisualDL 和运行范例:
```python
from visualdl import LogWriter
# 在`./log/scalar_test/train`路径下建立日志文件
with LogWriter(logdir="./log/scalar_test/train") as writer:
# 使用scalar组件记录一个标量数据
writer.add_scalar(tag="acc", step=1, value=0.5678)
writer.add_scalar(tag="acc", step=2, value=0.6878)
writer.add_scalar(tag="acc", step=3, value=0.9878)
```
pip install --upgrade visualdl
# 运行一个例子,vdl_create_scratch_log 将创建测试日志
vdl_create_scratch_log
visualdl --logdir=scratch_log --port=8080
### 2. 启动面板
# 访问 http://127.0.0.1:8080
```
在上述示例中,日志已记录三组标量数据,现可启动VisualDL面板查看日志的可视化结果,共有两种启动方式:
#### 在命令行启动
如果在虚拟环境下仍然遇到安装问题,请尝试以下方法。
使用命令行启动VisualDL面板,命令格式如下:
```python
visualdl --logdir <dir_1, dir_2, ... , dir_n> --host <host> --port <port>
```
## 使用 Anaconda 安装
参数详情:
Anaconda是一个用于科学计算的Python发行版,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。
| 参数 | 意义 |
| -------- | ------------------------------------------------------------ |
| --logdir | 设定日志所在目录,可以指定多个目录,VisualDL将遍历并且迭代寻找指定目录的子目录,将所有实验结果进行可视化 |
| --host | 设定IP,默认为`127.0.0.1` |
| --port | 设定端口,默认为`8040` |
请根据[Anaconda下载网站](https://www.anaconda.com/download) 的指示去下载和安装Anaconda.
下载Python 3.6版本的command-Line installer.
针对上一步生成的日志,启动命令为:
创建conda环境名字为```vdl```或任何名字:
```
conda create -n vdl pip python=2.7 # or python=3.3, etc.
visualdl --logdir ./log
```
激活conda环境如下:
```
source activate vdl
```
#### 在Python脚本中启动
现在再安装 VisualDL 和运行范例
支持在Python脚本中启动VisualDL面板,接口如下
```python
visualdl.server.app.run(logdir,
host="127.0.0.1",
port=8080,
cache_timeout=20,
language=None,
open_browser=False)
```
pip install --upgrade visualdl
# 运行一个例子,vdl_create_scratch_log 将创建测试日志
vdl_create_scratch_log
visualdl --logdir=scratch_log --port=8080
接口参数:
# 访问 http://127.0.0.1:8080
```
| 参数 | 格式 | 含义 |
| ------------- | ------------------------------------------------ | ------------------------------------------------------------ |
| logdir | string或list[string_1, string_2, ... , string_n] | 日志文件所在的路径,VisualDL将在此路径下递归搜索日志文件并进行可视化,可指定单个或多个路径 |
| host | string | 指定启动服务的ip,默认为`127.0.0.1` |
| port | int | 启动服务端口,默认为`8040` |
| cache_timeout | int | 后端缓存时间,在缓存时间内前端多次请求同一url,返回的数据从缓存中获取,默认为20秒 |
| language | string | VisualDL面板语言,可指定为'EN'或'CN',默认自动匹配操作系统使用语言 |
| open_browser | boolean | 是否打开浏览器,设置为True则在启动后自动打开浏览器并访问VisualDL面板 |
如果仍然遇到安装问题,请尝试以下用源代码安装方法。
针对上一步生成的日志,我们的启动脚本为:
### 使用代码安装
```
#建議是在虚拟环境或anaconda下。
git clone https://github.com/PaddlePaddle/VisualDL.git
cd VisualDL
```python
from visualdl.server import app
python setup.py bdist_wheel
pip install --upgrade dist/visualdl-*.whl
app.run(logdir="./log")
```
如果打包和安装遇到其他问题,不安装只想运行Visual DL可以看[这里](https://github.com/PaddlePaddle/VisualDL/blob/develop/docs/develop/how_to_dev_frontend_cn.md)
在使用任意一种方式启动VisualDL面板后,打开浏览器访问VisualDL面板,即可查看日志的可视化结果,如图:
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/3points_demo.png" width="60%"/>
</p>
## SDK
VisualDL 同时提供了python SDK 和 C++ SDK 来实现不同方式的使用。
### Python SDK
VisualDL 现在支持 Python 2和 Python 3。
以最简单的Scalar组件为例,尝试创建一个scalar组件并插入多个时间步的数据:
## 可视化功能概览
```python
import random
from visualdl import LogWriter
### Scalar
以图表形式实时展示训练过程参数,如loss、accuracy。让用户通过观察单组或多组训练参数变化,了解训练过程,加速模型调优。具有两大特点:
logdir = "./tmp"
logger = LogWriter(logdir, sync_cycle=10000)
#### 动态展示
# mark the components with 'train' label.
with logger.mode("train"):
# create a scalar component called 'scalars/scalar0'
scalar0 = logger.scalar("scalars/scalar0")
在启动VisualDL Board后,LogReader将不断增量的读取日志中数据并供前端调用展示,因此能够在训练中同步观测指标变化,如下图:
# add some records during DL model running.
for step in range(100):
scalar0.add_record(step, random.random())
```
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/dynamic_display.gif" width="60%"/>
</p>
### C++ SDK
上面 Python SDK 中代码完全一致的C++ SDK用法如下
```c++
#include <cstdlib>
#include <string>
#include "visualdl/sdk.h"
namespace vs = visualdl;
namespace cp = visualdl::components;
#### 多实验对比
int main() {
const std::string dir = "./tmp";
vs::LogWriter logger(dir, 10000);
只需在启动VisualDL Board的时将每个实验日志所在路径同时传入即可,每个实验中相同tag的指标将绘制在一张图中同步呈现,如下图:
logger.SetMode("train");
auto tablet = logger.AddTablet("scalars/scalar0");
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/multi_experiments.gif" width="100%"/>
</p>
cp::Scalar<float> scalar0(tablet);
for (int step = 0; step < 1000; step++) {
float v = (float)std::rand() / RAND_MAX;
scalar0.AddRecord(step, v);
}
### Image
实时展示训练过程中的图像数据,用于观察不同训练阶段的图像变化,进而深入了解训练过程及效果。
return 0;
}
```
## 启动Board
当训练过程中已经产生了日志数据,就可以启动board进行实时预览可视化信息
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/image-eye.gif" width="60%"/>
</p>
```
visualdl --logdir <some log dir>
```
board 还支持一下参数来实现远程的访问:
### High Dimensional
将高维数据进行降维展示,目前支持T-SNE、PCA两种降维方式,用于深入分析高维数据间的关系,方便用户根据数据特征进行算法优化。
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/high_dimensional_test.png" width="100%"/>
</p>
- `--host` 设定IP
- `--port` 设定端口
- `-m / --model_pb` 指定 ONNX 格式的模型文件
## 开源贡献
### 贡献
VisualDL 是由 [PaddlePaddle](http://www.paddlepaddle.org/)[ECharts](http://echarts.baidu.com/) 合作推出的开源项目。欢迎所有人使用,提意见以及贡献代码。
VisualDL 是由 [PaddlePaddle](http://www.paddlepaddle.org/) 和
[ECharts](http://echarts.baidu.com/) 合作推出的开源项目。我们欢迎所有人使用,提意见以及贡献代码。
## 更多细节
想了解更多关于VisualDL的使用介绍,请查看[文档](https://github.com/PaddlePaddle/VisualDL/tree/develop/demo)
想了解更多关于VisualDL可视化功能的使用详情介绍,请查看**Visual DL 使用指南**
# VisualDL 使用指南
## 概述
VisualDL 是一个面向深度学习任务设计的可视化工具。VisualDL 利用了丰富的图表来展示数据,用户可以更直观、清晰地查看数据的特征与变化趋势,有助于分析数据、及时发现错误,进而改进神经网络模型的设计。
目前,VisualDL 支持 scalar, histogram, image, text, audio, high dimensional, graph 这七个组件:
|组件名称|展示图表|作用|
|:----:|:---:|:---|
|<a href="#1">scalar</a>|折线图|动态展示损失函数值、准确率等标量数据|
|<a href="#2">histogram</a>|直方图|动态展示参数矩阵的数值分布与变化趋势,便于查看权重矩阵、偏置项、梯度等参数的变化|
|<a href="#3">image</a>|图片|显示图片,可显示输入图片和处理后的结果,便于查看中间过程的变化|
|<a href="#4">text</a>|文本|展示文本,有助于 NLP 等领域的用户进行数据分析和结果判断|
|<a href="#5">audio</a>|音频|可直接播放音频,也支持下载,有助于语音识别等领域的用户进行数据分析和结果判断|
|<a href="#6">high dimensional</a>|坐标|将高维数据映射到 2D/3D 空间来可视化嵌入,便于观察不同数据的相关性|
|<a href="#7">graph</a>|有向图|展示神经网络的模型结构|
## 动态添加数据组件
要想使用 VisualDL 的 scalar, histogram, image, text, audio, high dimensional 这六个组件来添加数据,都必须先初始化记录器 `LogWriter`,以设置数据在本地磁盘的保存路径以及同步周期。此后各个组件的输入数据会先保存到本地磁盘,进而才能加载到前端网页中展示。
### LogWriter -- 记录器
# VisualDL 使用指南
LogWriter 是一个数据记录器,在数据记录过程中,LogWriter 会周期性地将数据写入指定路径。
### 概述
LogWriter 的定义为:
VisualDL 是一个面向深度学习任务设计的可视化工具。VisualDL 利用了丰富的图表来展示数据,用户可以更直观、清晰地查看数据的特征与变化趋势,有助于分析数据、及时发现错误,进而改进神经网络模型的设计。
```python
class LogWriter(dir, sync_cycle)
```
目前,VisualDL 支持 scalar, image, high dimensional 三个组件,项目正处于高速迭代中,敬请期待新组件的加入。
> :param dir : 指定日志文件的保存路径。
> :param sync_cycle : 同步周期。经过 sync_cycle 次添加数据的操作,就执行一次将数据从内存写入磁盘的操作。
> :return: 函数返回一个 LogWriter 对象。
| 组件名称 | 展示图表 | 作用 |
| :----------------------------------------------------------: | :--------: | :----------------------------------------------------------- |
| <a href="#1">[ Scalar](#Scalar -- 折线图组件)</a> | 折线图 | 动态展示损失函数值、准确率等标量数据 |
| <a href="#3">[Image](#Image -- 图片可视化组件)</a> | 图片可视化 | 显示图片,可显示输入图片和处理后的结果,便于查看中间过程的变化 |
| <a href="#6">[High Dimensional](#High Dimensional -- 数据降维组件)</a> | 数据降维 | 将高维数据映射到 2D/3D 空间来可视化嵌入,便于观察不同数据的相关性 |
例1 创建一个 LogWriter 对象
```python
# 创建一个 LogWriter 对象 log_writer
log_writer = LogWriter("./log", sync_cycle=10)
```
LogWriter类的成员函数包括:
## Scalar -- 折线图组件
* `mode()`
* `scalar()`, `histogram()`, `image()`, `text()`, `audio()`, `embedding()`
### 介绍
成员函数 `mode()` 用于指定模式。模式的名称是自定义的,比如训练`train`,验证`validation`,测试`test`,第一层卷积`conv_layer1`。 有着相同模式名称的组件作为一个整体,用户可在前端网页中的 `Runs` 按钮中选择显示哪个模式的数据(默认是显示全部模式)
Scalar 组件的输入数据类型为标量,该组件的作用是将训练参数以折线图形式呈现。将损失函数值、准确率等标量数据作为参数传入 scalar 组件,即可画出折线图,便于观察变化趋势
成员函数 `scalar()`, `histogram()`, `image()`, `text()`, `audio()`, `embedding()` 用于创建组件。
### 记录接口
例2 LogWriter 创建组件
Scalar 组件的记录接口如下:
```python
# 设定模式为 train,创建一个 scalar 组件
with log_writer.mode("train") as logger:
train_scalar = logger.scalar("acc")
# 设定模式为test,创建一个 image 组件
with log_writer.mode("test") as shower:
test_image = shower.image("conv_image", 10, 1)
add_scalar(tag, value, step, walltime=None)
```
接口参数说明如下:
|参数|格式|含义|
|-|-|-|
|tag|string|记录指标的标志,如`train/loss`,不能含有`%`|
|value|float|要记录的数据值|
|step|int|记录的步数|
|walltime|int|记录数据的时间戳,默认为当前时间戳|
### scalar -- 折线图组件
<a name="1">scalar</a> 组件的输入数据类型为标量,该组件的作用是画折线图。将损失函数值、准确率等标量数据作为参数传入 scalar 组件,即可画出折线图,便于观察变化趋势。
想通过 scalar 组件画折线图,只需先设定 LogWriter 对象的成员函数 `scalar()`,即可使用 `add_record()` 函数添加数据。这两个函数的具体用法如下:
* LogWriter 对象的成员函数 `scalar()`
### Demo
下面展示了使用 Scalar 组件记录数据的示例,代码见[Scalar组件](../../demo/components/scalar_test.py)
```python
def scalar(tag, type)
```
> :param tag : 标签,tag 相同的折线在同一子框,否则不同,tag 的名称中不能有 % 这个字符。
> :param type : 数据类型,可选“float”, "double", "int",默认值为 "float"。
> :return: 函数返回一个 ScalarWriter 对象。
* scalar 组件的成员函数 `add_record()`
```python
def add_record(step, value)
```
> :param step : 步进数,标记这是第几个添加的数据。
> :param value : 输入数据。
例3 scalar 组件示例程序 [Github](https://github.com/PaddlePaddle/VisualDL/blob/develop/demo/component/scalar-demo.py)
```python
# coding=utf-8
from visualdl import LogWriter
# 创建 LogWriter 对象
log_writer = LogWriter("./log", sync_cycle=20)
# 创建 scalar 组件,模式为 train
with log_writer.mode("train") as logger:
train_acc = logger.scalar("acc")
train_loss = logger.scalar("loss")
# 创建 scalar 组件,模式设为 test, tag 设为 acc
with log_writer.mode("test") as logger:
test_acc = logger.scalar("acc")
value = [i/1000.0 for i in range(1000)]
for step in range(1000):
# 向名称为 acc 的图中添加模式为train的数据
train_acc.add_record(step, value[step])
# 向名称为 loss 的图中添加模式为train的数据
train_loss.add_record(step, 1 / (value[step] + 1))
# 向名称为 acc 的图中添加模式为test的数据
test_acc.add_record(step, 1 - value[step])
```
运行上述程序后,在命令行中执行
if __name__ == '__main__':
value = [i/1000.0 for i in range(1000)]
# 初始化一个记录器
with LogWriter(logdir="./log/scalar_test/train") as writer:
for step in range(1000):
# 向记录器添加一个tag为`acc`的数据
writer.add_scalar(tag="acc", step=step, value=value[step])
# 向记录器添加一个tag为`loss`的数据
writer.add_scalar(tag="loss", step=step, value=1/(value[step] + 1))
```
运行上述程序后,在命令行执行
```shell
visualdl --logdir ./log --host 0.0.0.0 --port 8080
visualdl --logdir ./log --port 8080
```
接着在浏览器打开 [http://0.0.0.0:8080](http://0.0.0.0:8080),即可查看以下折线图。
接着在浏览器打开`http://127.0.0.1:8080`,即可查看以下折线图。
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/scalar-interface.png" width=800><br/>
图1. scalar 组件展示折线图 <br/>
<img src="http://visualdl.bj.bcebos.com/images/scalar-globalstatic.png" width="100%"/>
</p>
VisualDL 页面的右边侧栏有各个组件的调节选项,以 scalar 组件为例:
* Smoothing : 用于调节曲线的平滑度。
* X-axis : 折线图的横坐标参数,可选 `Step`, `Relative`, `Wall Time`,分别表示横轴设为步进数、相对值、数据采集的时间。
* Tooltip sorting : 标签排序方法,可选 `default`, `descending`, `ascending`, `nearest`,分别表示默认排序、按名称降序、按名称升序、按最新更新时间排序。
VisualDL 页面的右边侧栏的最下方还有一个 `RUNNING` 按钮,此时前端定期从后端同步数据,刷新页面。点击可切换为红色的 `STOPPED`,暂停前端的数据更新。
### histogram -- 直方图组件
<a name="2">histogram</a> 组件的作用是以直方图的形式显示输入数据的分布。在训练过程中,把一些参数(例如权重矩阵 w,偏置项 b,梯度)传给 histogram 组件,就可以查看参数分布在训练过程中的变化趋势。
想通过 histogram 组件画参数直方图,只需先设定 LogWriter 对象的成员函数 `histogram()`,即可使用 `add_record()` 函数添加数据。这两个函数的具体用法如下:
* LogWriter 对象的成员函数 `histogram()`
```python
def histogram(tag, num_buckets, type)
```
### 功能操作说明
> :param tag : 标签,结合 LogWriter 指定的模式,决定输入参数显示的子框。
> :param num_buckets : 直方图的柱子数量。
> :param type : 数据类型,可选“float”, "double", "int",默认值为 "float"。
> :return: 函数返回一个 HistogramWriter 对象。
* 支持数据卡片「最大化」、「还原」、「坐标系转化」(y轴对数坐标)、「下载」折线图
* histogram 组件的成员函数 `add_record()`
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/scalar-icon.png" width="55%"/>
</p>
```python
def add_record(step, data)
```
> :param step : 步进数,标记这是第几组添加的数据。
> :param data : 输入参数, 数据类型为 list[]。
例4 histogram 组件示例程序 [Github](https://github.com/PaddlePaddle/VisualDL/blob/develop/demo/component/histogram-demo.py)
* 数据点Hover展示详细信息
```python
# coding=utf-8
import numpy as np
from visualdl import LogWriter
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/scalar-tooltip.png" width="60%"/>
</p>
# 创建 LogWriter 对象
log_writer = LogWriter('./log', sync_cycle=10)
# 创建 histogram 组件,模式为train
with log_writer.mode("train") as logger:
param1_histogram = logger.histogram("param1", num_buckets=100)
# 设定步数为 1 - 100
for step in range(1, 101):
# 添加的数据为随机分布,所在区间值变小
interval_start = 1 + 2 * step/100.0
interval_end = 6 - 2 * step/100.0
data = np.random.uniform(interval_start, interval_end, size=(10000))
* 可搜索卡片标签,展示目标图像
# 使用 add_record() 函数添加数据
param1_histogram.add_record(step, data)
```
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/scalar-searchlabel.png" width="90%"/>
</p>
运行上述程序后,在命令行中执行
```shell
visualdl --logdir ./log --host 0.0.0.0 --port 8080
```
接着在浏览器打开[http://0.0.0.0:8080](http://0.0.0.0:8080),即可查看 histogram 组件的直方图。其中横坐标为参数的数值,曲线上的值为相应参数的个数。右边纵轴的值为 Step,不同 Step 的数据组用不同颜色加以区分。
* 可搜索打点数据标签,展示特定数据
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/histogram-interface.png" width=800><br/>
图2. histogram 组件展示直方图 <br/>
<img src="http://visualdl.bj.bcebos.com/images/scalar-searchstream.png" width="40%"/>
</p>
### image -- 图片可视化组件
<a name="3">image</a> 组件用于显示图片。在程序运行过程中,将图片数据传入 image 组件,就可在 VisualDL 的前端网页看到相应图片。
使用 image 组件添加数据,需要先设定 LogWriter 对象的成员函数 `image()`,即可结合 `start_sampling()`, `is_sample_taken()`, `set_sample()``finish_sample()` 这四个 image 组件的成员函数来完成。这几个函数的定义及用法如下:
* LogWriter 对象的成员函数 `image()`
```python
def image(tag, num_samples, step_cycle)
```
* X轴有三种衡量尺度
> :param tag : 标签,结合 set_sample() 的参数 index,决定图片显示的子框。
> :param num_samples : 设置单个 step 的采样数,页面上的图片数目也等于 num_samples。
> :param step_cycle : 将 step_cycle 个 step 的数据存储到日志中,默认值为 1。
> :return: 函数返回一个 ImageWriter 对象。
1. Step:迭代次数
2. Walltime:训练绝对时间
3. Relative:训练时长
* 开始新的采样周期 - 开辟一块内存空间,用于存放采样的数据:
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/x-axis.png" width="40%"/>
</p>
* 可调整曲线平滑度,以便更好的展现参数整体的变化趋势
```python
def start_sampling()
```
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/scalar-smooth.png" width="37%"/>
</p>
* 判断该图片是否应被采样,当返回值为 `-1`,表示不用采样,否则,应被采样:
```python
def is_sample_taken()
```
## Image -- 图片可视化组件
* 使用函数 `set_sample()` 添加图片数据:
### 介绍
```python
def set_sample(index, image_shape, image_data)
```
Image 组件用于显示图片数据随训练的变化。在模型训练过程中,将图片数据传入 Image 组件,就可在 VisualDL 的前端网页查看相应图片。
> :param index : 索引号,与 tag 组合使用,决定图片显示的子框。
> :param image_shape : 图片的形状,[weight, height, 通道数(RGB 为 3,灰度图为 1)]。
> :param image_data : 图片的数据格式为矩阵,通常为 numpy.ndarray,经 flatten() 后变为行向量。
### 记录接口
* 结束当前的采样周期,将已采样的数据存到磁盘,并释放这一块内存空间
Image 组件的记录接口如下
```python
def finish_sample()
add_image(tag, img, step, walltime=None)
```
接口参数说明如下:
|参数|格式|含义|
|-|-|-|
|tag|string|记录指标的标志,如`train/loss`,不能含有`%`|
|img|numpy.ndarray|以ndarray格式表示的图片|
|step|int|记录的步数|
|walltime|int|记录数据的时间戳,默认为当前时间戳|
例5 image 组件示例程序 [Github](https://github.com/PaddlePaddle/VisualDL/blob/develop/demo/component/image-demo.py)
### Demo
下面展示了使用 Image 组件记录数据的示例,代码文件请见[Image组件](../../demo/components/image_test.py)
```python
# coding=utf-8
import numpy as np
from visualdl import LogWriter
from PIL import Image
from visualdl import LogWriter
def random_crop(img):
'''
此函数用于获取图片数据 img 的 100*100 的随机分块
'''
"""获取图片的随机 100x100 分片
"""
img = Image.open(img)
w, h = img.size
random_w = np.random.randint(0, w - 100)
random_h = np.random.randint(0, h - 100)
return img.crop((random_w, random_h, random_w + 100, random_h + 100))
# 创建 LogWriter 对象
log_writer = LogWriter("./log", sync_cycle=10)
# 创建 image 组件,模式为train, 采样数设为 ns
ns = 2
with log_writer.mode("train") as logger:
input_image = logger.image(tag="test", num_samples=ns)
# 一般要设置一个变量 sample_num,用于记录当前已采样了几个 image 数据
sample_num = 0
for step in range(6):
# 设置start_sampling() 的条件,满足条件时,开始采样
if sample_num == 0:
input_image.start_sampling()
# 获取idx
idx = input_image.is_sample_taken()
# 如果 idx != -1,采样,否则跳过
if idx != -1:
# 获取图片数据
image_path = "test.jpg"
image_data = np.array(random_crop(image_path))
# 使用 set_sample() 函数添加数据
# flatten() 用于把 ndarray 由矩阵变为行向量
input_image.set_sample(idx, image_data.shape, image_data.flatten())
sample_num += 1
# 如果完成了当前轮的采样,则调用finish_sample()
if sample_num % ns == 0:
input_image.finish_sampling()
sample_num = 0
```
运行上述程序后,在命令行中执行
```shell
visualdl --logdir ./log --host 0.0.0.0 --port 8080
```
接着在浏览器打开 [http://0.0.0.0:8080](http://0.0.0.0:8080),点击页面最上方的`SAMPLES`选项,即可查看 image 组件的展示图片。每一张子图都有一条浅绿色的横轴,拖动即可展示不同 step 的图片。
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/image-interface.png" width=800><br/>
图3. image 组件展示图片 <br/>
</p>
### text -- 文本组件
<a name="4">text</a> 组件用于显示文本,在程序运行过程中,将文本数据传入 text 组件,即可在 VisualDL 的前端网页中查看。
想要通过 text 组件添加数据,只需先设定 LogWriter 对象的成员函数 `text()`,即可使用 `add_record()` 函数来完成。这两个函数的具体用法如下:
* LogWriter 对象的成员函数 `text()`
```python
def text(tag)
```
> :param tag : 标签,结合 LogWriter 设定的模式,决定文本显示的子框。
> :return: 函数返回一个 TextWriter 对象。
* text 组件的成员函数 `add_record()`
r = img.crop((random_w, random_h, random_w + 100, random_h + 100))
return np.asarray(r)
```python
def add_record(step, str)
```
> :param step : 步进数,标记这是第几组添加的数据。
> :param str : 输入文本,数据类型为 string。
例6 text 组件示例程序 [Github](https://github.com/PaddlePaddle/VisualDL/blob/develop/demo/component/text-demo.py)
```python
# coding=utf-8
from visualdl import LogWriter
# 创建 LogWriter 对象
log_writter = LogWriter("./log", sync_cycle=10)
# 创建 text 组件,模式为 train, 标签为 test
with log_writter.mode("train") as logger:
vdl_text_comp = logger.text(tag="test")
# 使用 add_record() 函数添加数据
for i in range(1, 6):
vdl_text_comp.add_record(i, "这是第 %d 个 step 的数据。" % i)
vdl_text_comp.add_record(i, "This is data %d ." % i)
if __name__ == '__main__':
# 初始化一个记录器
with LogWriter(logdir="./log/image_test/train") as writer:
for step in range(6):
# 添加一个图片数据
writer.add_image(tag="doge",
img=random_crop("../../docs/images/eye.jpg"),
step=step)
```
运行上述程序后,在命令行中执行
运行上述程序后,在命令行执行
```shell
visualdl --logdir ./log --host 0.0.0.0 --port 8080
visualdl --logdir ./log --port 8080
```
接着在浏览器打开 [http://0.0.0.0:8080](http://0.0.0.0:8080),点击页面最上方的 `SAMPLES` 选项,即可查看 text 组件的展示文本。每一张小框都有一条浅绿色的横轴,拖动即可显示不同 step 的文本
在浏览器输入`http://127.0.0.1:8080`,即可查看图片数据
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/text-interface.png" width=800><br/>
图4. text 组件展示文本 <br/>
<img src="http://visualdl.bj.bcebos.com/images/image-static.png" width="90%"/>
</p>
### audio -- 音频播放组件
<a name="5"> audio</a> 为音频播放组件,在程序运行过程中,将音频数据传入 audio 组件,就可以在 VisualDL 的前端网页中直接播放或下载。
使用 audio 组件添加数据,需要先设定 LogWriter 对象的成员函数 `audio()`,即可结合 `start_sampling()`, `is_sample_taken()`, `set_sample()``finish_sample()` 这四个 audio 组件的成员函数来完成。这几个函数的定义和用法如下:
* LogWriter 对象的成员函数 `audio()`
```python
def audio(tag, num_samples, step_cycle)
```
> :param tag : 标签,结合 set_sample() 的参数 index,决定音频播放的子框。
> :param num_samples : 设置单个 step 的采样数,页面上的音频数目也等于 num_samples。
> :param step_cycle : 将 step_cycle 个 step 的数据存储到日志中,默认值为 1。
> :return: 函数返回一个 AudioWriter 对象。
* 开始新的采样周期 - 开辟一块内存空间,用于存放采样的数据:
```python
def start_sampling()
```
* 判断该音频是否应被采样,当返回值为 `-1`,表示不用采样,否则,应被采样:
```python
def is_sample_taken()
```
* 使用函数 `set_sample()` 添加音频数据:
```python
def set_sample(index, audio_params, audio_data)
```
> :param index : 索引号,结合 tag,决定音频播放的子框。
> :param audio_params : 音频的参数 [sample rate, sample width, channel],其中 sample rate 为采样率, sample width 为每一帧采样的字节数, channel 为通道数(单声道设为1,双声道设为2,四声道设为4,以此类推)。
> :param audio_data :音频数据,音频数据的格式一般为 numpy.ndarray,经 flatten() 后变为行向量。
* 结束当前的采样周期,将已采样的数据存到磁盘,并释放这一块内存空间:
```python
def finish_sample()
```
例7 audio 组件示例程序 [Github](https://github.com/PaddlePaddle/VisualDL/blob/develop/demo/component/audio-demo.py)
```python
# coding=utf-8
import numpy as np
import wave
from visualdl import LogWriter
### 功能操作说明
def read_audio_data(audio_path):
"""
读取音频数据
"""
CHUNK = 4096
f = wave.open(audio_path, "rb")
wavdata = []
chunk = f.readframes(CHUNK)
while chunk:
data = np.fromstring(chunk, dtype='uint8')
wavdata.extend(data)
chunk = f.readframes(CHUNK)
# 8k sample rate, 16bit frame, 1 channel
shape = [8000, 2, 1]
return shape, wavdata
# 创建一个 LogWriter 对象
log_writter = LogWriter("./log", sync_cycle=10)
# 创建 audio 组件,模式为 train
ns = 2
with log_writter.mode("train") as logger:
input_audio = logger.audio(tag="test", num_samples=ns)
# 一般要设定一个变量 audio_sample_num,用来记录当前已采样了几段 audio 数据
audio_sample_num = 0
for step in range(9):
# 设置 start_sampling() 的条件,满足条件时,开始采样
if audio_sample_num == 0:
input_audio.start_sampling()
# 获取 idx
idx = input_audio.is_sample_taken()
# 如果 idx != -1,采样,否则跳过
if idx != -1:
# 读取数据,音频文件的格式可以为 .wav .mp3 等
audio_path = "test.wav"
audio_shape, audio_data = read_audio_data(audio_path)
# 使用 set_sample()函数添加数据
input_audio.set_sample(idx, audio_shape, audio_data)
audio_sample_num += 1
# 如果完成了当前轮的采样,则调用 finish_sample()
if audio_sample_num % ns ==0:
input_audio.finish_sampling()
audio_sample_num = 0
```
可搜索图片标签显示对应图片数据
运行上述程序后,在命令行中执行
<p align="center">
<img src="http://visualdl.bj.bcebos.com/images/image-search.png" width="90%"/>
</p>
```shell
visualdl --logdir ./log --host 0.0.0.0 --port 8080
```
接着在浏览器打开[http://0.0.0.0:8080](http://0.0.0.0:8080),点击页面最上方的 `SAMPLES` 选项,即有音频的小框,可以播放和下载。每一张小框中都有一条浅绿色的横轴,拖动即可选择不同 step 的音频段。
支持滑动Step/迭代次数查看不同迭代次数下的图片数据
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/audio-interface.png" width=800><br/>
图5. audio 组件播放音频 <br/>
<img src="http://visualdl.bj.bcebos.com/images/image-eye.gif" width="60%"/>
</p>
### high dimensional -- 数据降维组件
<a name="6">high dimensional</a> 组件的作用就是将数据映射到 2D/3D 空间来做可视化嵌入,这有利于了解不同数据的相关性。high dimensional 组件支持以下两种降维算法:
## High Dimensional -- 数据降维组件
* PCA : Principle Component Analysis 主成分分析
* [t-SNE](https://lvdmaaten.github.io/tsne/) : t-distributed stochastic neighbor embedding t-分布式随机领域嵌入
### 介绍
想使用 high dimensional 组件,只需先设定 LogWriter 对象的成员函数 `embedding()`,即可使用 `add_embeddings_with_word_dict()` 函数添加数据。这两个函数的定义及用法如下
High Dimensional 组件将高维数据进行降维展示,用于深入分析高维数据间的关系。目前支持以下两种降维算法
* LogWriter 对象的成员函数 `embedding()` 不需输入参数,函数返回一个 embeddingWriter 对象:
- PCA : Principle Component Analysis 主成分分析
- t-SNE : t-distributed stochastic neighbor embedding t-分布式随机领域嵌入
```python
def embedding()
```
### 记录接口
* high dimensional 的成员函数 `add_embeddings_with_word_dict()`
High Dimensional 组件的记录接口如下
```python
def add_embeddings_with_word_dict(data, Dict)
add_embeddings(tag, labels, hot_vectors, walltime=None)
```
接口参数说明如下:
|参数|格式|含义|
|-|-|-|
|tag|string|记录指标的标志,如`default`,不能含有`%`|
|labels|numpy.array 或 list|一维数组表示的标签,每个元素是一个string类型的字符串|
|hot_vectors|numpy.array or list|与labels一一对应,每个元素可以看作是某个标签的特征|
|walltime|int|记录数据的时间戳,默认为当前时间戳|
> :param data : 输入数据,数据类型为 List[List(float)]。
> :param Dict : 字典, 数据类型为 Dict[str, int]。
例8 high dimensional 组件示例程序 [Github](https://github.com/PaddlePaddle/VisualDL/blob/develop/demo/component/embedding-demo.py)
### Demo
下面展示了使用 High Dimensional 组件记录数据的示例,代码见[High Dimensional组件](../../demo/components/high_dimensional_test.py)
```python
# coding=utf-8
import numpy as np
from visualdl import LogWriter
# 创建一个 LogWriter 对象
log_writer = LogWriter("./log", sync_cycle=10)
# 创建一个 high dimensional 组件,模式设为 train
with log_writer.mode("train") as logger:
train_embedding = logger.embedding()
# 第一个参数为数据,数据类型为 List[List(float)]
hot_vectors = np.random.uniform(1, 2, size=(10, 3))
# 第二个参数为字典,数据类型为 Dict[str, int]
# 其中第一个分量为坐标点的名称, 第二个分量为该坐标对应原数据的第几行分量
word_dict = {
"label_1": 5,
"label_2": 4,
"label_3": 3,
"label_4": 2,
"label_5": 1,}
# 使用 add_embeddings_with_word_dict(data, Dict)
train_embedding.add_embeddings_with_word_dict(hot_vectors, word_dict)
```
运行上述程序后,在命令行中执行
if __name__ == '__main__':
hot_vectors = [
[1.3561076367500755, 1.3116267195134017, 1.6785401875616097],
[1.1039614644440658, 1.8891609992484688, 1.32030488587171],
[1.9924524852447711, 1.9358920727142739, 1.2124401279391606],
[1.4129542689796446, 1.7372166387197474, 1.7317806077076527],
[1.3913371800587777, 1.4684674577930312, 1.5214136352476377]]
```shell
visualdl --logdir ./log --host 0.0.0.0 --port 8080
labels = ["label_1", "label_2", "label_3", "label_4", "label_5"]
# 初始化一个记录器
with LogWriter(logdir="./log/high_dimensional_test/train") as writer:
# 将一组labels和对应的hot_vectors传入记录器进行记录
writer.add_embeddings(tag='default',
labels=labels,
hot_vectors=hot_vectors)
```
接着在浏览器打开[http://0.0.0.0:8080](http://0.0.0.0:8080),点击页面最上方的 `HIGHDIMENSIONAL` 选项,即可查看数据映射后的相对位置。
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/embedding-2D.png" width=800><br/>
图6. high dimensional 组件展示平面坐标 <br/>
</p>
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/embedding-3D.png" width=800><br/>
图7. high dimensional 组件展示直角坐标 <br/>
</p>
## graph -- 神经网络可视化组件
<a name="7">graph</a> 组件用于神经网络模型结构的可视化,该组件可以展示 Paddle 格式和 [ONNX](https://onnx.ai) 格式保存的模型。graph 组件可帮助用户理解神经网络的模型结构,也有助于排查神经网络的配置错误。
与其他需要记录数据的组件不同,使用 graph 组件的唯一要素就是指定模型文件的存放位置,即在 `visualdl` 命令中增加选项 `--model_pb` 来指定模型文件的存放路径,则可在前端看到相应效果。
例9 graph 组件示例程序(下面示例展示了如何用 Paddle 保存一个 Lenet-5 模型)[Github](https://github.com/PaddlePaddle/VisualDL/blob/develop/demo/component/graph-demo.py)
```python
# coding=utf-8
import paddle.fluid as fluid
def lenet_5(img):
'''
定义神经网络结构
'''
conv1 = fluid.nets.simple_img_conv_pool(
input=img,
filter_size=5,
num_filters=20,
pool_size=2,
pool_stride=2,
act="relu")
conv1_bn = fluid.layers.batch_norm(input=conv1)
conv2 = fluid.nets.simple_img_conv_pool(
input=conv1_bn,
filter_size=5,
num_filters=50,
pool_size=2,
pool_stride=2,
act="relu")
predition = fluid.layers.fc(input=conv2, size=10, act="softmax")
return predition
# 变量赋值
image = fluid.layers.data(name="img", shape=[1, 28, 28], dtype="float32")
predition = lenet_5(image)
place = fluid.CPUPlace()
exe = fluid.Executor(place=place)
exe.run(fluid.default_startup_program())
# 使用函数 save_inference_model() 保存 paddle 模型
fluid.io.save_inference_model(
"./paddle_lenet_5_model",
feeded_var_names=[image.name],
target_vars=[predition],
executor=exe)
```
运行上述程序后,在命令行中执行
运行上述程序后,在命令行执行
```shell
visualdl --logdir ./log --host 0.0.0.0 --port 8080 --model_pb paddle_lenet_5_model
visualdl --logdir ./log --port 8080
```
接着在浏览器打开[http://0.0.0.0:8080](http://0.0.0.0:8080),点击页面最上方的`GRAPHS`选项,即可查看 Lenet-5 的模型结构
接着在浏览器打开`http://127.0.0.1:8080`,即可查看降维后的可视化数据
<p align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/VisualDL/develop/demo/component/usage-interface/graph.png" width=800><br/>
图8. graph 组件展示 Lenet-5 的模型结构 <br/>
<img src="http://visualdl.bj.bcebos.com/images/dynamic_high_dimensional.gif" width="80%"/>
</p>
# 动态图机制-DyGraph
# 命令式编程模式(动态图)机制-DyGraph
PaddlePaddle的DyGraph模式是一种动态的图执行机制,可以立即执行结果,无需构建整个图。同时,和以往静态的执行计算图不同,DyGraph模式下您的所有操作可以立即获得执行结果,而不必等待所构建的计算图全部执行完成,这样可以让您更加直观地构建PaddlePaddle下的深度学习任务,以及进行模型的调试,同时还减少了大量用于构建静态计算图的代码,使得您编写、调试网络的过程变得更加便捷。
......@@ -6,9 +6,9 @@ PaddlePaddle DyGraph是一个更加灵活易用的模式,可提供:
* 更加灵活便捷的代码组织结构:使用python的执行控制流程和面向对象的模型设计
* 更加便捷的调试功能:直接使用python的打印方法即时打印所需要的结果,从而检查正在运行的模型结果便于测试更改
* 和静态执行图通用的模型代码:同样的模型代码可以使用更加便捷的DyGraph调试,执行,同时也支持使用原有的静态图模式执行
* 和静态执行图通用的模型代码:同样的模型代码可以使用更加便捷的DyGraph调试,执行,同时也支持使用原有的声明式编程模式(静态图)模式执行
有关的动态图机制更多的实际模型示例请参考[Paddle/models/dygraph](https://github.com/PaddlePaddle/models/tree/develop/dygraph)
有关的命令式编程模式机制更多的实际模型示例请参考[Paddle/models/dygraph](https://github.com/PaddlePaddle/models/tree/develop/dygraph)
## 设置和基本用法
......@@ -157,7 +157,7 @@ if __name__ == '__main__':
相反,只有当OP的所有输入都不需要梯度时,该OP的输出也不需要梯度。
在所有的 ``Variable`` 都不需要梯度的子图中,反向计算就不会进行计算了。
动态图模式下,除参数以外的所有 ``Variable````stop_gradient`` 属性默认值都为 ``True``,而参数的 ``stop_gradient`` 属性默认值为 ``False``
命令式编程模式模式下,除参数以外的所有 ``Variable````stop_gradient`` 属性默认值都为 ``True``,而参数的 ``stop_gradient`` 属性默认值为 ``False``
该属性用于自动剪枝,避免不必要的反向运算。
例如:
......@@ -495,7 +495,7 @@ with fluid.dygraph.guard(place):
print("epoch: {}, batch_id: {}, loss is: {}".format(epoch, batch_id, avg_loss.numpy()))
```
动态图单卡训练转多卡训练需要修改的地方主要有四处:
命令式编程模式单卡训练转多卡训练需要修改的地方主要有四处:
1. 需要从环境变量获取设备的ID,即:
```python
......@@ -528,7 +528,7 @@ with fluid.dygraph.guard(place):
mnist.apply_collective_grads()
```
Paddle动态图多进程多卡模型训练启动时需要指定使用的GPU,即如果使用`0,1,2,3`卡,启动方式如下:
Paddle命令式编程模式多进程多卡模型训练启动时需要指定使用的GPU,即如果使用`0,1,2,3`卡,启动方式如下:
```
python -m paddle.distributed.launch --selected_gpus=0,1,2,3 --log_dir ./mylog train.py
......@@ -606,7 +606,7 @@ Loss at epoch 0 step 0: [0.5767452]
## 模型参数的保存
动态图由于模型和优化器在不同的对象中存储,模型参数和优化器信息要分别存储。
命令式编程模式由于模型和优化器在不同的对象中存储,模型参数和优化器信息要分别存储。

在模型训练中可以使用 `paddle.fluid.dygraph.save_dygraph(state_dict, model_path)` 来保存模型参数的dict或优化器信息的dict。
......@@ -817,7 +817,7 @@ Inference result of image/infer_3.png is: 3
## 编写兼容的模型
以上一步中手写数字识别的例子为例,动态图的模型代码可以直接用于静态图中作为模型代码,执行时,直接使用PaddlePaddle静态图执行方式即可,这里以静态图中的`executor`为例, 模型代码可以直接使用之前的模型代码,执行时使用`Executor`执行即可
以上一步中手写数字识别的例子为例,命令式编程模式的模型代码可以直接用于声明式编程模式中作为模型代码,执行时,直接使用PaddlePaddle声明式编程模式执行方式即可,这里以声明式编程模式中的`executor`为例, 模型代码可以直接使用之前的模型代码,执行时使用`Executor`执行即可
```python
epoch_num = 1
......
......@@ -11,7 +11,7 @@
- `Operator <operator.html>`_ : Operator表示对数据的操作。
- `Program <program.html>`_ : Program表示对计算过程的描述。
- `Executor <executor.html>`_ : Executor表示执行引擎。
- `动态图机制-DyGraph <./dygraph/DyGraph.html>`_ : 介绍飞桨动态图执行机制。
- `命令式编程模式(动态图)机制-DyGraph <./dygraph/DyGraph.html>`_ : 介绍飞桨命令式编程模式执行机制。
.. toctree::
:hidden:
......
# 编程指南
目前飞桨(PaddlePaddle,以下简称Paddle)已经同时支持动态图和静态图两种编程方式,
本文主要侧重于介绍静态图的编程方法,关于动态图编程方法,请参考[动态图机制-DyGraph](../dygraph/DyGraph.html)
目前飞桨(PaddlePaddle,以下简称Paddle)已经同时支持命令式编程模式(动态图)和声明式编程模式(静态图)两种编程方式,
本文主要侧重于介绍声明式编程模式的编程方法,关于命令式编程模式编程方法,请参考[命令式编程模式机制-DyGraph](../dygraph/DyGraph.html)
阅读完本文档,您将了解在Paddle静态图编程方式中,如何表示和定义数据变量,以及如何完整的组建一个深度学习网络并进行训练。
阅读完本文档,您将了解在Paddle声明式编程模式编程方式中,如何表示和定义数据变量,以及如何完整的组建一个深度学习网络并进行训练。
## 数据的表示和定义
......@@ -38,7 +38,7 @@ data = fluid.layers.fill_constant(shape=[3, 4], value=16, dtype='int64')
以上例子中,我们只使用了一种数据类型"int64",即有符号64位整数数据类型,更多Paddle目前支持的数据类型请查看:[支持的数据类型](../../../advanced_guide/data_preparing/feeding_data.html#fluid)
需要注意的是,在静态图编程方式中,上述定义的Tensor并不具有值(即使创建常量的时候指定了value),
需要注意的是,在声明式编程模式编程方式中,上述定义的Tensor并不具有值(即使创建常量的时候指定了value),
它们仅表示将要执行的操作,在网络执行时(训练或者预测)才会进行真正的赋值操作,
如您直接打印上例代码中的data将会得对其信息的描述:
......@@ -166,7 +166,7 @@ print outs
## 组建更加复杂的网络
某些场景下,用户需要根据当前网络中的某些状态,来具体决定后续使用哪一种操作,或者重复执行某些操作。在动态图中,可以方便的使用Python的控制流语句(如for,if-else等)来进行条件判断,但是在静态图中,由于组网阶段并没有实际执行操作,也没有产生中间计算结果,因此无法使用Python的控制流语句来进行条件判断,为此静态图提供了多个控制流API来实现条件判断。这里以[fluid.layers.while_loop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api_cn/layers_cn/while_loop_cn.html)为例来说明如何在静态图中实现条件循环的操作。
某些场景下,用户需要根据当前网络中的某些状态,来具体决定后续使用哪一种操作,或者重复执行某些操作。在命令式编程模式中,可以方便的使用Python的控制流语句(如for,if-else等)来进行条件判断,但是在声明式编程模式中,由于组网阶段并没有实际执行操作,也没有产生中间计算结果,因此无法使用Python的控制流语句来进行条件判断,为此声明式编程模式提供了多个控制流API来实现条件判断。这里以[fluid.layers.while_loop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api_cn/layers_cn/while_loop_cn.html)为例来说明如何在声明式编程模式中实现条件循环的操作。
while_loop API用于实现类似while/for的循环控制功能,使用一个callable的方法cond作为参数来表示循环的条件,只要cond的返回值为True,while_loop就会循环执行循环体body(也是一个callable的方法),直到 cond 的返回值为False。对于while_loop API的详细定义和具体说明请参考文档[fluid.layers.while_loop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api_cn/layers_cn/while_loop_cn.html)
......@@ -180,7 +180,7 @@ while i < ten:
print('i =', i)
```
静态图中使用while_loop API实现以上代码的逻辑:
声明式编程模式中使用while_loop API实现以上代码的逻辑:
```python
# 该代码要求安装飞桨1.7+版本
......@@ -210,7 +210,7 @@ print(res) #[array([10])]
```
限于篇幅,上面仅仅用一个最简单的例子来说明如何在静态图中实现循环操作。循环操作在很多应用中都有着重要作用,比如NLP中常用的Transformer模型,在解码(生成)阶段的Beam Search算法中,需要使用循环操作来进行候选的选取与生成,可以参考[Transformer](https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/PaddleMT/transformer)模型的实现来进一步学习while_loop在复杂场景下的用法。
限于篇幅,上面仅仅用一个最简单的例子来说明如何在声明式编程模式中实现循环操作。循环操作在很多应用中都有着重要作用,比如NLP中常用的Transformer模型,在解码(生成)阶段的Beam Search算法中,需要使用循环操作来进行候选的选取与生成,可以参考[Transformer](https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/PaddleMT/transformer)模型的实现来进一步学习while_loop在复杂场景下的用法。
除while_loop之外,飞桨还提供fluid.layers.cond API来实现条件分支的操作,以及fluid.layers.switch_case和fluid.layers.case API来实现分支控制功能,具体用法请参考文档:[cond](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api_cn/layers_cn/cond_cn.html)[switch_case](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api_cn/layers_cn/switch_case_cn.html)[case](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api_cn/layers_cn/case_cn.html#case)
......@@ -218,7 +218,7 @@ print(res) #[array([10])]
一个典型的模型通常包含4个部分,分别是:输入数据定义,搭建网络(模型前向计算逻辑),定义损失函数,以及选择优化算法。
下面我们通过一个非常简单的数据预测网络(线性回归),来完整的展示如何使用Paddle静态图方式完成一个深度学习模型的组建和训练。
下面我们通过一个非常简单的数据预测网络(线性回归),来完整的展示如何使用Paddle声明式编程模式方式完成一个深度学习模型的组建和训练。
问题描述:给定一组数据 $<X,Y>$,求解出函数 $f$,使得 $y=f(x)$,其中$X$,$Y$均为一维张量。最终网络可以依据输入$x$,准确预测出$y_{\_predict}$。
......
......@@ -32,7 +32,7 @@ Paddle 为大部分常见的神经网络基本计算模块都提供了封装。
**2. 占位 Variable**
静态图模式下,组网的时候通常不知道实际输入的信息,此刻需要一个占位的 :code:`Variable`,表示一个待提供输入的 :code:`Variable`
声明式编程模式(静态图)模式下,组网的时候通常不知道实际输入的信息,此刻需要一个占位的 :code:`Variable`,表示一个待提供输入的 :code:`Variable`
Paddle 中使用 :code:`fluid.data` 来接收输入数据, :code:`fluid.data` 需要提供输入 Tensor 的形状信息,当遇到无法确定的维度时,相应维度指定为 None ,如下面的代码片段所示:
......
# Release Notes

# Release Note
## 重要更新
本版本对框架功能层面进行了重点增强,预测部署能力全面提升,分布式训练发布PLSC支持超大规模分类,并对参数服务器模式进行优化整合。对编译选项、编译依赖以及代码库进行了全面清理优化。模型库持续完善,优化了整体层次结构,增加了动态图模型实现。端到端开发套件和工具组件进一步完善。
**训练框架**:增加自动混合精度训练AMP接口和新控制流接口;优化Tensor使用方式和显存分配策略;新增支持Nvidia DALI GPU数据预处理库;持续优化基础OP的功能和性能;动态图的功能进一步完善,性能大幅提升,对data independent的动态图模型提供转为静态图可预测部署模型的功能;框架调试分析功能和易用性全面提升。
**预测部署**:服务器端预测库的Python API大幅优化,新增R语言、Go语言调用预测库的使用方法和示例,强化了量化支持能力;Paddle Lite支持无校准数据的训练后量化方法生成的模型,加强对OpenCL的支持,支持昆仑XPU的预测;模型压缩库PaddleSlim重构裁剪、量化、蒸馏、搜索接口,与模型库充分打通,新增大规模可扩展知识蒸馏框架 Pantheon。
**分布式训练**:参数服务器模式下针对transpiler半异步、全异步、GEO三种模式,后端实现上统一到communicator中,前端接口统一到fleet中,通过fleet strategy灵活选择不同模式;发布大规模分类库PLSC,通过模型并行支持超多类别的分类任务。
**基础模型库**:发布语音合成库Parakeet,包括多个前沿合成算法;PaddleCV新增14个图像分类预训练模型,3D和跟踪方向模型持续丰富;PaddleNLP的分词和词性标注模型支持jieba分词;PaddleRec增加多任务模型MMoE。模型库整体增加了广泛的动态图模型实现。模型库整体层次结构做了调整优化。
**端到端开发套件**:PaddleDetection和PaddleSeg新增大量模型实现及预训练模型,典型模型的训练速度和精度提升,模型压缩和部署能力大幅提升,使用体验全面优化。发布ElasticRec推荐排序系统,通过K8S进行部署,支持流式训练和在线预测服务。
**工具组件**:PaddleHub新增52个预训练模型,总数超过100,功能和体验持续优化;多任务学习框架PALM升级内核,开放API调用,支持更多的任务类型;联邦学习PaddleFL新增公开数据集。深度强化学习框架PARL和飞桨图学习框架PGL也对应版本升级,支持更多功能,开放更多算法和基线。
## 训练框架
- API
- 增加自动混合精度训练AMP接口:能以通用的方式把一个网络转成混合精度训练,同时保证精度波动在正常范围内
- 增加新的控制流接口并推荐使用:新增while_loop(循环控制功能)、cond(条件分支功能)、case和switch_case(分支控制功能)4个控制流OP,更加易用,且支持如下新增功能:
- 支持使用python callable作为控制条件或执行体
- 支持控制流中的不同分支使用不同loss或optimizer
- 支持控制流中的condition部分使用CPU数据或GPU数据
- 部分API参数支持使用变量列表:针对部分API的parameter_list或no_grad_set参数只支持使用字符串列表的情况,增加对变量列表的支持,使用如下API时不再需要提前获取相关变量的name属性:
- fluid.backward.append_backward(loss, parameter_list=None, no_grad_set=None, callbacks=None)
- fluid.backward.gradients(targets, inputs, target_gradients=None, no_grad_set=None)
- 各种Optimizer的minimize方法,如Adam的minimize:minimize(loss, startup_program=None, parameter_list=None, no_grad_set=None, grad_clip=None)
- 基础功能优化
- 支持使用numpy的float16类型设置Tensor数据,无需先转换为uint16类型。
- 支持直接使用负号,得到Tensor的相反数。
- 显存分配策略:
- 默认策略变为AutoGrowth:在不影响训练速度的情况下,按需申请显存。规避之前的默认显存预分配策略下难以在同一张GPU卡上再起新任务的问题。
- 多卡任务显存分配调整:将不同GPU卡上的显存分配器设置为Lazy初始化的方式。若用户不使用某张卡,则不会在该卡上申请显存。避免当其他GPU卡上有显存占用时,在空闲GPU卡上跑任务若不设置CUDA_VISIBLE_DEVICES导致显存OOM的问题。
- OP功能升级
- elu:该激活函数支持计算二阶梯度。
- prroi_pool:rois参数可以接受Tensor或LoDTensor类型。
- conv2d,pool2d,batch_norm,lrn:反向计算全部支持使用MKL-DNN高性能计算库。
- argsort:支持降序排序(新增descending参数,默认值为False)。
- 基础性能优化
- DALI预处理加速
- 增加对Nvidia DALI GPU数据预处理库的支持,可用于加速图片,视频,语音等数据预处理。
- 自动混合精度训练优化
- 实现如下优化策略,并配合DALI数据预处理,ResNet50模型训练吞吐大幅提升:V100单卡混合精度训练吞吐从600+ images/sec提升到1000+ images/sec;单机8卡吞吐达到7840 image/sec,4机32卡吞吐达到28594 images/sec。
- 增加batch_norm和conv2d等op对NHWC数据布局输入的支持,以使用Tensor Core加速fp16计算或减少访存耗时。
- 基于IR Pass机制对模型中的部分op pattern进行融合,如batch_norm和relu等。
- 优化elementwise(add,mul)等op的计算kernel。
- 优化RecomputeOptimizer提升batchsize, 在Bert-large模型上最大batchsize比不使用RecomputeOptimizer增大533.62%,比上一版本提升一倍。
- OP性能优化
- 实现embedding和sequence_pool的融合算子fuse_emb_seq_pool,优化bloom_filter中的murmurhash3_x64_128,有效提升部分NLP模型的训练速度。
- 优化了mean op的GPU性能,输入数据为32 * 32 * 8 * 8的Tensor时,前向计算速度提升2.7倍。
- 优化assign、lod_reset op,避免不需要的显存拷贝和data transform。
- 优化了stack OP的kernel实现,XLnet/Ernie模型GPU单卡性能提升4.1%。
- 动态图
- 功能优化
- 移除了动态图Layers 中的 name_scope 参数,使得用户更方便继承和调用。
- 移除to_variable接口中的block参数,简化了API的使用。
- 针对模型参数依赖数据的问题,移除了 build_once设计,使得Layers在 **init** 执行完成之后就可以获取到所有的参数表,方便save load、参数初始化、参数debug、参数优化等。
- 完善自动剪枝,方便用户组网并减少反向计算量。
- 支持 SelectedRows 操作,使 Embedding 层支持单卡的稀疏更新。
- 针对框架缺少容器类的问题,新增ParameterList、LayerList、Sequencial功能,方便用户组网。
- 支持named_sublayers、named_parameters功能,方便用户编程。
- 支持Linear lr warmup decay策略。
- 性能优化
- 优化了python 与c++ 交互,GradMaker、OperatorBase、allocator等。基于LSTM的语言模型任务在P40机器上性能提升提升270%。
- 针对optimize中多次调用optimized_guard无用代码导致的性能问题,移除了冗余代码。Transformer模型(batch_size=64)在P40机器上,SGD、Adam等优化器有5%~8%%的性能提升。
- 针对AdamOptimizer中额外添加scale_op更新beta参数对性能的影响,将beta更新逻辑融合到adam_op中,减少op kernel调用开销。Dialogue-PLATO模型P40机器上性能提升9.67%。
- 优化动态图异步DataLoader,对于Mnist、ResNet等CV模型任务在P40机器上单卡训练速度提升超过40%。
- 新增numpy bridge功能,支持在cpu模式下Tensor和ndarray之间共享底层数据,避免创建Variable时numpy输入需要拷贝的问题,提升效率。
- 显存优化:提前删除反向不需要Tensor Buffer的前向变量空间的优化策略,在ResNet等模型上最大batch size提升20%-30%以上。
- 动态图部署
- 支持TracedLayer接口,实现 data independent的动态图模型转为静态图可预测部署的模型。
- 调试分析
- 报错信息优化 :对框架报错信息整体归类,实现报错信息的体系化,同时完成文案优化,帮助用户更快速、准确的定位和解决问题。
- 优化性能分析profile 功能
- 增强profiler的功能和准确性,支持不同级别的profile选项,能够在profile数据中记录事件的调用关系并打印出来。
- 优化nan inf检查调试(通过FLAGS_check_nan_inf生效),性能、功能及输出信息均有较大提升:
- 速度上,v100测试ResNet50模型相比原工具组件约有1000倍性能提升,保持正常训练80%以上的效率。
- 功能上,增加fp16的支持,可设置环境变量跳过op、op_role、op_var的检查,方便fp16模型的调试。
- 输出信息更加翔实,除出错的op及tensor名称外,还会打印出错的nan、inf及正常数值的数量以便于调试。
- 发布cpu训练和预测的轻量级安装包paddlepaddle-tiny,支持window/linux/Mac操作系统以及python27/python35/python36/python37:
- 编译选项:no avx, no ml, no gpu, no unittest
- 裁剪掉slim和部分dataset。
- linux包体积从90M减小到37M;windows包体积从50.8M减小到9.6M;mac包体积从59M减小到19.8M。
- 安装requirements依赖从15个减小到7个。
## 预测部署
- 服务器端预测库
- Python API
- 支持从内存读写模型,以满足模型加密的需求。
- 不再在预测模型最后添加 Scale 算子。
- 新增ZeroCopy API,与C++接口基本一致,支持以numpy.ndarray作为输入和输出,在Python端使用更加方便。
- 在AnalysisConfig中增加多个接口,完整覆盖C++预测的功能,包括删除pass、禁用预测glog等。
- 其他编程语言的支持
- 新增R语言、Go语言的预测API,并增加相关的使用方法和示例
- 对外提供 ProtoBuf 对应的头文件,方便用户解析模型结构的需求。
- 带TRT编译的预测库不再从thrid_party中提供TensorRT库,需要用户自行到https://developer.nvidia.com/tensorrt 下载
- 功能增强:
- 打通Paddle Lite以子图方式接入,已验证 ResNet50。
- 新增MKL-DNN FC INT8 kernel的支持
- Paddle-TensorRT支持Ernie模型,Ernie模型(seq length=128) 在T4卡上fp16预测速度为3.6ms, 比fp32加速37%。
- 量化:ERNIE INT8精度相比于FP32 精度略有下降,但其在第二代至强可扩展平台6271上单线程性能优化提升2.70倍,多线程性能提升1.79倍
- 移动/嵌入式端[Paddle Lite](https://github.com/PaddlePaddle/Paddle-Lite)
- 对应发布v2.3版本。
- model_optimize_tool多项功能升级。
- 支持“无校准数据的训练后量化方法”,模型存储空间可减少2~4倍。
- OpenCL:完成30个Image2D Kernel迁移,涵盖14个OP。
- 对FPGA、NPU的支持进一步加强;支持昆仑XPU的预测。
- 发布全新官网文档;新增“无校准数据的训练后量化方法”使用文档。
- [Paddle Serving](https://github.com/PaddlePaddle/Serving)
- 发布bert类语义理解模型的远程文本向量表示预测服务。
- 发布了paddle-gpu-serving whl包,通过pip安装和Python代码即可部署和使用预测服务;
- 支持Paddlehub中的13种语义理解模型,支持单机多卡,使用Ernie_tiny模型在单张P4 GPU下平均样本长度为7时预测速度为869.56样本每秒。
- [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim)
- 拆分PaddleSlim为独立repo。
- 重构裁剪、量化、蒸馏、搜索接口,对用户开放底层接口。
- 量化:
- 新增基于KL散度的离线量化功能,支持对Embedding层量化。
- 新增对FC的QAT MKL-DNN量化策略支持
- 新增PostTrainingQuantization,完整实现训练后量化功能:支持量化30种OP,支持灵活设置需要量化的OP。
- 量化训练支持设定需要量化的OP类型。
- 裁剪: 重构剪裁实现,方便扩展支持更多类型的网络。
- 网络结构搜索:
- 支持SA搜索,增加更多的搜索空间,支持用户自定义搜索空间。
- 新增one-shot搜索算法,搜索速度比上个版本快20倍。
- 新增大规模可扩展知识蒸馏框架 Pantheon
- student 与 teacher 、teacher与 teacher 模型之间充分解耦,可分别独立运行在不同的物理设备上,便于充分利用计算资源;
- 支持 teacher 模型的单节点多设备大规模预测,在 BERT 等复杂模型上测试加速比达到线性;
- 用 TCP/IP 协议实现在线蒸馏模式的通信,支持在同一网络环境下,运行在任意两个物理设备上的 teacher 模型和 student 模型之间进行知识传输;
- 统一在线和离线两种蒸馏模式的 API 接口,不同的 teacher 模型可以工作在不同的模式下;
- 在 student 端自动完成知识的归并与知识数据的 batch 重组,便于多 teacher 模型的知识融合。
- 模型库:
- 发布ResNet50、MobileNet模型的压缩benchmark
- 打通检测库,并发布YOLOv3系列模型的压缩benchmark
- 打通分割库,并发布Deepabv3+系列分割模型的压缩benchmark
- 完善文档:
- 补充API文档;新增入门教程和高级教程;增加ModelZoo文档,覆盖分类、检测、分割任务。所有文档包含中、英文。
## 分布式
- 参数服务器模式:
- 大幅降低训练过程中的内存占用,在1亿规模embedding任务上,Trainer端内存可以降低90%
- 大幅降低分布式保存模型、加载模型的内存占用, Pserver端内存峰值最大可降低为原先的$1/N,N$为Pserver节点个数。
- 优化GEO模式 稠密参数通信
- 支持分布式AUC指标计算
- 新增分布式Barrier功能
- 非Fleet的transpiler API加入过期警示, 该API计划在下一个版本中移除
- Communicator加入半异步模式
- TrainFromDataset训练接口支持半异步模式
- Fleet加入DistributedStrategy, 进一步提升分布式易用性, 整合目前分布式相关FLAG
- Fleet pslib模式支持一个program多loss训练,优化训练性能
- 千亿稀疏模式支持k8s环境。
- [大规模分类库PLSC](https://github.com/PaddlePaddle/PLSC):支持受限于显存容量数据并行无法处理的大规模分类问题
- 内建ResNet50、ResNet101和ResNet152三种模型,并支持自定义模型;单机8张V100 GPU配置下,ResNet50模型百万类别训练速度2,122.56 images/s,相比标准ResNet50模型加速倍1.3倍;
- 发布模型在线预测服务plsc-serving whl包,预测人脸识别模型的图片语义向量表示,支持使用用户训练的模型进行预测。ResNet50模型(batch size=256)在单张V100 GPU下预测速度为523.47 images/s;
- 发布基于ResNet50网络和MS1M-ArcFace数据集的预训练模型:https://plsc.bj.bcebos.com/pretrained_model/resnet50_distarcface_ms1mv2.tar.gz。
- 发布ResNet50混合精度训练benchmark(单卡、多卡、多机)。
## 基础模型库
- [模型库地址](https://github.com/PaddlePaddle/models)
- PaddleNLP
- seq2seq支持RL和GAN等训练模式
- 发布分词和词性标注训练模型,利用知识蒸馏框架 Pantheon,在自有数据集上比PaddleNLP上LAC上F1值提升1%;合入jieba分词,通过加入use_paddle标签来开启深度学习模型模式;并在在jieba加入paddle版本检测和回退机制,保障用户体验。
- 增加动态图模型实现:word2vec、senta、transformer、bert、seq2seq、LAC。
- PaddleSpeech
- 发布语音合成库Parakeet (Paddle PARAllel text-to-speech toolkit)
- 实现语音合成模型数据预处理、训练和合成等的标准工作流
- 提供对常见数据集的开箱即用的预处理实现
- 提供语音合成领域常用模型组件,为实现模型提供支持
- 发布语音合成模型 DeepVoice3、ClarinNet 、TransformerTTS、FastSpeech、WaveNet、WaveFlow
- PaddleCV
- 图像分类:
- 新增预训练模型SENet-vd、Res2Net、HRNet系列模型总共14个:
- SE_ResNet18_vd,SE_ResNet34_vd,SE_ResNeXt50_vd_32x4d,ResNeXt152_vd_32x4d
- Res2Net50_26w_4s,Res2Net50_14w_8s,Res2Net50_vd_26w_4s
- HRNet_W18_C,HRNet_W30_C,HRNet_W32_C,HRNet_W40_C,HRNet_W44_C,HRNet_W48_C,HRNet_W64_C
- 支持使用DALI加速数据预处理,在ImageNet训练上获得1.5倍(ResNet50) 至3倍以上(ShuffleNet)加速,并大幅提升GPU利用率。
- 3D方向:
- 发布模型PointNet++、PointRCNN。
- 跟踪模型库 :
- 发布模型SiamFC、ATOM。
- 增加动态图模型实现: MobileNet-v1/v2、YOLOv3、FasterRCNN、MaskRCNN、视频分类TSM模型、视频动作定位BMN模型。
- PaddleRec
- 发布推荐领域多任务模型MMoE, 适用于工业界大规模多任务联合训练。
- 增加动态图模型实现:gru4rec、deepfm。
## 端到端开发套件
- [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection)
- 进一步提升YOLOv3模型精度,COCO数据上精度达到43.2%,相比上个版本绝对提升1.4%。
- 新增模型实现及预训练模型:
- 新增Google AI Open Images 2019-Object Detction比赛中的最佳单模型CascadeCARCNN-FPN-Dcnv2-Nonlocal ResNet200-vd,同时也发布此算法基于Objects365数据的预训练模型。
- 新增backbone为CBResNet、Res2Net、HRNet的系列预训练模型。
- 新增LibraRCNN算法及预训练模型。
- FasterRCNN R50 FPN模型新增基于GIoU、DIoU、CIoU loss的预训练模型,不降低预测速度的情况下,在COCO数据上精度分别提升1.1%,0.9%,1.3%。
- 新增模块:
- 主干网络: 新增CBResNet、Res2Net、HRNet。
- Loss模块: 新增GIoU loss、 DIoU loss、CIoU loss,以及Libra loss,YOLOv3的loss支持细粒度op组合。
- 后处理模块: 新增softnms,DIOU nms模块。
- 正则模块: 新增DropBlock模块。
- 功能优化和改进:
- 加速YOLOv3数据预处理,整体训练提速40%。
- 优化数据预处理逻辑。
- 增加人脸检测预测benchmark数据。
- 增加Paddle预测库Python API下的预测示例。
- 检测模型压缩:
- 裁剪: 发布MobileNet-YOLOv3裁剪方案和模型,在VOC数据集上FLOPs - 69.6%, mAP + 1.4%,在COCO数据集上FLOPS-28.8%, mAP + 0.9%; 发布ResNet50vd-dcn-YOLOv3裁剪方案和模型,在COCO数据集上FLOPS - 18.4%, mAP + 0.8%。
- 蒸馏: 发布MobileNet-YOLOv3蒸馏方案和模型,在VOC数据上mAP + 2.8%,在COCO数据上mAP + 2.1%。
- 量化: 发布YOLOv3和BlazeFace的量化模型。
- 裁剪+蒸馏: 发布MobileNet-YOLOv3裁剪+蒸馏方案和模型,在COCO数据集上FLOPS - 69.6%,GPU下预测加速64.5%,mAP - 0.3 %; 发布ResNet50vd-dcn-YOLOv3裁剪+蒸馏方案和模型,基于COCO数据FLOPS - 43.7%,GPU下预测加速24.0%,mAP + 0.6 %。
- 搜索: 开源BlazeFace-Nas的完整搜索方案。
- 预测部署:
- 适配Paddle预测库对TensorRT的支持、对FP16精度的支持。
- 文档:
- 新增数据预处理模块介绍文档、实现自定义数据Reader的文档。
- 新增如何新增算法模型的文档。
- 文档部署到网站: https://paddledetection.readthedocs.io/zh/latest/
- [PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg)
- 新增模型
- 适用于车道线分割场景的LaneNet模型。
- 轻量级Fast-SCNN模型。
- 适用于高精度场景的HRNet语义分割模型 。
- 发布基于PaddleSlim的多种模型压缩方案:
- 基于Cityscapes的Fast-SCNN裁剪方案和模型。
- 基于Cityscapes的Deeplabv3p-Xception和Deeplabv3p-MobilenetV2蒸馏方案。
- 基于Cityscapes的Deeplabv3p-MobilenetV2搜索方案。
- 基于Cityscapes的Deeplabv3p-Mobilenet量化方案和模型。
- 预测部署能力提升
- 新增Python轻量级部署。
- 新增对 FP16、Int8量化模型的TensorRT预测加速支持。
- 新增DeepLabv3p-MobileNetV2的人像分割Paddle-Lite移动端部署教程和案例。
- 优化模型导出环节,支持图像预处理和后处理的GPU化,性能提升10%~20%。
- 提供U-Net, ICNet, PSPNet, DeepLabv3+等模型的在不同尺寸图像的预测性能Benchmark,便于用户根据性能进行模型选型。
- 体验优化
- 新增学习率warmup功能,支持与不同的学习率Decay策略配合使用,提升Fine-tuning的稳定性。
- 支持对标注图使用伪彩色图像格式的保存,提升标注图片的预览体验。
- 新增自动保存mIoU最优模型的功能。
- 全面优化文档逻辑,提供如工业质检、眼底筛查等工业场景的AIStudio实战教程。
- [ElasticRec](https://github.com/PaddlePaddle/ElasticRec)
- 发布了ElasticRec推荐排序系统,通过K8S进行部署,支持流式训练和在线预测服务。
本版本深度优化了命令式编程模式(动态图)的功能、性能和体验,框架基础功能也进一步强化;原生推理库性能显著优化,轻量化推理引擎PaddleLite实现了对硬件支持的极大覆盖,PaddleServing全面升级,提供功能强大简单易用的服务化部署能力。对应的开发套件和工具组件进一步丰富完善,既有套件组件的功能和体验持续提升,全新发布PaddleClas视觉分类套件和量桨Paddle Quantum量子机器学习框架。
**训练框架** :深度优化了命令式编程(动态图)功能、性能和体验,特别是增强了动静转换的能力,能支持依赖数据的控制流的动态图实现进行静态存储部署,也可以转为静态图模式训练;Data Loader的功能和梯度裁剪的使用方式进一步优化;声明式编程模式下多卡运行时fetch不定长Tensor等问题得到解决,混合精度配合重计算显示出支持大Batch训练很好的成效。新增了大量API,并新增 ComplexVariable,支持复数张量的表示和常见的复数运算。
**预测部署** :Paddle inference 新增CUDA下多线程多流支持、TRT子图对动态shape输入的支持,强化量化推理,性能显著优化;Paddle Serving 全面升级,功能完善,易用性显著提升;Paddle Lite进一步优化编译安装体验,全面提升对支持芯片的覆盖度(包括RK、MTK、百度昆仑、寒武纪、比特大陆、华为NPU等等)以及对应的模型数量和性能;PaddleSlim量化、裁剪和NAS功能持续强化;新增Paddle.js发布,Paddle.js是国内首个开源JavaScript深度学习前端推理引擎,可以帮助用户实现网页端深度学习模型部署,搭建如小程序、网页游戏互动、美妆、试装等应用;
**开发套件** :全新发布PaddleClas,包含23个图像分类网络实现,117个图像预训练模型,并添加了数据增广、SSLD蒸馏等辅助策略,以及特色应用案例;PaddleSeg人像分割系列模型全面升级,新增多种遥感相关的策略方案;PaddleDetection、PaddleOCR和语音合成套件Parakeet算法覆盖更全面,速度显著提升。
**工具组件** :PaddleHub新增包括一系列视觉预训练模型在内更多的模型,BERT类预训练模型支持动态图模式下的一键加载; PaddleFL发布1.0版本,开源基于Mulit-party Computation (MPC)的联邦学习,支持横向、纵向等多个联邦学习场景;PGL发布业界首个结合语义信息与结构信息的图神经网络模型ERNIESage;PARL开源工业界首个进化学习应用框架Evokit;全新发布量子机器学习框架量桨Paddle Quantum。
## 基础框架
### 新增API
- 新增`fluid.device_guard`:设置OP的运行设备为CPU或者GPU。
- 新增 `fluid.enable_dygraph``fluid.disable_dygraph` 接口,支持函数式启动关闭动态图模式,相对`with fluid.dygraph.guard()`的方式减少代码缩进。
- 在fluid.dygraph目录新增4个API(具体定义见文档): BCELoss, L1Loss, MSELoss, NLLLoss, InstanceNorm
- 在fluid.layers目录新增30个API(具体定义见文档): addmm, allclose, arange, bmm, clamp, cross, diag_embed, dist, dot, elementwise_equal, flip, full, full_like, index_select, interpolate, log1p, log_softmax, logsumexp, meshgrid, nonzero, randint, randn, randperm, resize_bicubic, resize_linear, roll, t, tril, triu
### 功能优化
- 命令式编程模式(动态图):
- 增强动转静的功能,新增了基于语法解析转换的ProgramTranslator,支持依赖数据的控制流的动态图模型进行部署;同时支持将动态图模型转换为静态图模型进行训练,提升RNN等任务的训练性能。
- 重构动态图的变量生命周期管理机制,保证在train模式下不调用var.backward()接口也能正确地释放内存/显存资源。
- 新增动态图下的double grad功能,支持依赖梯度惩罚的GAN模型训练。
- 针对动态图下`no_grad`只能通过装饰器的方式使用的问题,新增了支持context manager使用方式,更方便动态图无梯度操作的代码编写。
- 为了方便单独设置batchnorm和dropout两个op的train/eval模式设置,将train/eval模式信息从全局设置,变成Layer内部设置;新增Layer形式的Dropout,记录模式信息。
- 支持 `cond` `switch` `while_loop` 控制流接口和 tensor array 的读写也可在动态图下使用 ,便于高层API的统一。
- 修改if var在动态图模式下的行为,按var中的值进行判断,解决动态图模式下 if x > y 行为与预期不符的问题;并支持将var转换为float/long/int/len/index的功能,提动态图升易用性。
- 针对任务中强依赖hook的功能,新增Layer的forward pre-hook和forward post-hook接口,可以在不改变网络输入输出的结构的情况下方便地获取、改变网络中间层变量的值,提升动态图易用性。
- 支持cudnn algorithm cache可以在动态图模式下生效,在waveflow模型上性能提升200%。
- 声明式编程模式(静态图):
- 执行器支持根据feed和fetch变量在运行时自动裁剪网络,去掉与当前feed和fetch无关的部分,提升运行效率,支持多任务学习网络。
- 优化反向传播过程,对本身无需反向传播的变量进行自动裁剪,不再需要组网时对变量显式设置stop_gradient=True。
- 执行器支持多卡运行时fetch不定长Tensor的功能,对使用不定长数据的任务(如NLP类部分任务等)提供更好的支持。
- 解决单进程多卡预测阶段会丢弃尾部不足卡数的部分数据的问题,可以在DataLoader中设置drop_last=False来避免丢弃尾部数据。
- 增加混合精度(AMP)与重计算(Recompute)配合的机制,在Bert-large模型上配合使用二者,最大batch size提升400%,吞吐提升17.5%~31.4%;
- DataLoader:
- 新增多进程模式加速数据读取,对于Map-style类型的数据集,用户可以通过实现自定义Dataset和BatchSampler的方式来提高数据读取性能,对于数据读取量大及预处理复杂的任务速度提升明显,如在视频分类TSM模型上,使用多进程读取模式,在声明式编程模式(“静态图”)下训练性能提升419%,命令式编程模式(“动态图”)下训练性能提升89.6%。
- 梯度裁剪使用方式:
- 裁剪类型统一由optimizer的grad_clip参数传入,支持全局参数裁剪和部分参数裁剪功能,原有set_gradient_clip接口不再推荐使用,并可能在后续版本中删除。同时,ParamAttr中取消了grad_clip参数(不兼容升级),无法再通过ParamAttr对单个参数进行梯度裁剪,对部分参数进行梯度裁剪的功能统一通过上述新接口实现。
- 动态图、静态图以及高层API支持一致的Collective Operators调用。
- Intel对Ngraph停止维护,移除NGraph库相关代码。
- 移除所有MKL-DNN相关op中未使用的或者不兼容的属性,如`is_test`属性。
- 新增对复数计算的支持:
- 新增 ComplexVariable,支持复数张量的表示和常见的复数运算,包括四则基本运算、matmul、kron product、reshape、transpose 等;
- 性能分析工具(Profiler)功能升级:
- 支持按照事件之间的嵌套调用关系,分层次统计和打印Profile结果。
- 添加tracer_option参数,可配置为`Default``OpDetail``AllOpDetail`,支持用户选择不同程度的计时和分析对象。
- 添加对框架开销、GpuMemcpy操作的统计功能。
- 报错信息全面优化
- 累计优化数千条表意不清的报错信息,规范错误类型及错误描述。
- 自动检测某些用户易错操作,给出明确的报错信息。
- 优化GPU相关API报错信息,将不可读的错误代码转换为具体信息,与NVIDIA官网信息保持同步。
### 性能优化
- 命令式编程模式(“动态图”):
- 为降低框架overhead, 优化自动生成的OP函数的数据结构,ptb lm模型任务单卡训练速度提升4%。
- 为降低框架overhead, 优化InferVarType接口设计,提升了InferVarType的速度,ptb lm模型任务训练速度提升超5%。
- 为降低框架overhead, 减少了动态图op中非必要attribute的添加,在ptb lm模型训练任务上速度提升4%
- 为提升数据加载性能,实现Tensor申请共享内存存储及Tensor序列化与反序列化机制,支持进程间传输Tensor,优化原动态图异步DataLoader性能,ResNet模型任务在P40机器上单卡训练速度进一步提升超15%
- 优化了动态图 Variable slice 的性能,性能提升60%,并支持slice中step为负数。
- 声明式编程模式(“静态图”):
- 新增自动融合功能,支持将elementwise类、activation类、sum、cast、scale、fill_constant等逐元素计算类型的算子组成的子图进行融合,性能提升幅度依赖于在网络中匹配到的相关子图数量,目前对RNN语言模型训练速度有大幅提升。
- OP性能优化:
- OP的执行过程增加对Prepare Data的缓存,在10+模型训练任务上平均加速2%,框架开销最高减少6%。
- 优化depthwise_conv2d的GPU性能,常用参数设置下加速20%。
- 优化elementwise_mul的GPU广播模式的实现,针对不同输入可加速2~50倍。
- 优化conv2d_transpose的GPU实现,针对fp16有显著性能提升。
- 优化shape OP实现,避免在不同设备间的不必要数据传输而引起的等待。
#### Bug修复
- 修复当数据量很大时,SGD报错`Xbyak::Error`的问题, 使得支持SGD大数据量可以成功运行。
- 修复Linux版本下MKL内存泄漏的问题。
- 修复动态图多卡启动时命令行参数解析的bug。
- 修复clone(for_test=True)接口处理含控制流op的网络时的问题。
- 修复动态图模块和静态图模块环依赖。
- 修正 python 2 & 3 之间 pickle dump/load 的兼容性问题。
- 修复动态图Layer不能注册或覆盖参数为None的问题。
- 修复不同Op name属性值相同时造成的Op输出Var命名冲突的问题。
- 修正concat op在axis=0时输出的LoD设置,应为输入LoD的拼接。
- 修复BatchNorm在eval模式下无法更新的mean和var的bug。
## 推理部署
### Paddle Inference
#### 功能升级
- 新增TRT子图对动态shape输入的支持, 新加`config.SetTRTDynamicShapeInfo(min_input_shape, max_input_shape, opt_input_shape)`接口。此接口用来指定子图的输入的最小,最大,最优的shape信息(最优shape表示,TRT会在此shape选择运行时最优kernel)。指定shape信息后,Paddle-TRT运行期间会使用Dynamic shape模式,预测期间支持`min_input_shape``max_input_shape`间的任意shape的输入。该功能支持包括FCN,Faster RCNN,Ernie/Bert等动态shape输入的模型。
- 为满足用户预测时将计算流绑定在当前线程上的需求,重构了设备上下文数据结构支持 CUDA 计算流优先级,并增加一个线程本地的显存分配器 ThreadLocalAllocator。具备不同线程绑定不同 CUDA 流的能力。
- MKL-DNN 量化功能全面支持所有量化模型,新增支持'weight_quantize_type'为range_abs_max和'channel_wise_abs_max',支持out_threshold属性。
- 新增官网推理API reference
#### 性能优化
- CUDA Bert/Ernie针对性的优化, 添加了 `embedding_eltwise_layernorm` 融合实现,优化了 `multihead_matmul``fc_elementwise_layernorm` 融合实现。相比上一版本,P4卡,cuda10,batch_size=1下,ernie fp32预测从10ms优化至8.7ms。提升13%.
- TRT子图对Ernie/Bert模型动态shape支持, 在T4卡,cuda10, batch_size=1下,ernie fp16 预测性能为2.9ms, 相比fp32的6.6ms,加速56%。
- Paddle-TRT对mobilenet v3的优化,支持TRT hard sigmoid OP,以及新增hard swish plugin,batch_size = 1下,P4下预测从3.48ms 到2.29ms, 性能提升34%; V100下预测从2.76ms 到1.33ms, 性能提升51%。
- 增加 swish 激活函数 DNNL 支持,使得ShuffleNet 在 6248单核上性能提升了76%。
- 量化:新增支持matmul op量化;新增`matmul+transpose+reshape` fuse,`scale+matmul` fuse。经过matmul量化和新增fuses,Ernie fp32模型和量化后INT8模型都在原来基础上性能提升了~10%(在6271机器上)。
- 新增 DNNL inplace op支持:目前支持 `elementwise_add`和包括softmax, gelu,relu等大部分激活函数的inplace执行,使得Ernie性能在6248上提升了~2%
- 经过上述优化量化,目前Ernie INT8模型相比未经DNNL优化(包括fuses等)和量化的FP32模型提速~5.51倍。
#### Bug修复
- 修复Inference阶段在TRT int8离线量化中,因融合策略不稳定导致本地与服务端生成校准表名字不一致,从而本地生成的校准表在服务中无法识别加载,会重新生成校准表的问题。目前已经能够保证在多次运行TRT离线量化校准时,校准表名字保持一致。
- 修复Inference阶段TRT离线量化产生校准表过程中传参错误的问题。该问题会一定程度上影响最终的量化预测精度。
### Paddle Serving
#### 易用性提升
- 使用pybind对c++代码进行封装,提供python api的使用方式,提供paddle_serving_server、paddle_serving_server_gpu、paddle_serving_client的python2和python3环境whl安装包,发布了0.2.1版本
- 提供centos6/7环境的cpu和gpu Docker镜像,包含可执行镜像和可编译镜像
- 提供直接保存Serving部署所需的模型和配置文件的api,与Paddle训练框架无缝衔接
- 实现一行命令启动模型预测服务
#### 功能完善
- 提供RPC和HTTP两种预测服务方式
- 支持Python和Go语言客户端
- 支持A/B test
- 发布了paddle_serving_app 0.0.2版本,针对LAC分词分词预处理、中文BERT模型预处理、图像处理提供预处理api。
- 支持预测服务Timeline可视化
#### 性能优化
- RPC服务模式下,中文BERT语义向量表示预测服务比paddle_gpu_serving 0.8.2版本在单张P4卡batch size 1时预测速度提升2.04倍。
#### 文档和示例
- 完善和添加中英文使用文档、中英文开发和部署文档、中文性能调优文档。
- 提供7种模型预测服务示例,包含中文分词、英文情感分析、中文语义向量表示、CTR预估、图像分类等领域。
### Paddle Lite
#### 功能升级
- 编译安装
- Paddle-Lite 编译脚本优化:Android\iOS\ArmLinux 平台各拆分出单独编译脚本,脚本提高易用性。
- 支持Python安装:可以在PC Linux/Windows/Mac 上安装Paddle-Lite Python 库;Python 可以调用Lite opt 优化模型。
- 支持windows 编译: 可以在windows环境编译Paddle-Lite ,当前windows环境只支持x86 编译。
- 基础功能
- 增加分割子图功能。对于以子图接入方式lite的模型,通过配置文件手动切分子图,让指定OP跑在host端,以提高性能(ssd_mobilenet_v1,加速约4.3倍)。
- 优化支持无校准训练后量化方法产出的量化模型,常见分类模型量化到8bit,精度损失从2%减小到0.1%。
- 硬件支持
- 新增RK 1808 NPU,支持全量化MobileNetV1模型;
- 新增MTK MT8175 APU,支持全量化MobileNetV1模型;
- 新增百度昆仑XPU Kernel接入方式,支持ERNIE、ResNet-50和BERT模型。
- 新增寒武纪MLU270,支持一下模型:Resnet50(int8)、Senet101(int8);
- 新增特大陆BM1682,支持以下模型: Mobilenet、Yolov3、Mobilenet-ssd、Inceptionv4、Vgg16、DarkNet-YOLOv3、PyramidBox。
- 移动端GPU(opencl):支持模型mobilenetv1/v2、GAN相关、mnasnet、sqeueezenet、shufflenet、resnet、unet、vgg16
- Nvidia GPU: 增加exec多流支持,对于存在并行性的模型结构,相对单流预计有5-15%的性能提升,对于常见视觉模型,一般不具有并行性结构,开启多流无收益。cuda平台下打开多流功能`config.set_multi_stream(true);`
- 对x86 平台的优化:降低预测库体积(200M---->16M),支持关闭LOG(--shutdown_log=ON)、full_api 支持多线程共享模型权重参数、新增x86 cxx_demo
- 华为NPU:
- benchmark模型(mobilenet_v1,mobilenet_v2,squeezenet_v1.1,mnasnet,shufflenet_v2),提速5-10倍。
- 支持缓存不同尺寸的NPU模型,提升可变输入尺寸模型的性能。
- Demo:
- 新增基于相机预览的实时口罩检测Android Demo
- 新增实时人脸关键点检测和美颜Android Demo
- 新增移动端训练的波士顿房价预测Android Demo
#### 性能优化
- InferShape耗时降低: Predictor连续运行时,infershape总耗时从0.25ms 降低至0.08ms
- opencl部分kernel支持动态shape并将部分计算移到ReinitWhenNeeded。fc_buffer、elementwise_add、scale、activation、grid_sampler。
- 优化sgemm在低端机上的性能表现
- 优化Precision Profiler功能。排版优化,新增支持标准差属性、增长率属性(在均值和标准差一样时,可以比较顺序),支持对OpenCL的Image/Buffer的每层output的精度打印,支持将每层的精度结果(最终的precision summary)写入手机设备上,便于APP调试,将精度打印与原有统计耗时的profiler的依赖分开。
#### Bug修复
- 修复conv op的激活act_type未初始化导致的不同Predictor结果随机的问题。
- 修复opencl kernel。bilinear kernel在mali gpu上兼容性问题、instance norm计算结果不对的问题、reshape的kernel注册错误导致模型转换失败问题、exp和tanh找不到kernel的导致注册kernel名写错绑定模型op失败问题。
- 修复opencl在mali gpu的执行计算结束卡主的问题。
- 修复opencl的资源相关问题。隔离每个Predictor中每个cl::kernel/cl::program等资源。
### PaddleSlim
#### 量化
- 增加无校准数据训练后量化方法,int16精度无损,int8精度损失低于0.1%。
- 增强量化功能,完善量化OP的输出scale信息,支持CPU预测端全面适配量化模型。
#### 剪裁
- 新增FPGM和BN scale两种剪裁策略, 在MobileNetV3-YOLOV3-COCO任务上,同等压缩率下精度提升0.6% 。
- 新增自定义剪裁策略接口,方便开发者快速新增压缩策略。
- 剪裁功能添加对新增Operator的默认处理逻辑,扩展支持剪裁更多复杂网络。
#### NAS
- 新增DARTS系列搜索算法,并提供扩展接口,方便用户调研和实现新的模型结构搜索策略。
- 模型结构搜索添加早停机制,提升搜索功能易用性。
- 新增一种基于强化学习的模型结构搜索策略,并提供扩展接口,为用户调研实现新策略提供参考。
#### Pantheon
- 支持以 fp16 格式进行数据的传输和存储,支持在线蒸馏模式下用多个通道进行知识传输,加大知识数据的传输效率。
- 新增词法分析示例,方便用户基于此构建自己的蒸馏任务
## 开发套件
### PaddleDetection
- 模型丰富度提升
- 添加Efficientdet-D0: COCO val2017精度较TF高0.3 (33.8 vs 33.5), 不含后处理预测速度基本持平或微弱优势(~13ms vs ~14ms,T4实测速度) 。
- 添加实例分割模型HTC,V100下推理速度达到11.5FPS, 较竞品高7.4FPS,在COCO 2017下BBox mAP 42.1%, Mask 37.1。
- 添加anchor-free模型FCOS: COCO val2017精度较pytorch精度高1.1(39.8 vs 38.7)。
- YOLOv3新增MobileNetV3骨干网络,COCO数据集精度达到31.6 。
- 添加anchor-free模型CornernetSqueeze:COCO val2017精度34.5, 较竞品高0.1, 优化模型精度38.2, 提升3.7个点,速度较yolo_v3 darknet快5%
- 添加服务器端实用目标检测模型cascade_rcnn_resnet50_vd_fpn_dcn,V100上20FPS时,coco mAP 47.8%,优于竞品EfficientDet。
- 移动端推出3种模型
- SSDLite系列模型:ssdlite-mobilenet_v3 large模型在COCO数据集上mAP:22.8%,在高通骁龙845上单线程推理速度95ms。ssdlite-mobilenet_v3 small模型在COCO数据集上mAP:16.6%,在高通骁龙845上单线程推理速度40ms,精度优于竞品。ssdlite-mobilenet_v1模型在COCO数据集上mAP:23.6%,在高通骁龙845上单线程推理速度140ms,精度优于竞品。
- yolo v3: yolov3_mobilenet_v3裁剪模型在高通骁龙845上单线程推理速度91ms,精度24.6(输入尺寸320*320),速度和精度均领先于竞品框架SSDLite模型。
- Faster RCNN:基于COCO数据集,cascade_rcnn_mobilenet_v3 large_fpn在输入图片尺度为320x320时,mAP为25.0%,在高通骁龙845上单线程推理速度87ms;在输入图片尺度为640x640时,mAP为30.2%,在高通骁龙845上单线程推理速度351ms。
- 预测部署重构:
- 新增Python预测部署流程,支持RCNN,YOLO,SSD,RetinaNet,人脸系列模型。支持视频预测。
- 重构C++预测部署,提高易用性。
- 易用性提升及功能组件
- 增加AutoAugment数据增强。
- 升级检测库文档结构。
- 支持迁移学习自动进行shape匹配。
- 优化mask分支评估阶段内存占用。
- 升级预测部署功能,增加python端图像与视频预测。
### PaddleSeg
- 新增Lovasz Loss损失函数,可有效提升多类别分割的精度
- 人像分割系列模型全面升级
* 发布首个支持移动端实时人像分割模型HumanSeg-lite
* 新增基于光流算法的视频级别的分割后处理方案
- 新增遥感图像分割解决方案
* 新增多通道遥感图像的数据预处理方案
* 新增适用于多通道图像的数据增强策略
* 提供积雪检测和云检测两种气象遥感领域分割教程
### PaddleClas
- 新增MobileNetV3系列模型,并且对23个系列,117个预训练模型进行性能评估。
- 新增SSLD知识蒸馏方案,识别准确率提升3%以上,并发布82.4%的resnet50_vd、78.9%的mobilenetv3等6个蒸馏模型。
- 新增8种数据增广方式:AutoAugment,RandAugment,CutOutRandErasing,HideAndSeek,GridMask,Mixup,Cutmix,用于增加训练样本的多样性,提升模型的泛化性能。
- 新增10万类图像分类预训练模型,针对图像分类业务应用场景,识别准确率最高可提升30%。
### PaddleOCR
- 新增DB、EAST文本检测算法。
- 新增Rosetta、CRNN、STAR-Net以及RARE文本识别算法。
- 新增超轻量级OCR模型,总共模型大小仅8.6M(文本检测4.1M,文本识别4.5M),同时支持横排和竖排、长文本、中英文数字混合等场景文字的识别。
### Parakeet
- 发布 WaveFlow (res channel=64/128)、ClariNet、WaveNet 等模型的英文预训练模型和音频样本;
- 修复 Conv2DTranspose 的 fp16 kernel 速度过慢的问题,简化 WaveFlow 在 fp16 模式下的预测逻辑;
- 显著提升模型训练速度,通过优化数据预处理和 OP 计算逻辑,在 DeepVoice3、TransformerTTS 等模型上均带来了成倍的速度提升;
## 工具组件
- [PaddleHub](https://github.com/PaddlePaddle/PaddleHub)
- 预训练模型丰富,新增52个预训练模型,目前预训练模型总数100+:
- 语义模型:新增RoBERTa_wwm、BERT_wwm、ERNIE-Tiny等5个语义模型
- 文本分类:新增黄反鉴别模型3个。
- 图像分类:新增ResNext-WSL、EfficientNet等共36个图像分类模型。
- 目标检测:新增行人检测,车辆检测等共5个检测模型。
- 关键点检测:新增人脸关键点检测和人体姿态关键点检测模型2个。
- 人脸口罩检测:新增基于PyramidBox-Lite的人脸口罩检测模型2个。
- 通用人脸检测:新增Ultra Light Fast Generic Face Detector、PyramidBox-Lite等通用人脸检测模型4个。
- 功能:
- 新增基于Paddle Serving的Bert Service文本向量表示服务。
- Task灵活性增强,新增Hook机制可以支持用户自定义代码加载。
- 优化代码结果,命令行执行速度提升50% 。
- 重构Dataset、Reader,适配自定义数据集代码量降低60%。
- 优化AutoFinetune接口,支持多实验的可视化效果显示。
- 体验优化
- 逻辑全面优化,新增丰富的AIStudio教程内容。
- 官网落地页全新升级,提供在线快速体验和教程指导的功能。
- 多任务学习框架[PALM](https://github.com/PaddlePaddle/PALM)
- 支持python3和windows
- 升级框架内核和多任务底层机制,开放API调用
- 灵活的模型保存机制,支持单任务保存和全图保存
- 支持连续训练和连续预测,单次执行下可自由切换数据集文件
- 新增模型定制化/自定义功能
- 重构多任务底层kernel,修复若干影响通用性和稳定性的bugs
- 强化多任务学习能力
- 支持多任务场景下每个任务有不同的batch size和sequence length
- 修复了多任务多卡训练时,各个显卡上任务不一致的问题
- 优化了多任务学习调度和终止策略,普遍提升模型泛化能力
- 强化支持的任务的功能和类型
- 匹配任务支持增强,支持pairwise learning和多类别(如NLI句子关系判断)。
- 机器阅读理解任务支持增强,新增用户可控的预处理超参数。
- 新增支持序列标注任务。
- 强化大规模训练/推理能力
- 新增自动多卡预测能力
- 重构异步reader,多卡场景下支持变长padding
- 新增预训练模型管理和下载模块
- 支持BERT、ERNIE、RoBERTa等各预训练模型的管理和下载
- 新增RoBERTa中文预训练模型
- 联邦学习[PaddleFL](https://github.com/PaddlePaddle/PaddleFL)
- 新增scheduler与submitter功能:scheduler可用于在训练过程中控制trainer是否参加更新 。submitter可用于完成在MPI集群提交paddleFL任务的功能
- 新增LEAF dataset联邦学习公开数据集,并添加api,用于设置benchmark。支持图像分类,情感分析,字符预测等领域的经典数据集,如MNIST,Sentiment140
- 根据新增组件,在example中修改了原有的样例,并添加了femnist_demo, submitter_demo样例
- 优化fl_distribute_transpiler,使FedAvg strategy新增对adam optimizer支持;
- 新增SecAgg strategy(Secure Aggregation),用于实现安全的参数聚合;
- 深度强化学习框架[PARL](https://github.com/PaddlePaddle/PARL)
- 发布v1.3版。
- 新增对Multi-Agent RL算法支持,包括MADDPG。
- 新增对多卡训练的支持,发布多卡DQN算法示例。
- 开源连续控制领域的SOTA算法TD3和SAC。
- 开源NeurIPS2019强化学习挑战赛事冠军模型实现和训练方案,开放训练好的模型(可考虑公开课)
- 飞桨图学习框架[PGL](https://github.com/PaddlePaddle/PGL)
- 发布v1.1版:
- 新增对权威图学习数据集OGB的支持,全面支持nodepropered、linkpred、graphpropered三大类型任务,并发布SOTA基线。
- 发布图推荐解决方案PGL-Rec和知识图嵌入算法集PGL-KE。
- 易用化改进,发布PGL高阶API。
- 其他升级点:多进程图采样优化,加速GraphSAGE类模型3倍;新增基于Lod Tensor的Graph Batch算子,Graph Pooling算子;Model Zoo新增模型,包括分布式异构图算法、GraphZoom、PinSage等。
## 代码重构和升级
- 编译
- 增加WITH_NCCL编译选项,单卡用户可显示指定WITH_NCCL=OFF加速编译。
- 新增编译选项WITH_TP_CACHE,缓存第三方源码,避免重复下载,Windows用户可将其设置为ON,加快编译速度并提高编译稳定性。
- `CUDA_ARCH_NAME`默认值设成`Auto`(`All`表示编译所有gpu架构,`Auto`表示只编译当前机器gpu架构),对开发者来说,使用`Auto``All`节省非常多的编译时间,提高开发效率。
- 减少了冗余的link环节与产物、多余的文件拷贝,加快了Windows下的编译速度。
- 外部依赖库
- 升级MKL-DNN到最新1.1版本。
- 将预测库与`third_party` 解耦,重构了28个第三方依赖的编译代码,便于统一管理外部依赖。
- 移除了第三方依赖的私人仓库2个、无用依赖1个、无用的patch下代码2000+行,提高仓库质量。
- 代码清理、重构和优化
- 去掉无用的`contrib/float16`目录,删除BRPC下无用的snappy/snappystream依赖。
-`python/paddle/fluid/layers/nn.py`中,根据API功能拆出`loss.py``sequence_lod.py`,减少`nn.py`的代码量,便于阅读。
- 修复`-Wno-error=sign-compare`的warning对应的代码(共100多处),后续所有该类warning会在编译时报错,提高代码质量
- 去掉WindowsMSVC编译的`WarningLnk4006/WarningLnk4221`(共约300处),提高仓库质量。
- 减少reduce_op, expand_op, expand_as_op模版类数量,加速GPU编译和减少whl包70M的空间。
- 动态图下通过代码自动生成每个OP的pybind函数,用于在layers中直接调用,提高动态图性能并减少与静态图的耦合度。
## BUG修复
- 修复基于PaddleDetection的 Faster-RCNN使用Python API预测时MKL-DNN报错问题。
- 修复sum op的GPU实现中,由于部分Tensor没有初始化引起训练挂掉的问题。
- 修复fill_constant中,value设置为大整数时精度损失的问题。
- 修复softmax_with_cross_entropy_op在CUDA上的精度不一致问题。
- 修复clone program时program中的stop_gradient属性不能拷贝到新program的问题。
- 修复elementwise_pow op在整数上的精度损失问题。
- 修复一些 GFLAGS 不能在预测库外进行指定的问题。
- 修复 Analysistor 多线程下若干 Pass 导致预测随机 core 的问题。(fc_gru_fuse_pass,seqconv_eltadd_relu_fuse_pass,attention_lstm_fuse_pass,embedding_fc_lstm_fuse_pass,fc_lstm_fuse_pass,seq_concat_fc_fuse_pass)
- 修复了在使用 NativePredictor 指定使用 CPU 预测后,在同一进程内使用 AnalysisConfig 指定 GPU 不生效的错误。
- 修复Windows上-DWITH_MKL=OFF时编译报错的bug。
- 修复py_func OP无法输入tuple(Variable) 的bug,新增如何写PythonOP的代码示例。
- 修复sigmoid cudnn kernel错调用成tanh cudnn kernel的问题。
- 修复部分动态图模式下reshape、Conv2D相关的bug;修复网络中部分参数无梯度,导致程序crash 的bug。
- 修复GradientClip在参数服务器模式下运行错误的BUG。
- 修复参数服务器全异步模式下内存泄露的问题。
## 兼容性说明
- 静态图:1.7版本对上一版本(1.6.0~1.6.3)完全兼容,1.6+版本训练的模型均可在1.7版本下进行训练或预测。
- 动态图:1.7版本作了大量提升易用性的优化,有部分升级无法兼顾兼容性:
- paddle.fluid.dygraph提供的API中统一移除了”name_scope”参数:该参数在设计和使用上均没有实际意义,属于冗余参数,为了减少调用API的复杂性,统一进行移除。
- 部分API参数列表变更:
- Conv2D、Conv2DTranspose、Conv3D、Conv3DTranspose:添加必选参数 num_channels (required, int),用于表示输入图像的通道数。
- LayerNorm:移除 begin_norm_axis参数;添加必选参数 normalized_shape (required, int | list | tuple),用于表示需规范化的shape。
- NCE:添加必选参数 dim (required, int),用于表示输入的维度(一般为词嵌入的维度)。
- PRelu:添加参数 input_shape (list | tuple),用于表示输入的维度,该参数仅在mode参数为”all”时为必选参数。
- BilinearTensorProduct:移除参数 size,添加必选参数 input1_dim (required, int) 和 input2_dim (required, int),分别用于表示第一个和第二个输入的维度大小。
- GroupNorm:添加必选参数 num_channels (required, int),用于表示输入的通道数。
- SpectralNorm:添加必选参数 weight_shape (required, list | tuple),用于表示权重参数的shape。
- TreeConv:添加参数 feature_size (required, int),用于表示nodes_vector的shape最后一维的维度。
- API使用方式变更:
- Embedding:不再要求输入数据的最后一维必须为1,而且输出的shape的规则发生了改变,比如在NLP任务中,1.6版的Embedding要求输入数据的shape形如[batch_size, seq_len, 1],在1.7版本为保证输出的shape同样为[batch_size, seq_len, embedding_size],输入的shape需为[batch_size, seq_len],
- FC API被删除,替换用法为Linear,具体迁移方法请见Linear API的文档。
- Optimizer定义时,需显式指定要优化的参数列表,参数列表可以通过Layer的 parameters() 接口直接获取。
- 参数名称的变化:
- 1.7 版本参数名称为了和静态图统一,命名规则进行了调整,增量训练无法加载上一版本(1.6.0~1.6.3)保存的模型。
### PaddleHub
* 视觉模型丰富度提升,预训练模型总数,预训练模型总数达到120+。
* 新增大规模视觉预训练模型,可大幅度提升图像分类和目标检测任务的Fine-tune效果
* 新增工业级短视频分类模型VideoTag,支持3000类中文标签识别
* 新增轻量级中文OCR模型,支持一键快速OCR识别
* 新增行人检测、车辆检测、动物识别、Object365 2019大规模目标检测夺冠模型
* Fine-tune API升级
* 文本分类任务新增5个预置网络,包括CNN, BOW, LSTM, BiLSTM, DPCNN等
* 动态图能力升级
* BERT类预训练模型支持动态图模式下的一键加载
### PaddleX
* 全新发布PaddleX飞桨全流程开发工具
- 打通从数据接入到预测部署的深度学习开发全流程、并提供简明易懂的Python API
- 覆盖CV领域图像分类、目标检测、语义分割、实例分割四大主流任务场景,并集成PaddleHub、PaddleSlim、VisualDL、Paddle Lite等工具组件。
- 预置产业实践精炼沉淀预训练模型及诸多飞桨特色优势模型26类,共计43个。
- 提供自动数据分析、自动超参推荐、数据增强策略、模型裁剪训练、模型量化、预训练模型保存及复用、多平台发布部署、模型加密等进阶功能。
- 创新集成模型可解释性分析功能
- 提供官方实现可视化前端Demo,支持Windows、Linux、Mac系统一键安装。
### VisualDL
* 发布VisualDL 2.0 beta版本
- 后端内核全新升级,更轻更快,兼容性更高,支持文件存储系统拓展
- API全面升级,更少代码完成可视化分析,显著提升易用性
- UI与交互全新升级,提供更好的本地化支持,可视化分析更清晰、直观,给用户沉浸式体验
- 与飞桨开发套件与工具组件深度融合,提供更流畅的深度学习开发体验
### PaddleFL
- 发布PaddleFL 1.0版本
- 开源基于Mulit-party Computation(MPC)的联邦学习,支持横向、纵向等多个联邦学习场景
- 原有框架重构,将新增联邦学习方案与原有方案整合并开源
- 新增由单机模型转变为FL可训练program的功能,支持更多模型及场景
### PGL
* 发布业界首个结合语义信息与结构信息的图神经网络模型ERNIESage
* 新增PGL-KE,目前PGL涵盖游走类、消息传递类以及知识嵌入类等25+图学习模型
* 新增Graph Batch、Graph Pooling等Graph类操作算子
* 全面支持Open Graph Benchmark基准测试集,并发布相应SOTA
* Model Zoo新增MetaPath2Vec++、Mulit-MetaPath2Vec++、STGCN、GIN、PinSage模型
### PARL
* 开源工业界首个进化学习应用框架EvoKit
* 新增Multi-Agent RL算法支持,包括MADDPG
* 新增多卡训练支持,发布多卡DQN算法示例
* 开源连续控制领域的SOTA算法TD3和SAC
* NeurIPS2019强化学习挑战赛事冠军模型以及训练方案开源
### Paddle Quantum(量子计算实验室)
* Paddle Quantum(量桨)初版发布。量桨是基于百度飞桨开发的量子机器学习工具集,支持量子神经网络的搭建与训练,提供易用的量子机器学习开发套件与量子优化、量子化学等前沿量子应用工具集,使得飞桨成为国内首个支持量子机器学习的深度学习平台。
- 支持 QAOA 算法实现,完成最大割 (Max-Cut) 问题的解决
- 支持 VQE 算法实现,计算 H_2 的最小特征值
- 支持 SSVQE 算法实现,计算给定哈密顿量的特征谱
- 支持 VQSD 算法实现,计算量子态对角化后的形式,给出量子态的特征分解
- 支持 Gibbs 算法实现,生成给定哈密顿量在确定温度下的吉布斯态
- 支持量子计算常用函数
- 支持描述U_Ansatz量子电路
# Release Notes
## Important Updates
This version focuses on enhancement of the framework functions, includes improving the inference deployment capability, releasing PLSC for super-large-scale classification training task, and optimizing the parameter server mode. In addition, the compilation options, compilation dependence and code library are fully cleaned up and optimized. The model library is optimized by adjusting the structure and adding dynamic graph models. The development kits and utility components are upgraded.
### Training Framework
- Adds AMP (Automatic Mixed Precision) interfaces and control flow interfaces.
- Optimizes the tensor using method and GPU memory allocation strategy.
- Supports Nvidia DALI GPU data preprocessing library.
- Optimizes the functions and performance of basic Ops
- Enhances the functions of dynamic graph models, including performance improvement and supporting new APIs which can converts the data independent dynamic graph model into static graph model.
- Improves the user experience of debug functions.
### Inference Deployment
- Paddle Serving
- Optimizes the Python API.
- Supports new programming languages API, such as R and Go.
- Enhanced the quantitative capability.
- Paddle Lite
- Supports deploying the model generated by the post-training quantization method without calibration data.
- Enhanced the OpenCL capability.
- Supports Kunlun XPU.
- Paddle Slim
- Optimizes the pruning, quantization, distillation and NAS (Network Architecture Search) API for adapting the model library.
- Supports large-scale knowledge distillation framework called Pantheon.
### Distributed Training
- Unified the implementation mode of the semi-asynchronous, fully asynchronous and GEO modes in parameter server mode. The back-end is unified into communicator. The front-end interface is unified into fleet. Select different mode by configuring the fleet strategy.
- Releases the PLSC for super-large-scale classification training task.
### Model Construction
- Releases the text-so-speech model library called Parakeet, including several leading-edge text-to-speech algorithms.
- Adds 14 image classification pre-training models in PaddleCV, for enriching the 3D and tracking direction models.
- Supports Jieba word segmentation in PaddleNLP.
- Adds a multi-task model called MMoE in PaddleRec.
- Adds more dynamic graph models.
- Adjusts and optimizes the structure of model library.
### Development Kits
- Optimizes the PaddleDetection and PaddleSeg by adding a large number of models as well as pre-training models, enhancing the training speed and accuracy of typical models, and strengthens the model compression and deployment capabilities.
- Releases the recommended sorting system called ElasticRec, can be deployed via K8S and support streaming training and online forecast services.
### Utility Components
- Adds 52 pre-training models to enrich the models up to 100+, as well as improves the function experience.
- Upgrades the kernel of PALM, opens API, and supports more task types.
- Adds an open dataset in PaddleFL (Federated learning framework).
- Upgrades the versions of PARL (Deep reinforcement learning framework) and PGL (Graph learning framework) . Opens more algorithm and supports more functions.
## Training Framework
- API
- Adds AMP (Automatic Mixed Precision) APIs, which can convert a network training mode into mixed accuracy mode in a general way, and ensuring the accuracy fluctuation within the normal range.
- Adds control flow OPs, such as while_loop, cond, case and switch_case. It is recommended to use the new APIs for much easier to use. The following functions are supported:
- Supports using python callable as the control condition or executive objects.
- Supports using different losses or optimizers in different branches of the control flow.
- Supports using CPU data or GPU data in condition of the control flow
- Supports using the variable lists as parameters for some APIs, while these APIs only supported string lists as the `parameter_list` or `no_grad_set`. Do not need to obtain the `name` attribute of variables when using the following APIs:
- fluid.backward.append_backward(loss, parameter_list=None, no_grad_set=None, callbacks=None)
- fluid.backward.gradients(targets, inputs, target_gradients=None, no_grad_set=None)
- The minimize methods of optimizers, such as Adam's minimize: minimize(loss, startup_program=None, parameter_list=None, no_grad_set=None, grad_clip=None)
- Basic Functions Optimization
- Supports configuring tensor data with numpy float16 data types, and no need to convert to unit16 type first.
- Supports using minus sign to express the tensor's opposite.
- GPU memory Allocation Strategy:
- Changes the default policy to `AutoGrowth`. In this policy, the GPU memory is applied on demand when not affecting the training speed. While it`s difficult to start another task on the same GPU in the GPU memory pre-allocation strategy before. This change can avoid this problem.
- Adjusts the GPU memory allocation for multi-card tasks: Set the GPU memory allocators on different GPU cards to the `Lazy` initialization mode. If a card is not used, the GPU memory will not be applied for this card. While the GPU memory OOM problem could be caused by running tasks on idle GPU cards without setting CUDA_VISIBLE_DEVICES, when GPU memory is occupied on other GPU cards. This change can avoid this problem.
- OP Function Upgrade
- elu: This activation function supports the calculation of second-order gradients.
- Prroi_pool: The parameter `rois` supports the `Tensor` or `LoDTensor` type.
- Conv2d, pool2d, batch_norm, lrn: supports using the MKL-DNN library to perform gradient calculation of these OPs.
- argsort: Supports descending. A new parameter `descending` is added, default value is `False`.
- Basic Performance Optimization
- DALI Preprocessing Acceleration
- Supports the Nvidia DALI GPU data preprocessing library, which can be used to accelerate the preprocessing speed of data such as images, videos, and speeches.
- Automatic Mixed Precision Training Optimization
- Implements the following optimization strategies to increase the training throughput of the ResNet50 model, along with the DALI data preprocessing module. The mixed accuracy training throughput of a single V100 card is increased from 600+ images/s to 1,000+ images/s. The throughput of 8 cards for a single machine is increased to 7,840 image/s. The throughput of 32 cards for 4 machines is increased to 28,594 images/s.
- Supports NHWC data layout inputs for some OPs such as batch_norm, conv2d. Accelerates fp16 calculation speed by using Tensor Core technology.
- Fusing some op patterns in the model, such as batch_norm and relu, based on the IR Pass mechanism.
- Optimizes kernel of some elementwise OPs, such as add, mul.
- Optimize the `RecomputeOptimizer` to enable bigger batchsize. The batchsize of Bert-large model increases by 533.62% while using the `RecomputeOptimizer`.
- OP Performance Optimization
- Implements the fusion operator called `fuse_emb_seq_pool` of `embedding` and `sequence_pool`. Optimizes the `murmurhash3_x64_128` in `bloom_filter`. These optimization increases the training speed of some NLP models.
- Optimizes the GPU performance of `mean op`. When a data of 32 *32 *8 *8 tensor is input, the forward calculation speed is increased by 2.7 times.
- Optimizes OPs of `assign` and `lod_reset`, to avoid nnecessary GPU memory copy and data transform.
- Optimizes the kernel implementation of stack OP. The performance of a single card of GPU in the XLnet/Ernie model is improved by 4.1%.
- Dynamic Graph
- Function Optimization
- Removes the `name_scope` parameter in `Layers` to make it easier to inherit and call.
- Removes the `block` parameter in the `to_variable` to simplify the use of the API.
- Removes the `build_once` as for the the problem that model parameters depend on data. So that `Layers` can get all the parameter tables when implementing the `init` execution. It`s convenient for saving and loading, parameter initialization, parameter debugging, and parameter optimization.
- Optimizes the automatic pruning function facilitate user networking and reduce the reverse calculation amount.
- Supports `SelectedRows` operation so that the Embedding layer supports sparse update of a single card.
- Adds functions such as ParameterList, LayerList, and Sequencial, as for the problem that the framework lacks containers. It`s more convenient for networking with these functions.
- Supports functions such as named_sublayers and named_parameters to facilitate programming.
- Supports the `Linear lr warmup decay` strategy.
- Performance Optimization
- Optimizes the interaction of python with c++, GradMaker, OperatorBase, and allocator. The performance is improved by 270% for the LSTM-based language model task on the P40 machine.
- Removes the redundant codes for performance problems caused by calling dead codes of `optimized_guard`. The performance of optimizers such as SGD and Adam is improved by 5% to 8% for or the Transformer model (batch_size=64) on the P40 machine.
- Optimizes asynchronous DataLoader of the dynamic graph. For the Mnist, ResNet and other CV models , the single card training speed is improved by more than 40% on the P40 machine.
- Adds numpy bridge function, to support sharing the underlying data between Tensor and ndarray in CPU mode. This can avoid the copy problem of numpy input when creating variables, and improve efficiency.
- Optimizes the GPU memory by the forward variable space strategy, which can delete the Tensor Buffer not required in reverse calculation in advance. The maximum batch size is increased by more than 20%-30% in some models such as ResNet.
- To reduce the performance impact caused by adding extra `scale_op` to update the beta parameter in `AdamOptimizer`. Iintegrate the updating logic of `beta` into `adam_op` to reduce the cost of calling op kernel. The performance of is improved by 9.67% on the P40 machine.
- Dynamic Graph Deployment
- Supports the `TracedLayer` interface to convert the dynamic graph model into the static graph.
- Debugging Analysis
- Optimizes the error message. Classifies the framework error messages and optimizes the message descriptions for more convenient to solve the problem according to the messages.
- Optimizes the performance analysis profile function.
- Enhances the functions and accuracy of the profile. Supports profile options at different levels. The call relation of events can be recorded in the profile data and printed.
- Optimizes the checking and debugging functions of `nan inf` which is enabled through `FLAGS_check_nan_inf`. The performance, function, and output information are all greatly improved.
- In terms of speed, the v100 test ResNet50 model has a performance improvement of about 1000 times compared with the original utility components, and maintains an over 80% efficiency for normal training.
- In terms of function, the support for fp16 is added and environment variables can be set to skip the inspection of op, op_role, and op_var to facilitate the debugging of the fp16 model.
- The output information is detailed and accurate. Besides wrong op and tensor names, the quantity of wrong nan, inf, and normal numerical values are printed to facilitate debugging.
- Releases the lightweight installation package `paddlepaddle-tiny` for CPU training and forecast, supporting installed on Windows/Linux/Mac OS and python27/python35/python36/python37.
- Supports the following compile functions: no avx, no ml, no gpu, no unittest.
- Remove the slim and some dataset.
- Reduce the Linux package size from 90M to 37M. Reduce the Windows package size from50.8 M to 9.6M. Reduce the MAC package size from 59M to 19.8M.
- Reduce the number of installation requirement dependencies from 15 to 7.
## Inference Deployment
- Server-side Inference Library
- Python API
- Supports reading and writing model from the memory to meet the model encryption requirements.
- The Scale operator is no longer added at the end of the inference model.
- Adds ZeroCopy API, which is basically the same as the C++ APIs. Supports using numpy.ndarray as the input and output. It`s convenient for Python scenario.
- Adds several interfaces in AnalysisConfig to completely cover the C++ inference functions, including removing pass and disabling inference glog.
- Support for Other Programming Languages
- Add inference API of R and Go, and the related usage methods and examples are added.
- Provides the corresponding header file of ProtoBuf to facilitate users to analyzing structure of models.
- For a inference library with TRT compilation, the TensorRT library is not provided from thrid_party any more and needs to be downloaded by users at https://developer.nvidia.com/tensorrt.
- Functional Enhancement:
- Supports access Paddle Lite by submap mode, and ResNet50 has been verified.
- Supports the MKL-DNN FC INT8 kernel.
- Supports Ernie model in Paddle-TensorRT. For the Ernie model (seq length = 128) on the T4 card, the delay of fp16 inference is 3.6 ms, which is faster than the fp32 inference by 37%.
- Quantization: the single-threaded performance and the multi-threaded performance are improved by 2.79 times and 1.79 times for ERNIE INT8 on the second-generation Xeon scalable platform 6271 respectively, while the Ernie INT8 model has only slight decline precision compared with the FP32 model.
- Mobile/Embedded End-side [Paddle Lite](https://github.com/PaddlePaddle/Paddle-Lite)
- Releases the version v2.3.
- Upgrades the functions of Model_optimize_tool.
- Supports "The post-training quantization method without calibration data". The model storage space can be reduced by 2 to 4 times.
- OpenCL: The migration of 30 Image2D Kernels are finished and 14 Ops are covered.
- Strenthens the capability with FPGA, NPU. Supports Kunlun XPU for inference.
- Releases a new official website document. Adds the document of "post-training quantization method without calibration data"
- [Paddle Serving](https://github.com/PaddlePaddle/Serving):
- Releases the forecast service of remote text vector representation of the bert-type semantic understanding model.
- Release the paddle-gpu-serving WHL package. Supports pip installation and Python codes.
- Supports 13 semantic understanding models in Paddlehub. Supports the single-machine multi-card mode. The forecast speed is 869.56 samples per second using the Ernie_tiny model, when the average sample length is 7 under a single P4 GPU.
- [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim):
- Moves PaddleSlim to independent repo.
- Refactors pruning, quantization, distillation and NAS API. Provide more low-level APIs for developer.
- Quantization:
- Adds post training quantization strategy based on KL divergence. Supports quantization of the embedding layer.
- Supports quantization for MKL-DNN-FC layer based on QAT.
- Adds post training quantization that support 30 kinds of operators. Supports spartial operators to skip quantization.
- Supports skipping some operators in training aware strategy
- Pruning: Refactors and enhances the code of pruning to support more kinds of networks.
- NAS:
- Supports NAS based on simulated annealing. Provides more predefined search spaces and support custom search spaces.
- Adds one-shot algorithm for NAS. The speed of search is 20 times faster than that of the previous version.
- Releases the large-scale scalable knowledge distillation framework called Pantheon.
- Achieves full decoupling between student and teacher models and among teacher models. They can independently run on different physical devices respectively to make full use of computing resources.
- Supports the multi-device large-scale inference of the teacher model in the single node. The acceleration ratio is tested to be linear on BERT-like complex models.
- Supports knowledge transmission between teacher and student models running on any two physical devices in the same Internet environment. By using TCP/IP protocol for communication in online distillation mode.
- Unifies API interfaces for online and offline distillation modes, enabling different teacher models operating in different distillation modes.
- The merging of knowledge and the batch reorganization of knowledge data are completed automatically on the student side to facilitate the knowledge fusion of the multi-teacher models.
- Model Zoo:
- Releases benchmark of image classification model such as ResNet50, MobileNet.
- Adapts PaddleDetection library and release benchmark of YOLOv3 models with different backbone.
- Adapts PaddleSeg library and release benchmark of Deepabv3+ models with different backbone.
- Refines Document:
- Refines documents of API. Adds some QuickStart tutorials and advanced tutorials. Adds model zoo docu which contain models for image classification, object detection, semantic segmentation. Translates all documents to English.
## Distributed
- Parameter Server Mode:
- Reduces the memory usage greatly during training. On 100 million embedding training tasks, the Trainer-side memory can be reduced by 90%.
- Reduces the memory usage of distributed saving and loading models greatly. The Pserver-side memory peak value can be minimized to $1/N $ of the original value, where N is the number of Pserver nodes.
- Optimizes the dense parameter communication in GEO mode.
- Supports distributed AUC index calculation.
- Adds distributed barrier functions.
- Adds Semi-asynchronous modes in Communicator.
- Supports semi-asynchronous modes of the `TrainFromDataset` training interface.
- Adds `DistributedStrategy` in `Fleet` to improve the convenient usage. Integrates the current distributed related flags.
- Supports single-program multi-loss training modes in `Fleet pslib` to optimize the training performance.
- Supports k8s environment in 100 billion sparse mode.
- [Large-scale classification library PLSC](https://github.com/PaddlePaddle/PLSC): It supports the large-scale classification problem that data parallel cannot solve due to the limitation of video memory capacity.
- Supports three built-in models such as ResNet50, ResNet101, and ResNet152. Supports User-defined models. Under the single-machine eight-V100 GPU configuration environment, the ResNet50 model has a million-class training speed of 2,122.56 images/s, which is 1.3 times faster than that of the standard ResNet50 model.
- Releases a `plsc-serving whl` package for model online forecast service. It can forecast the image semantic vector representation of the face recognition model. Supports making a forecast using a user-trained model. The forecast speed of the ResNet50 model (batch size=256) is 523.47 images/s under a single V100 GPU.
- Releases the pre-training models based on the ResNet50 network and the MS1M-ArcFace dataset: https://plsc.bj.bcebos.com/pretrained_model/resnet50_distarcface_ms1mv2.tar.gz.
- Releases the benchmark for ResNet50 mixed precision training (single-card, multi-card, and multi-machine)
## Basic Model Library
- [Models repo github](https://github.com/PaddlePaddle/models)
- PaddleNLP
- Seq2seq supports training modes such as RL and GAN in the static-graph of Paddle.
- A training model for word segmentation and part-of-speech tagging is released. With the knowledge distillation framework Pantheon, the F1 score of this model on the own dataset is improved 1% over that of PaddleNLP LAC. This model is merged into the jieba repo, with adding a flag use_paddle to enable deep learning model mode. In addition, the paddle version detection and rollback mechanism is added in jieba to ensure user experience.
- Adds dynamic graph model implementations for these models: word2vec, senta, transformer, Bert, seq2seq, and LAC.
- PaddleSpeech
- Releases text-to-speech toolkit Parakeet (Paddle PARAllel text-to-speech toolkit).
- Implements the standard workflow for data preprocessing, training, and synthesis of the TTS models.
- Provides the out-of-the-box pre-processing implementation of typical datasets.
- Provides the commonly-used model components in the TTS field to facilitate the model implementation.
- Reseases the TTS models DeepVoice3, ClarinNet, TransformerTTS, FastSpeech, WaveNet, and WaveFlow.
- PaddleCV
- Image Classification:
- Adds 14 pre-training models including SENet-vd, Res2Net, and HRNet series of models:
- Supports accelerating data preprocessing by using DALI. On the ImageNet training, 1.5 times (ResNet50) to more than 3 times (ShuffleNet) the acceleration is obtained and the GPU utilization is greatly improved.
- 3D Vision:
- Releases PointNet++, PointRCNN models.
- Tracking Model Library:
- Releases SiamFC and ATOM models,
- Add dynamic graph model implementations for the following models: MobileNet-v1/v2, YOLOv3, FasterRCNN, MaskRCNN, video classification TSM model, and video motion positioning BMN model.
- PaddleRec
- Releases a multi-task model called MMoE for the recommended field. It can be applied to large-scale multi-task joint training in the industrial circles.
- Adds dynamic graph model implementations for the following models: gru4rec, deepfm.
## End-To-End Development Kits
- [PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection)
- The precision of the YOLOv3 model is further improved. The precision for the COCO data reaches 43.2%, an absolute increase of 1.4% compared with the previous version.
- Add the following model implementations and pre-training models:
- Add the best single model CascadeCARCNN-FPN-Dcnv2-Nonlocal ResNet200-vd in the Google AI Open Images 2019-Object Detction competition is added. Releases a pre-training model of this algorithm based on Objects365 data.
- Add a series of CBResNet, Res2Net, and HRNet pre-training models.
- Adds a LibraRCNN algorithm and the pre-training models.
- Add GIoU, DIoU, and CIoU loss-based pre-training models in the FasterRCNN R50 FPN model. Without reducing the inference speed, the precision for the COCO data is improved by 1.1%, 0.9%, and 1.3% respectively.
- Adds Modules:
- Backbone network: CBResNet, Res2Net, and HRNet are added.
- Loss modules: GIoU loss, DIoU loss, and CIoU loss are added. Libra loss and YOLOv3 loss support a fine-grained op combination.
- Postprocessing modules: The softnms and DIOU nms modules are added.
- Regular module: A DropBlock module is added.
- Functional Optimization and Improvement:
- YOLOv3 data preprocessing is accelerated. The overall training speeds up by 40%.
- The data preprocessing logic is optimized.
- The benchmark data for face detection inference is added.
- Inference examples under the Paddle inference library Python API are added.
- Detection Model Compression:
- Pruning: A MobileNet-YOLOv3 uningtailoring solution and model are released, with FLOPs - 69.6%, mAP + 1.4% for the VOC dataset, and FLOPS - 28.8%, mAP + 0.9% for the COCO dataset. A ResNet50vd-dcn-YOLOv3 pruning solution and model are released, with FLOPs - 18.4%, mAP + 0.8% for the COCO dataset.
- Distillation: A MobileNet-YOLOv3 distillation solution and model are released, with mAP + 2.8% for the VOC data and mAP + 2.1% for the COCO data.
- Quantization: YOLOv3 and BlazeFace quantitative models are released.
- Pruning + Distillation: A MobileNet-YOLOv3 pruning + distillation solution and model are released, with FLOPS - 69.6%, inference speedup 64.5% under the GPU, mAP - 0.3 % for the COCO dataset. A ResNet50vd-dcn-YOLOv3 pruning + distillation solution and model are released, with FLOPS - 43.7%, inference speedup 24.0% under the GPU, mAP + 0.6 % based on the COCO data.
- Search: A complete search solution for the open source BalzeFace-nas.
- Inference Deployment:
- The support of the Paddle inference library for TensorRT and FP16 precision is adapted.
- Documents:
- Adds the documents for introducing the data preprocessing module and a document for implementing the user-defined data Readers.
- Adds the documents about how to add an algorithm model.
- Documents are deployed to the website: https://paddledetection.readthedocs.io/zh/latest/
- [PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg)
- Adds Models
- LaneNet model applicable to lane segmentation scenarios.
- Lightweight Fast-SCNN model applicable to high performance scenarios.
- HRNet semantic segmentation model applicable to high-precision scenarios.
- Releases multiple PaddleSlim-based model compression solutions:
- Fast-SCNN tailoring solution and model on Cityscapes dataset.
- Deeplabv3p-Xception and Deeplabv3p-MobilenetV2 distillation solutions on Cityscapes dataset.
- Deeplabv3p-MobilenetV2 search solution on Cityscapes dataset.
- Deeplabv3p-Mobilenet quantitative solution and model on Cityscapes dataset.
- Enhance the deployment capability
- Adds the lightweight deployment of Python.
- The TensorRT acceleration support for FP16 and Int8 quantitative models is added.
- Adds the tutorials for human portraits segmentation Paddle-Lite mobile deployment of DeepLabv3p-MobileNetV2
- Optimizes the Model exportation step. Supports GPU implementation of image preprocessing and post processing. The performance is improved by 10%-20%.
- Provides the benchmark for the prediction performance of U-Net, ICNet, PSPNet, DeepLabv3+, and other models for images of different sizes to facilitate users to select models based on performance.
- Experience Optimization
- Adds a learning rate function called warmup. Supports using with different learning rate decay strategies to improve fine-tuning stability.
- Adds the function of automatically saving an optimal mIoU model.
- The document logic is comprehensively optimized. An AIStudio practical tutorial on industrial scenarios such as industrial quality inspection and fundus screening is provided.
- Marked imaged can be saved in pseudo-color image format to improve their preview experience.
- [ElasticRec](https://github.com/PaddlePaddle/ElasticRec)
- An ElasticRec recommended sorting system is released. It is deployed through K8S. Streaming training and online inference service are supported.
## Utility Components
- [PaddleHub](https://github.com/PaddlePaddle/PaddleHub)
- 52 new pre-trained models are added. Currently, the total number of pre-training models is 100+:
- Semantic models: Five semantic models such as RoBERTa_wwm, BERT_wwm, and ERNIE-Tiny are added.
- Text classification: Three anti-porned models are added.
- Image classification: A total of 36 image classification models such as ResNext-WSL and EfficientNet are added.
- Object detection: Five detection models such as pedestrian detection and vehicle detection are added.
- Key point detection: Two models for key point detection of face and body posture are added.
- Face mask detection: Two PyramidBox-Lite-based face mask detection models are added.
- Universal face detection: Four universal Face detection models such as Ultra Light Fast Generic Face Detector and PyramidBox-Lite are added.
- Function:
- Bert Service, a text vector representation service based on Paddle Serving is added.
- Task flexibility is enhanced. An hook mechanism supports the loading of user-defined codes is added.
- Code results are optimized. The command line execution speed is increased by 50%.
- Dataset and Reader are refactored, The quantity of adaptive user-defined dataset codes is reduced by 60%.
- The AutoFinetune interface is optimized. Multi-experiment visualization effect display is supportsed.
- Experience Optimization
- The logic is fully optimized. Rich AIStudio tutorial contents are added.
- The landing page of the official website has been fully upgraded to provide the function of quick online experience and tutorial guidance.
- Multi-task learning framework [PALM](https://github.com/PaddlePaddle/PALM)
- Python3 and Windows are supported.
- Release APIs and the multi-task learning kernel are upgraded.
- Support independent task saver.
- Continuous training and inference are supported, Dataset files can be switched over freely under a single execution.
- Supports model customization.
- The multi-task learning kernel is refactored and fix some bugs.
- Upgrade multi-task learning ability.
- Support independent settings of batch size and sequence length across tasks.
- Fix inconsistent problem of the tasks on GPUs.
- The multi-task learning scheduling and termination strategies are optimized to generally improve the model generalization ability.
- Upgrade the ability and types of pre-defined tasks.
- Upgrade matching task. Add pairwise learning and multiple categories support.
- The support for machine reading comprehension tasks is enhanced. User controllable preprocessing hyper-parameters are added.
- The support for sequence labeling tasks is added.
- The large-scale training/inference capability is strengthened.
- Add automatic multi-gpus inference.
- Refactor asynchronous reader. Support dynamic padding length for multi-task learning running on multiple-gpus.
- A module for the management and downloading of pre-training models is added.
- The management and downloading of pre-training models such as BERT, ERNIE, and RoBERTa are supported.
- A RoBERTa Chinese pre-training model is added Releases the version v1.3.
- Federated Learning [PaddleFL](https://github.com/PaddlePaddle/PaddleFL):
- According to the added components, the original samples are modified in example and the femnist_demo and submitter_demo examples are added
- Fl_distribute_transpiler is optimized to add the support of FedAvg strategy for the adam optimizer.
- SecAgg strategy (Secure Aggregation) is added to achieve secure parameter aggregation.
- The scheduler and submitter functions are added: The scheduler is used to control whether the trainer participates in update during training. The submitter is used to complete the function of submitting paddleFL tasks in the MPI clus
- A LEAF dataset federated learning open dataset is added. An API is added to set a benchmark. Classical datasets in the image classification, emotion analysis, character inference, and other fields , such as MNIST and Sentiment140, are supported.
- Deep Reinforcement Learning Framework [PARL](https://github.com/PaddlePaddle/PARL)
- Version v1.3 is released.
- The support for the Multi-Agent RL algorithm including MADDPG is added.
- The support for multi-card training is added. An example of a multi-card DQN algorithm is released.
- SOTA algorithms TD3 and SAC in the open source continuous control field.
- Implementation and training solution for the open source NeurIPS2019 reforcement learning challenge champion model. Trained models are open (Consideration can be given to open class)
- Paddle Graph Learning Framework [PGL](https://github.com/PaddlePaddle/PGL)
- Version v1.1 is released:
- The support for the authoritative graph learning database OGB is added. Three types of tasks including nodepropered, linkpred, and graphpropered are fully supported. A SOTA baseline is released.C Decouples the forecast library from third_party. Refactors 28 third-party-dependent compilation codes to facilitate the unified management of external dependencies.
- A graph solution PGL-Rec and a knowledge graph embedding algorithm set PGL-KE are released.
- An improvement on ease of use is made. A high-order API of PGL is released.
- Other upgrade points: Sampling of a multi-process graph is optimized and a GraphSAGE kind of models is accelerated by three times. Lod Tensor-based Graph Batch and Graph Pooling operators are added. Models including distributed heterogeneous task graph algorithm, GraphZoom, and PinSage are added for Model Zoo.
## Code Reconstruction and Upgrade
- Compilation
- A compilation thus improving the code quality.
C Fixes the codes corresponding to the warnings of -Wno-error=sign-compare (at a total of more than 100 points). An error will be reported for all subsequent warnings of this kind during compilation, option WITH_NCCL is added. Single-card users can display and specify WITH_NCCL=OFF to accelerate compilation.
- A compilation option WITH_TP_CACHE is added to cache third-party source codes to avoid repeated downloading. Windows users can set it to ON to speed up compilation and improve compilation stability.
- The `CUDA_ARCH_NAME` default value is set to `Auto` (`All` indicates compiling all GPU architectures and `Auto` indicates compiling only the current machine GPU architecture). For developers, a lot of compilation time is saved using `Auto` than using `All`, thus improving development efficiency.
- Redundant links and products and needless file copying are reduced, thus speeding up the compilation in Windows.
- External Dependency Library
- MKL-DNN is upgraded to the latest Version 1.1.
- The inference library is decoupled from `third_party` and 28 third-party-dependent compilation codes are refactored to facilitate the unified management of external dependencies.
- Two third-party-dependent private code repository, one unnecessary external dependency, and 2000+ lines of unnecessary codes under the patch are removed to improve the code repository quality.
- Code Cleanup, Refactoring, and Optimization
- The unnecessary `contrib/float16` directory is removed. The unnecessary snappy/snappystream dependency under the BRPC is deleted.
- `loss.py` and `sequence_lod.py` are split out of `python/paddle/fluid/layers/nn.py` according to the API functions, thus reducing the code quantity of `nn.py` and facilitating reading.
- The codes corresponding to the warnings of `-Wno-error=sign-compare` (at a total of more than 100 points) are fixed. An error will be reported for all subsequent warnings of this kind during compilation, thus improving the code quality.
- `WarningLnk4006/WarningLnk4221` (There are about 300) compiled by Windows MSVC is removed to improve the code repository quality.
- The quantity of reduce_op, expand_op, and expand_as_op templates is reduced to accelerate GPU compilation and reduce whl package space by 70 M.
- The pybind function of every OP is automatically generated under the dynamic graph using codes and directly called in layers to improve the dynamic graph performance and reduce the coupling degree with the static graph.
## Bug Fixes
- Fix the problem of MKL-DNN error when PaddleDetection-based Faster-RCNN uses the Python API to make a inference.
- Fix the problem of training suspension in the GPU implementation of sum op because some Tensors are not initialized.
- Fix the problem of precision loss when the value in fill_constant is set to a large integer.
- Fix the problem of precision inconsistency of softmax_with_cross_entropy_op with regard to the CUDA.
- Fix the problem that when a clone program is fixed, the stop_gradient attribute in the program can not be copied to a new program.
- Fix the problem of precision loss of elementwise_pow op with regard to integers.
- Fixed the problem that some GFLAGSs cannot perform specifying outside the inference library.
- Fix the problem of random inference core caused by some passes in Analysistor multithreading. (fc_gru_fuse_pass, seqconv_eltadd_relu_fuse_pass, attention_lstm_fuse_pass, embedding_fc_lstm_fuse_pass, fc_lstm_fuse_pass, seq_concat_fc_fuse_pass)
- Fix the error that specifying a GPU in the same process using AnalysisConfig does not take effect after NativePredictor is used to specify the use of CPU inference.
- Fix the bug of compilation error in the case of -DWITH_MKL=OFF on Windows.
- Fix the bug that tuple (Variable) cannot be input into the py_func OP; Add an code example of how to write Python OP.
- Fix the problem of the sigmoid cudnn kernel being called as the tanh cudnn kernel by mistake.
- Fix some bugs related to reshape and Conv2D depthwisecoin dynamic graph mode; fix the problem of some parameters in the network having no gradient, causing the bug of program crash.
- Fix the bug of running error of GradientClip in parameter server mode.
- Fix the problem of memory leak in full asynchronous mode of the parameter server.
## Compatibility instructions
- Static diagram: Version 1.7 is fully compatible with the previous version (1.6.0 ~ 1.6.3). The model trained in version 1.6+ can be trained or predicted in version 1.7.
- Dynamic diagram: In version 1.7, a lot of optimization has been made to improve usability. Some upgrades fail to take compatibility into account:
- The "name_scope"parameter is removed from the API provided by paddle.fluid.dygraph in a unified way: this parameter has no practical significance in design and use, and belongs to redundant parameter. In order to reduce the complexity of calling API, it is removed in a unified way.
- Some API parameter list change:
- Conv2D、Conv2DTranspose、Conv3D、Conv3DTranspose: add required parameter `num_channels` (required,int), which is used to represent the channel number of the input image.
- LayerNorm: remove `begin_norm_axis` parameter, add required parameter `normalized_shape` (required, int | list | tuple), which is used to represent shape to be normalized.
- NCE: remove parameter `dim` (required, int), which is used to represent input dimension (generally the dimension of word embedded).
- PRelu: add parameter `input_shape` (list | tuple), which is used to represent input dimension, this parameter is required only when the mode parameter is "all".
- BilinearTensorProduct: remove parameter `size`, add required parameter `input1_dim` (required, int) and `input2_dim` (required, int),which are used to represent the dimension size of the first and second input respectively.
- GroupNorm: add required parameter `num_channels` (required, int), which is used to represent the channel number of the input.
- SpectralNorm: add required parameter `weight_shape` (required, list | tuple), which is used to represent the shape of weight parameters.
- TreeConv: add parameter `feature_size` (required, int), which is used to represent the last dimension of shape of nodes_vector.
- API usage changes:
- Embedding: it is no longer required that the last dimension of the input data must be 1, and the rules of the output shape have changed.For example, in NLP tasks, Embedding in version 1.6 requires the shape of the input data to be [batch_size, seq_len, 1]. In version 1.7, to ensure that the output shape is also [batch_size, seq_len, embedding_size], the input shape must be [batch_size, seq_len],
- FC API is deleted, replace with Linear. Please refer to the documentation of linear API for specific migration methods.
- When defining Optimizer, you need to explicitly specify the parameter list to be optimized. The parameter list can be obtained directly through the parameters() of Layer.
- Change of the parameter name:
- In order to unify the parameter name of version 1.7 with the static diagram, the naming rules have been adjusted, and incremental training cannot load the model saved in the previous version (1.6.0 ~ 1.6.3).
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册