未验证 提交 6281ff04 编写于 作者: D Daniel Yang 提交者: GitHub

test=develop, test=document_fix (#2144)

LGTM
上级 2b979c42
......@@ -2,31 +2,13 @@
进阶指南
########
如果您已比较熟练使用飞桨来完成常规任务,期望了解更多飞桨在工业部署方面的能力,或者尝试自己的二次开发,请阅读:
如果您已经学会使用飞桨来完成常规任务,期望了解更多飞桨在工业部署方面的能力,请阅读:
- `数据准备 <../advanced_guide/data_preparing/index_cn.html>`_:介绍高效的同步异步数据读取方法
- `分布式训练 <../advanced_guide/distributed_training/index_cn.html>`_ :介绍如何使用分布式训练
- `预测与部署 <../advanced_guide/inference_deployment/index_cn.html>`_ :介绍如何应用训练好的模型进行预测
- `性能调优 <../advanced_guide/performance_improving/index_cn.html>`_ :介绍飞桨使用过程中的调优方法
- `模型评估/调试 <../advanced_guide/evaluation_debugging/index_cn.html>`_ :介绍模型评估与调试的典型方法
- `二次开发 <../advanced_guide/addon_development/index_cn.html>`_ :介绍如何新增Operator和如何向飞桨开源社区贡献代码
- `环境变量FLAGS <../advanced_guide/flags/flags_cn.html>`_
.. toctree::
:hidden:
data_preparing/index_cn.rst
distributed_training/index_cn.rst
inference_deployment/index_cn.rst
performance_improving/index_cn.rst
evaluation_debugging/index_cn.rst
addon_development/index_cn.rst
flags/flags_cn.rst
......@@ -8,30 +8,13 @@ Advanced User Guides
So far you have already been familiar with PaddlePaddle. And the next expectation, read more on:
- `Prepare Data <data_preparing/index_en.html>`_:How to prepare the data efficiently.
- `Distributed Training <distributed_training/index_en.html>`_ :How to apply the distributed training in your projects.
- `Deploy Inference Model <inference_deployment/index_en.html>`_ :How to deploy the trained network to perform practical inference
- `Practice Improving <performance_improving/index_en.html>`_ :How to do profiling for Fluid programs
- `Model Evaluation and Debugging <evaluation_debugging/index_en.html>`_ :How to evaluate your program.
- `Addon Development <addon_development/index_en.html>`_ :How to contribute codes and documentation to our communities
- `FLAGS <flags/flags_en.html>`_
.. toctree::
:hidden:
data_preparing/index_en.rst
distributed_training/index_en.rst
inference_deployment/index_en.rst
performance_improving/index_en.rst
evaluation_debugging/index_en.rst
addon_development/index_en.rst
flags/flags_en.rst
# 高层API介绍
# 简介
## 简介
PaddleHapi是飞桨新推出的高层API,PaddleHapi是对飞桨API的进一步封装与升级,提供了更加简洁易用的API,进一步提升了飞桨的易学易用性,并增强飞桨的功能。
......
# 飞桨2.0概述
在保持1.x版本工业级大规模高效训练和多平台快速部署优势的前提,飞桨2.0版本重点提升了框架的易用性,主要在用户交互层进行了优化,降低学习门槛,提升开发效率。不管对于初学者还是资深专家,都能够更容易地使用飞桨进行深度学习任务开发,加速前沿算法研究和工业级任务开发。
此版本为测试版,还在迭代开发中,目前还没有稳定,后续API会根据反馈有可能进行不兼容的升级。对于想要体验飞桨最新特性的开发者,欢迎试用此版本;对稳定性要求高的工业级应用场景推荐使用Paddle 1.8稳定版本。此版本主推命令式(imperative)开发模式,并提供了高层API的封装。命令式开发模式具有很好的灵活性,高层API可以大幅减少重复代码。对于初学者或基础的任务场景,推荐使用高层API的开发方式,简单易用;对于资深开发者想要实现复杂的功能,推荐使用动态图的API,灵活高效。
跟1.x版本对比,飞桨2.0版本的重要升级如下:
| | 飞桨1.x版本 | 飞桨2.0版本 |
| -------- | ---------------------------------- | ------------------------------------- |
| 开发模式 | 推荐声明式(declarative) | 推荐命令式(imperative) |
| 组网方式 | 推荐函数式组网 | 推荐面向对象式组网 |
| 高层API | 无 | 封装常见的操作,实现低代码开发 |
| 基础API | fluid目录,结构不清晰,存在过时API | paddle目录,整体结构调整,清理废弃API |
## 开发模式
飞桨同时支持声明式和命令式这两种开发模式,兼具声明式编程的高效和命令式编程的灵活。
声明式编程模式(通常也被称为静态模式或define-and-run模式),程序可以明确分为网络结构定义和执行这两个阶段。定义阶段声明网络结构,此时并未传入具体的训练数据;执行阶段需要用户通过feed的方式传入具体数据,完成计算后,通过fetch的方式返回计算结果。示例如下:
```python
import numpy
import paddle
# 定义输入数据占位符
a = paddle.nn.data(name="a", shape=[1], dtype='int64')
b = paddle.nn.data(name="b", shape=[1], dtype='int64')
# 组建网络(此处网络仅由一个操作构成,即elementwise_add)
result = paddle.elementwise_add(a, b)
# 准备运行网络
cpu = paddle.CPUPlace() # 定义运算设备,这里选择在CPU下训练
exe = paddle.Executor(cpu) # 创建执行器
# 创建输入数据
x = numpy.array([2])
y = numpy.array([3])
# 运行网络
outs = exe.run(
feed={'a':x, 'b':y}, # 将输入数据x, y分别赋值给变量a,b
fetch_list=[result] # 通过fetch_list参数指定需要获取的变量结果
)
#输出运行结果
print (outs)
#[array([5], dtype=int64)]
```
声明式开发模式的优点为在程序执行之前,可以拿到全局的组网信息,方便对计算图进行全局的优化,提升性能;并且由于全局计算图的存在,方便将计算图导出到文件,方便部署到非python语言的开发环境中,比如:C/C++/JavaScript等。声明式开发模式的缺点为,由于网络定义和执行阶段分离,在定义的时候并不知道所执行的具体的数据,程序的开发和调试会比较困难。
命令式编程模式(通常也被称为动态模式、eager模式或define-by-run模式),程序在网络结构定义的同时立即执行,能够实时的到执行结果。示例如下:
```python
import numpy
import paddle
from paddle.imperative import to_variable
# 切换命令式编程模式
paddle.enable_imperative()
# 创建数据
x = to_variable(numpy.array([2]))
y = to_variable(numpy.array([3]))
# 定义运算并执行
z = paddle.elementwise_add(x, y)
# 输出执行结果
print (z.numpy())
```
飞桨2.0推荐开发者使用命令式编程,可以使用原生python控制流API,具有灵活,容易开发调试的优点;同时为了兼具声明式编程在性能和部署方面的优势,飞桨提供了自动转换功能,可以将包含python控制流的代码,转换为Program,通过底层的Executor进行执行。
## 组网方式
飞桨1.x大量使用函数式的组网方式,这种方法的好处是写法很简洁,但表达能力偏弱,比如:如果我们想要查看fc隐含的参数的值或者想要对某一个参数进行裁剪时,会很困难,我们需要操作隐含的参数名才能访问。比如:
```python
import paddle.fluid as fluid
data = fluid.layers.data(name="data", shape=[32, 32], dtype="float32")
fc = fluid.layers.fc(input=data, size=1000, act="tanh")
```
飞桨2.0推荐使用面向对象式的组网方式,需要通过继承`paddle.nn.Layer`类的`__init__``forward`函数实现网络结构自定义,这种方式通过类的成员变量,方便地访问到每个类的成员,比如:
```python
import paddle
class SimpleNet(paddle.nn.Layer):
def __init__(self, in_size, out_size):
super(SimpleNet, self).__init__()
self._linear = paddle.nn.Linear(in_size, out_size)
def forward(self, x):
y = self._linear(x)
return y
```
## 高层API
使用飞桨进行深度学习任务的开发,整体过程包括数据处理、组网、训练、评估、模型导出、预测部署这些基本的操作。这些基本操作在不同的任务中会反复出现,使用基础API进行开发时,需要开发者重复地写这些基础操作的代码,增加了模型开发的工作量。高层API针对这些基础操作进行了封装,提供更高层的开发接口,开发者只需要关心数据处理和自定义组网,其他工作可以通过调用高层API来完成。在MNIST手写数字识别任务中,对比动态图基础API的实现方式,通过使用高层API可以减少80%的非组网类代码。
使用高层API的另外一个好处是,可以通过一行代码`paddle.enable_imperative`,切换命令式编程模式和声明式编程模式。在开发阶段,可以使用的命令式编程模式,方便调试;开发完成后,可以切换到声明式编程模式,加速训练和方便部署。兼具了命令式编程实时执行,容易调试的优点,以及声明式编程全局优化和容易部署的优点。
以下为高层API的一个基础示例
```python
import numpy as np
import paddle
import paddle.nn.functional as F
from paddle.incubate.hapi.model import Model, Input, Loss
from paddle.incubate.hapi.loss import CrossEntropy
#高层API的组网方式需要继承Model,Model类实现了模型执行所需的逻辑
class SimpleNet(Model):
def __init__(self, in_size, out_size):
super(SimpleNet, self).__init__()
self._linear = paddle.nn.Linear(in_size, out_size)
def forward(self, x):
y = self._linear(x)
z = self._linear(y)
pred = F.softmax(z)
return pred
#兼容声明式开发模式,定义数据形状类型,如果不使用声明式编程模式,可以不定义数据占位符
inputs = [Input([None, 8], 'float32', name='image')]
labels = [Input([None, 1], 'int64', name='labels')]
#定义模型网络结构,包括指定损失函数和优化算法
model = SimpleNet(8, 8)
optimizer = paddle.optimizer.AdamOptimizer(learning_rate=0.1, parameter_list=model.parameters())
model.prepare(optimizer, CrossEntropy(), None, inputs, labels, device='cpu')
#切换执行模式
paddle.enable_imperative(paddle.CPUPlace())
#基于batch的训练
batch_num = 10
x = np.random.random((4, 8)).astype('float32')
y = np.random.randint(0, 8, (4, 1)).astype('int64')
for i in range(batch_num):
model.train_batch(inputs=x, labels=y)
```
更多高层API开发的模型和示例请参考github Repo: [hapi](https://github.com/paddlepaddle/hapi)
## 基础API
飞桨2.0提供了新的API,可以同时支持声明式和命令式两种开发模式,比如paddle.nn.Linear,避免在两种模式下使用不同的API造成困惑。原飞桨1.x的API位于paddle.fluid目录下,其中部分组网类的API,只能用于声明式开发,比如:fluid.layers.fc,无法用于命令式开发。
飞桨2.0对API的目录结构进行了调整,从原来的paddle.fluid目录调整到paddle目录下,使得开发接口更加清晰,调整后的目录结构如下:
| 目录 | 功能和包含API |
| ----------------- | ------------------------------------------------------------ |
| paddle.* | paddle根目录下保留了常用API的别名,当前包括:paddle.tensor, paddle.framework目录下的所有API |
| paddle.tensor | 跟tensor操作相关的API,比如:创建zeros, 矩阵运算matmul, 变换concat, 计算elementwise_add, 查找argmax等 |
| paddle.nn | 跟组网相关的API,比如:输入占位符data/Input,控制流while_loop/cond,损失函数,卷积,LSTM等,激活函数等 |
| paddle.framework | 基础框架相关的API,比如:Variable, Program, Executor等 |
| paddle.imperative | imprerative模式专用的API,比如:to_variable, prepare_context等 |
| paddle.optimizer | 优化算法相关API,比如:SGD,Adagrad, Adam等 |
| paddle.metric | 评估指标计算相关的API,比如:accuracy, cos_sim等 |
| paddle.io | 数据输入输出相关API,比如:save, load, Dataset, DataLoader等 |
| paddle.device | 设备管理相关API,比如:CPUPlace, CUDAPlace等 |
| paddle.fleet | 分布式相关API |
同时飞桨2.0对部分Paddle 1.x版本的API进行了清理,删除了部分不再推荐使用的API,具体信息请参考Release Note。
.. toctree::
:hidden:
basic_concept/index_cn.rst
dygraph/DyGraph.md
hapi.md
快速上手
===========
飞桨2.0概述
-----------
在保持1.x版本工业级大规模高效训练和多平台快速部署优势的前提,飞桨2.0版本重点提升了框架的易用性,主要在用户交互层进行了优化,降低学习门槛,提升开发效率。不管对于初学者还是资深专家,都能够更容易地使用飞桨进行深度学习任务开发,加速前沿算法研究和工业级任务开发。
此版本为测试版,还在迭代开发中,目前还没有稳定,后续API会根据反馈有可能进行不兼容的升级。对于想要体验飞桨最新特性的开发者,欢迎试用此版本;对稳定性要求高的工业级应用场景推荐使用Paddle
1.8稳定版本。此版本主推命令式(imperative)开发模式,并提供了高层API的封装。命令式开发模式具有很好的灵活性,高层API可以大幅减少重复代码。对于初学者或基础的任务场景,推荐使用高层API的开发方式,简单易用;对于资深开发者想要实现复杂的功能,推荐使用动态图的API,灵活高效。
1.x版本对比,飞桨2.0版本的重要升级如下:
+------------+--------------------------------------+-----------------------------------------+
| | 飞桨1.x版本 | 飞桨2.0版本 |
+============+======================================+=========================================+
| 开发模式 | 推荐声明式(declarative) | 推荐命令式(imperative) |
+------------+--------------------------------------+-----------------------------------------+
| 组网方式 | 推荐函数式组网 | 推荐面向对象式组网 |
+------------+--------------------------------------+-----------------------------------------+
| 高层API | | 封装常见的操作,实现低代码开发 |
+------------+--------------------------------------+-----------------------------------------+
| 基础API | fluid目录,结构不清晰,存在过时API | paddle目录,整体结构调整,清理废弃API |
+------------+--------------------------------------+-----------------------------------------+
开发模式
--------
飞桨同时支持声明式和命令式这两种开发模式,兼具声明式编程的高效和命令式编程的灵活。
声明式编程模式(通常也被称为静态模式或define-and-run模式),程序可以明确分为网络结构定义和执行这两个阶段。定义阶段声明网络结构,此时并未传入具体的训练数据;执行阶段需要用户通过feed的方式传入具体数据,完成计算后,通过fetch的方式返回计算结果。示例如下:
.. code:: python
import numpy
import paddle
# 定义输入数据占位符
a = paddle.nn.data(name="a", shape=[1], dtype='int64')
b = paddle.nn.data(name="b", shape=[1], dtype='int64')
# 组建网络(此处网络仅由一个操作构成,即elementwise_add
result = paddle.elementwise_add(a, b)
# 准备运行网络
cpu = paddle.CPUPlace() # 定义运算设备,这里选择在CPU下训练
exe = paddle.Executor(cpu) # 创建执行器
# 创建输入数据
x = numpy.array([2])
y = numpy.array([3])
# 运行网络
outs = exe.run(
feed={'a':x, 'b':y}, # 将输入数据x, y分别赋值给变量ab
fetch_list=[result] # 通过fetch_list参数指定需要获取的变量结果
)
#输出运行结果
print (outs)
#[array([5], dtype=int64)]
声明式开发模式的优点为在程序执行之前,可以拿到全局的组网信息,方便对计算图进行全局的优化,提升性能;并且由于全局计算图的存在,方便将计算图导出到文件,方便部署到非python语言的开发环境中,比如:C/C++/JavaScript等。声明式开发模式的缺点为,由于网络定义和执行阶段分离,在定义的时候并不知道所执行的具体的数据,程序的开发和调试会比较困难。
命令式编程模式(通常也被称为动态模式、eager模式或define-by-run模式),程序在网络结构定义的同时立即执行,能够实时的到执行结果。示例如下:
.. code:: python
import numpy
import paddle
from paddle.imperative import to_variable
# 切换命令式编程模式
paddle.enable_imperative()
# 创建数据
x = to_variable(numpy.array([2]))
y = to_variable(numpy.array([3]))
# 定义运算并执行
z = paddle.elementwise_add(x, y)
# 输出执行结果
print (z.numpy())
飞桨2.0推荐开发者使用命令式编程,可以使用原生python控制流API,具有灵活,容易开发调试的优点;同时为了兼具声明式编程在性能和部署方面的优势,飞桨提供了自动转换功能,可以将包含python控制流的代码,转换为Program,通过底层的Executor进行执行。
组网方式
--------
飞桨1.x大量使用函数式的组网方式,这种方法的好处是写法很简洁,但表达能力偏弱,比如:如果我们想要查看fc隐含的参数的值或者想要对某一个参数进行裁剪时,会很困难,我们需要操作隐含的参数名才能访问。比如:
.. code:: python
import paddle.fluid as fluid
data = fluid.layers.data(name="data", shape=[32, 32], dtype="float32")
fc = fluid.layers.fc(input=data, size=1000, act="tanh")
飞桨2.0推荐使用面向对象式的组网方式,需要通过继承\ ``paddle.nn.Layer``\ 类的\ ``__init__``\ \ ``forward``\ 函数实现网络结构自定义,这种方式通过类的成员变量,方便地访问到每个类的成员,比如:
.. code:: python
import paddle
class SimpleNet(paddle.nn.Layer):
def __init__(self, in_size, out_size):
super(SimpleNet, self).__init__()
self._linear = paddle.nn.Linear(in_size, out_size)
def forward(self, x):
y = self._linear(x)
return y
高层API
-------
使用飞桨进行深度学习任务的开发,整体过程包括数据处理、组网、训练、评估、模型导出、预测部署这些基本的操作。这些基本操作在不同的任务中会反复出现,使用基础API进行开发时,需要开发者重复地写这些基础操作的代码,增加了模型开发的工作量。高层API针对这些基础操作进行了封装,提供更高层的开发接口,开发者只需要关心数据处理和自定义组网,其他工作可以通过调用高层API来完成。在MNIST手写数字识别任务中,对比动态图基础API的实现方式,通过使用高层API可以减少80%的非组网类代码。
使用高层API的另外一个好处是,可以通过一行代码\ ``paddle.enable_imperative``\ ,切换命令式编程模式和声明式编程模式。在开发阶段,可以使用的命令式编程模式,方便调试;开发完成后,可以切换到声明式编程模式,加速训练和方便部署。兼具了命令式编程实时执行,容易调试的优点,以及声明式编程全局优化和容易部署的优点。
以下为高层API的一个基础示例
.. code:: python
import numpy as np
import paddle
import paddle.nn.functional as F
from paddle.incubate.hapi.model import Model, Input, Loss
from paddle.incubate.hapi.loss import CrossEntropy
#高层API的组网方式需要继承ModelModel类实现了模型执行所需的逻辑
class SimpleNet(Model):
def __init__(self, in_size, out_size):
super(SimpleNet, self).__init__()
self._linear = paddle.nn.Linear(in_size, out_size)
def forward(self, x):
y = self._linear(x)
z = self._linear(y)
pred = F.softmax(z)
return pred
#兼容声明式开发模式,定义数据形状类型,如果不使用声明式编程模式,可以不定义数据占位符
inputs = [Input([None, 8], 'float32', name='image')]
labels = [Input([None, 1], 'int64', name='labels')]
#定义模型网络结构,包括指定损失函数和优化算法
model = SimpleNet(8, 8)
optimizer = paddle.optimizer.AdamOptimizer(learning_rate=0.1, parameter_list=model.parameters())
model.prepare(optimizer, CrossEntropy(), None, inputs, labels, device='cpu')
#切换执行模式
paddle.enable_imperative(paddle.CPUPlace())
#基于batch的训练
batch_num = 10
x = np.random.random((4, 8)).astype('float32')
y = np.random.randint(0, 8, (4, 1)).astype('int64')
for i in range(batch_num):
model.train_batch(inputs=x, labels=y)
更多高层API开发的模型和示例请参考github Repo:
`hapi <https://github.com/paddlepaddle/hapi>`__
基础API
-------
飞桨2.0提供了新的API,可以同时支持声明式和命令式两种开发模式,比如paddle.nn.Linear,避免在两种模式下使用不同的API造成困惑。原飞桨1.xAPI位于paddle.fluid目录下,其中部分组网类的API,只能用于声明式开发,比如:fluid.layers.fc,无法用于命令式开发。
飞桨2.0API的目录结构进行了调整,从原来的paddle.fluid目录调整到paddle目录下,使得开发接口更加清晰,调整后的目录结构如下:
+---------------------+-----------------------------------------------------------------------------------------------------------+
| 目录 | 功能和包含API |
+=====================+===========================================================================================================+
| paddle.\* | paddle根目录下保留了常用API的别名,当前包括:paddle.tensor, paddle.framework目录下的所有API |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.tensor | tensor操作相关的API,比如:创建zeros, 矩阵运算matmul, 变换concat, 计算elementwise\_add, 查找argmax |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.nn | 跟组网相关的API,比如:输入占位符data/Input,控制流while\_loop/cond,损失函数,卷积,LSTM等,激活函数等 |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.framework | 基础框架相关的API,比如:Variable, Program, Executor |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.imperative | imprerative模式专用的API,比如:to\_variable, prepare\_context |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.optimizer | 优化算法相关API,比如:SGDAdagrad, Adam |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.metric | 评估指标计算相关的API,比如:accuracy, cos\_sim |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.io | 数据输入输出相关API,比如:save, load, Dataset, DataLoader |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.device | 设备管理相关API,比如:CPUPlace CUDAPlace |
+---------------------+-----------------------------------------------------------------------------------------------------------+
| paddle.fleet | 分布式相关API |
+---------------------+-----------------------------------------------------------------------------------------------------------+
同时飞桨2.0对部分Paddle
1.x版本的API进行了清理,删除了部分不再推荐使用的API,具体信息请参考Release
Note
.. toctree::
:hidden:
basic_concept/index_cn.rst
dygraph/DyGraph.md
hapi.md
......@@ -12,8 +12,6 @@
install/index_cn.rst
beginners_guide/index_cn.rst
user_guides/index_cn.rst
advanced_guide/index_cn.rst
api_cn/index_cn.rst
faq/index_cn.rst
release_note_cn.md
......@@ -6,8 +6,6 @@
install/index_en.rst
beginners_guide/index_en.rst
user_guides/index_en.rst
advanced_guide/index_en.rst
api/index_en.rst
faq/index_en.rst
release_note_en.md

# Release Note
# Release Note
## 重要更新
## 重要声明
本版本深度优化了命令式编程模式(动态图)的功能、性能和体验,框架基础功能也进一步强化;原生推理库性能显著优化,轻量化推理引擎PaddleLite实现了对硬件支持的极大覆盖,PaddleServing全面升级,提供功能强大简单易用的服务化部署能力。对应的开发套件和工具组件进一步丰富完善,既有套件组件的功能和体验持续提升,全新发布PaddleClas视觉分类套件和量桨Paddle Quantum量子机器学习框架
- 此版本为测试版,还在迭代中,目前还没有稳定,后续API会根据反馈有可能进行不兼容的升级。对于想要体验飞桨最新特性的开发者,欢迎试用此版本;对稳定性要求高的工业级应用场景推荐使用Paddle 1.8稳定版本
**训练框架** :深度优化了命令式编程(动态图)功能、性能和体验,特别是增强了动静转换的能力,能支持依赖数据的控制流的动态图实现进行静态存储部署,也可以转为静态图模式训练;Data Loader的功能和梯度裁剪的使用方式进一步优化;声明式编程模式下多卡运行时fetch不定长Tensor等问题得到解决,混合精度配合重计算显示出支持大Batch训练很好的成效。新增了大量API,并新增 ComplexVariable,支持复数张量的表示和常见的复数运算
- 此版本主推动态图的开发方式,并提供了高层API的封装。动态图模式具有很好的灵活性,高层API可以大幅减少重复代码。对于初学者或基础的任务场景,推荐使用高层API的开发方式,简单易用;对于资深开发者想要实现复杂的功能,推荐使用动态图的API,灵活高效
**预测部署** :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目录体系做了优化,原目录下API会建立alias仍然可用,但建议新的程序使用新目录结构。
## 基础框架
### 新增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官网信息保持同步。
### 基础API
- 组网类API实现动静统一,支持在动态和静态图两种模式下运行
- API目录结构调整,Paddle 1.x 版本的API主要位于paddle.fluid目录,本版本对API目录结构进行调整,使得分类更为合理,具体调整规则如下:
- 原fluid.layers下跟tensor操作相关的API移动到paddle.tensor目录
- 原fluid.layers下跟组网相关的操作移动到paddle.nn目录,带有参数的类型放到paddle.nn.layers目录,函数式的API放到paddle.nn.functional目录
- 原fluid.dygraph下动态图专用API移动到paddle.imperative目录
- 创建paddle.framework目录,用来存放跟框架相关的Program, Executor等API
- 创建paddle.distributed目录,用来存放分布式相关的API
- 创建paddle.optimizer目录,用来存放优化算法相关的API
- 创建paddle.metric目录,用来创建评估指标计算相关的API
- 创建paddle.incubate目录,用来存放孵化中的代码,其中的API有可能会发生调整,该目录存放了复数计算complex和高层API相关的代码
- 所有在paddle.tensor和paddle.framework目录下的API,在paddle目录下创建别名,比如:paddle.tensor.creation.ones可以使用paddle.ones别名
- 新增API如下:
- 在paddle.nn目录新增8个组网类的API: interpolate, LogSoftmax, ReLU, Sigmoid, loss.BCELoss, loss.L1Loss, loss.MSELoss, loss.NLLLoss
- 在paddle.tensor目录新增59个Tensor相关API:add, addcmul, addmm, allclose, arange, argmax, atan, bmm, cholesky, clamp, cross, diag_embed, dist, div, dot, elementwise_equal, elementwise_sum, equal, eye, flip, full, full_like, gather, index_sample, index_select, linspace, log1p, logsumexp, matmul, max, meshgrid, min, mm, mul, nonzero, norm, ones, ones_like, pow, randint, randn, randperm, roll, sin, sort, split, sqrt, squeeze, stack, std, sum, t, tanh, tril, triu, unsqueeze, where, zeros, zeros_like
- 新增device_guard用来指定设备,新增manual_seed用来初始化随机数种子
### 高层API
- 新增paddle.incubate.hapi目录,对模型开发过程中常见的组网、训练、评估、预测、存取等操作进行封装,实现低代码开发,MNIST手写数字识别任务对比动态图实现方式,高层API可减少80%执行类代码。
- 新增Model类封装,继承Layer类,封装模型开发过程中常用的基础功能,包括:
- 提供prepare接口,用于指定损失函数和优化算法
- 提供fit接口,实现训练和评估,可通过callback方式实现训练过程中执行自定义功能,比如模型存储等
- 提供evaluate接口,实现评估集上的预测和评估指标计算
- 提供predict接口,实现特定的测试数据推理预测
- 提供train_batch接口,实现单batch数据的训练
- 新增Dataset接口,对常用数据集进行封装,支持数据的随机访问
- 新增常见Loss和Metric类型的封装
- 新增CV领域Resize, Normalize等16种常见的数据处理接口
- 新增CV领域lenet, vgg, resnet, mobilenetv1, mobilenetv2图像分类骨干网络
- 新增NLP领域MultiHeadAttention, BeamSearchDecoder, TransformerEncoder, TransformerDecoder , DynamicDecode API接口
- 发布基于高层API实现的12个模型,Transformer,Seq2seq, LAC,BMN, ResNet, YOLOv3, , VGG, MobileNet, TSM, CycleGAN, Bert, OCR
### 性能优化
- 命令式编程模式(“动态图”):
- 为降低框架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
* 视觉模型丰富度提升,预训练模型总数,预训练模型总数达到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与交互全新升级,提供更好的本地化支持,可视化分析更清晰、直观,给用户沉浸式体验
- 与飞桨开发套件与工具组件深度融合,提供更流畅的深度学习开发体验
- 新增`reshape+transpose+matmul` fuse,使得Ernie量化后 INT8 模型在原来基础上性能提升~4%(在6271机器上)。量化后INT8模型相比未经过DNNL优化(包括fuses等)和量化的FP32模型提速~6.58倍
### 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模型
- 针对Program打印内容过于冗长,在调试中利用效率不高的问题,大幅简化Program、Block、Operator、Variable等对象的打印字符串,不损失有效信息的同时提升调试效率
- 针对第三方库接口`boost::get`不安全,运行中抛出异常难以调试的问题,增加`BOOST_GET`系列宏替换了Paddle中600余处存在风险的`boost::get`,丰富出现`boost::bad_get`异常时的报错信息,具体增加了C++报错信息栈,出错文件及行号、期望输出类型和实际类型等,提升调试体验
### PARL
* 开源工业界首个进化学习应用框架EvoKit
* 新增Multi-Agent RL算法支持,包括MADDPG
* 新增多卡训练支持,发布多卡DQN算法示例
* 开源连续控制领域的SOTA算法TD3和SAC
* NeurIPS2019强化学习挑战赛事冠军模型以及训练方案开源
## Bug修复
### Paddle Quantum(量子计算实验室)
* Paddle Quantum(量桨)初版发布。量桨是基于百度飞桨开发的量子机器学习工具集,支持量子神经网络的搭建与训练,提供易用的量子机器学习开发套件与量子优化、量子化学等前沿量子应用工具集,使得飞桨成为国内首个支持量子机器学习的深度学习平台。
- 支持 QAOA 算法实现,完成最大割 (Max-Cut) 问题的解决
- 支持 VQE 算法实现,计算 H_2 的最小特征值
- 支持 SSVQE 算法实现,计算给定哈密顿量的特征谱
- 支持 VQSD 算法实现,计算量子态对角化后的形式,给出量子态的特征分解
- 支持 Gibbs 算法实现,生成给定哈密顿量在确定温度下的吉布斯态
- 支持量子计算常用函数
- 支持描述U_Ansatz量子电路
- 修复while loop中存在slice操作时计算结果错误的bug
- 修复inplace ops引起的transformer 模型性能下降问题
- 通过完善cache key, 解决Ernie精度测试最后一个batch运行失败的问题
- 修复fluid.dygraph.guard等context中出现异常时无法正确退出的问题
# Release Note
## Important Statements
- This version is a beta version. It is still in iteration and is not stable at present. Incompatible upgrade may be subsequently performed on APIs based on the feedback. For developers who want to experience the latest features of Paddle, welcome to this version. For industrial application scenarios requiring high stability, the stable Paddle Version 1.8 is recommended.
- This version mainly popularizes the dynamic graph development method and provides the encapsulation of high-level APIs. The dynamic graph mode has great flexibility and high-level APIs can greatly reduces duplicated codes. For beginners or basic task scenarios, the high-level API development method is recommended because it is simple and easy to use. For senior developers who want to implement complex functions, the dynamic graph API is commended because it is flexible and efficient.
- This version also optimizes the Paddle API directory system. The APIs in the original directory can create an alias and are still available, but it is recommended that new programs use the new directory structure.
## Basic Framework
### Basic APIs
- Networking APIs achieve dynamic and static unity and support operation in dynamic and static graph modes
- The API directory structure is adjusted. In the Paddle Version 1.x, the APIs are mainly located in the paddle.fluid directory. This version adjusts the API directory structure so that the classification is more reasonable. The specific adjustment rules are as follows:
- Moves the APIs related to the tensor operations in the original fluid.layers directory to the paddle.tensor directory
- Moves the networking-related operations in the original fluid.layers directory to the paddle.nn directory. Puts the types with parameters in the paddle.nn.layers directory and the functional APIs in the paddle.nn.functional directory
- Moves the special API for dynamic graphs in the original fluid.dygraph directory to the paddle.imperative directory
- Creates a paddle.framework directory that is used to store framework-related program, executor, and other APIs
- Creates a paddle.distributed directory that is used to store distributed related APIs
- Creates a paddle.optimizer directory that is used to store APIs related to optimization algorithms
- Creates a paddle.metric directory that is used to create APIs related to evaluation index calculation
- Creates a paddle.incubate directory that is used to store incubating codes. APIs may be adjusted. This directory stores codes related to complex number computation and high-level APIs
- Creates an alias in the paddle directory for all APIs in the paddle.tensor and paddle.framework directories. For example, paddle.tensor.creation.ones can use paddle.ones as an alias
- The added APIs are as follows:
- Adds eight networking APIs in the paddle.nn directory: interpolate, LogSoftmax, ReLU, Sigmoid, loss.BCELoss, loss.L1Loss, loss.MSELoss, and loss.NLLLoss
- Adds 59 tensor-related APIs in the paddle.tensor directory: add, addcmul, addmm, allclose, arange, argmax, atan, bmm, cholesky, clamp, cross, diag\_embed, dist, div, dot, elementwise\_equal, elementwise\_sum, equal, eye, flip, full, full\_like, gather, index\_sample, index\_select, linspace, log1p, logsumexp, matmul, max, meshgrid, min, mm, mul, nonzero, norm, ones, ones\_like, pow, randint, randn, randperm, roll, sin, sort, split, sqrt, squeeze, stack, std, sum, t, tanh, tril, triu, unsqueeze, where, zeros, and zeros\_like
- Adds device\_guard that is used to specify a device. Adds manual\_seed that is used to initialize a random number seed
### High-level APIs
- Adds a paddle.incubate.hapi directory. Encapsulates common operations such as networking, training, evaluation, inference, and access during the model development process. Implements low-code development. Uses the dynamic graph implementation mode of MNIST task comparison. High-level APIs can reduce 80% of executable codes.
- Adds model-type encapsulation. Inherits the layer type. Encapsulates common basic functions during the model development process, including:
- Provides a prepare API that is used to specify a loss function and an optimization algorithm
- Provides a fit API to implement training and evaluation. Implements the execution of model storage and other user-defined functions during the training process by means of callback
- Provides an evaluate interface to implement the inference and evaluation index calculation on the evaluation set
- Provides a predict interface to implement specific test data inference
- Provides a train\_batch interface to implement the training of single-batch data
- Adds a dataset interface to encapsulate commonly-used data sets and supports random access to data
- Adds encapsulation of common Loss and Metric types
- Adds 16 common data processing interfaces including Resize and Normalize in the CV field
- Adds lenet, vgg, resnet, mobilenetv1, and mobilenetv2 image classification backbone networks in the CV field
- Adds MultiHeadAttention, BeamSearchDecoder, TransformerEncoder, TransformerDecoder, and DynamicDecode APIs in the NLP field
- Releases 12 models based on high-level API implementation, including Transformer, Seq2seq, LAC, BMN, ResNet, YOLOv3, VGG, MobileNet, TSM, CycleGAN, Bert, and OCR
### Performance Optimization
- Adds a `reshape+transpose+matmul` fuse so that the performance of the INT8 model is improved by about 4% (on the 6271 machine) after Ernie quantization. After the quantization, the speed of the INT8 model is increased by about 6.58 times compared with the FP32 model on which DNNL optimization (including fuses) and quantization are not performed
### Debugging Analysis
- To solve the problem of program printing contents being too lengthy and low utilization efficiency during debugging, considerably simplifies the printing strings of objects such as programs, blocks, operators, and variables, thus improving the debugging efficiency without losing effective information
- To solve the problem of insecure third-party library APIs `boost::get` and difficulty in debugging due to exceptions during running, adds the `BOOST_GET` series of macros to replace over 600 risky `boost::get` in Paddle. Richens error message during `boost::bad_get` exceptions. Specifically, adds the C++ error message stack, error file and line No., expected output type, and actual type, thus improving the debugging experience
## Bug Fixes
- Fix the bug of wrong computation results when any slice operation exists in the while loop
- Fix the problem of degradation of the transformer model caused by inplace ops
- Fix the problem of running failure of the last batch in the Ernie precision test
- Fix the problem of failure to correctly exit when exceptions occur in context of fluid.dygraph.guard
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册