Release Note

重要更新

本版本主要是对2.1.0中一些功能和性能问题的修复,并对部分功能点做了增强,重点如下:

  • 完成了 paddle.distributed、paddle.device、paddle.vision 目录API的可见性优化。

  • 动态图转静态图新增对 paddle.nn.Sequential容器内 sublayer 的用户代码的动静转换。

  • 动态图增加 SyncBatchNorm 对AMP的支持,提升动态图 SyncBatchNorm 层在AMP模式的性能。

训练框架

功能优化(含分布式)

基础API

  • paddle.distributed、paddle.device、paddle.vision 等层级新增推荐使用方式,推荐使用方式的具体说明请见下文2.1.0 Release Note。(#33420)

  • 新增 paddle.is_compiled_with_rocm 。(#33228)

  • 新增 paddle.strided_slice bool type输入的支持。(#33373

  • 新增 paddle.equal_all、paddle.equal、paddle.greater_equal、paddle.greater_than、paddle.less_equal、paddle.less_than、paddle.not_equal bool type输入的支持。 (#33551

  • 修复 paddle.utils.download 在ConnectionError异常时不进行Retry逻辑。(#33454

  • 修复 paddle.gather 在axis不等于0下,infershape错误的问题。(#33553

  • 修复 paddle.io.DataLoadernum_workers=0Dataset 生成GPU Tensor 送入DataLoader 时导致的段错误。(#33487, #33249

  • 修复 slice 操作结果作为左值使用inplace操作时,反向运行报错提示与错误无关的问题。(#32981

  • 修复 paddle.concat 动态图支持 uint8 出错的问题。(#33667)

  • 修复 paddle.grid_sample 显存溢出和输出结果异常的问题。(#33100#33232

  • 修复 roi_align 中align=True模式下输入为0时的问题。(#33446

  • 修复了在特定情况下 log_softmax 会把输入改为nan的问题。(#32937

动态图转静态图

  • 新增支持对 paddle.nn.Sequential容器内 sublayer 的用户代码的动静转换。(#33065

  • 修复了在控制流 for 语句转换中,在变量静态类型分析阶段未正确处理 Subscript 语法的问题。(#32969

  • 重构了动转静 param_guard 逻辑代码,全面解决动静态图 Tensor 类型互转问题。(#32985

分布式训练

  • 修复 paddle.distributed.spawn 在使用默认 nprocs 参数时出错的问题。(#33249

  • 修复流水线并行通信组创建不一致导致训练启动hang住的问题。(#32890#33473

  • 修复混合并行中保存参数失败的问题。(#33595#33588

  • 修复Fleet API无法直接运行 Program 的问题。(#33511

  • 修复异构参数服务器纯GPU训练模式中样本分桶不均导致hang住的问题。(#32957

动态图混合并行
  • 修复 TensorParallel 的精度问题。改变 TensorParallel 的参数初始化方式,保证参数切分后的随机性。(#33087

  • 修复 PipeLineParallel 的精度问题。解决 PipeLineParallelmicrobatch 使用不正确的问题。(#33097

  • 修复 new_group API创建多个通信组,会hang的问题。(#33553

混合精度训练

  • 动态图增加 SyncBatchNorm 对AMP的支持,提升动态图 SyncBatchNorm 层在AMP模式的性能,在PaddleSegDeepLabV3P模型上8卡AMP模式加速比提升19%。(#33709)

自定义OP

  • 移除了自定义OP编译时对 PADDLE_WITH_MKLDNN 宏的依赖。(#32903

  • 默认设置 GLIBCXX_USE_CXX11_ABI=1 以解决GCC版本过低导致编译时可能报错的问题。(#33185

  • 新增支持c++14的语法特性,默认开启-std=c++14编译选项。 (#33227

其他

  • 修复了多线程下 LoDTensorArray 作为Op输入时,训练会随机出段错误的问题。(#32984

  • 修复 paddle.ParamAttr 的 regularizer 和 paddle.optimizer.Momentumweight_decay 同时被指定为 L2Decay 时,参数正则化被执行2次的问题。(#32881

  • 修复windows系统下warning信息可能显示乱码问题。(#33689

推理部署

模型量化

  • 修复动态图量化训练功能中跳过OP量化的问题。(#32879

  • 修复量化模型保存时 layer_norm不保存 out_threahold 属性的问题。(#33610

Paddle Inference

功能升级

  • Paddle-TRT新增 gather_ndreduce_sum 的converter/plugin。(#33365

  • Paddle-TRT新增 reshape 。(#33372

性能优化

  • 增加TensorRT的 layer_norm 动态shape plugin,提升模型动态shape推理性能。(#33448

易用性优化

  • 新增 Paddle Inference ROCm 版的预测示例文档以及增加C++预测库的version.txt中与ROCM相关版本信息 (#33290)

  • 更新了XPU的编译选项,具体编译选项请参考 #33581

问题修复

  • 修复 fused_fc_elementwise_layernorm 在海光DCU下的线程数过大导致的计算结果错误问题。 (#33299)

  • 修复yolov3模型在Jetson Nano和Jetson TX2上开启gpu后运行失败的问题。(#33442)

  • Paddle-TensorRT plugin multihead_matmul 修复当seq_len > 1024的计算错误。(#33365

  • 修复了ERNIE 模型变长情况下,输入的顺序不一致导致输出结果不对的问题。(#33622

  • 修复OCR模型在GPU上预测报错问题。(#33431)

  • 修复 paddle.static.io.normalize_program 没有导出 paddle.static.normalize_program 的问题。(#33408

  • 修复TensorRT6.0使用stride > 1的conv失败的问题。(#33198 )

  • 修复批量推理图片时的显存访问越界错误。(#33370 )(#33531 )

  • 修复X86 CPU上MKLDNN缓存大小设置失效的问题。 (#33571

  • 修复TensorRT conv2d_transpose op converter维度错误设置问题。(#33242

  • 修复Jetson 设备上分CUDA Arch编译出的预测库结果错误的问题,本版本将发布分Arch编译的Jetson预测库,供对预测库体积有需求的用户使用。(#33269

  • 修复使用PaddleSlim量化模型从内存加载预测时,仍会因未设置校准表路径而报错的问题。(#33629

  • 修复BERT/ERNIE在非0号卡上使用TensorRT预测时报错cuda error 400的问题。(#33706

  • 修复在Linux下设置自定义编译参数时引发的cmake语法错误。(#33621

  • 优化 layer_norm 计算精度,修复大数据输入时输出Nan的问题。(#33420)

  • 修复windows下,TensorRT推理传入左斜杠做分隔符的模型路径时,opt路径错误问题。(#33885)

环境适配

新硬件适配

昆仑硬件训练支持

  • 修复 gather op,新增支持 logsumexp 。 (#32931)

Thanks to our Contributors

This release contains contributions from: Aurelius84, cc, ceci3, Chen Weihang, danleifeng, feng_shuai, houj04, jiangcheng, JZ-LIANG, Kaipeng Deng, lidanqing, LielinJiang, Lijunhui, lilong12, liuyuhui, liym27, Pei Yang, Peihan, Qi Li, Ren Wei (任卫), Roc, Shang Zhizhou, ShenLiang, Shibo Tao, TeslaZhao, tianshuo78520a, TTerror, wangguanzhong, Wangzheee, wawltor, WeiXin, wenbin, Wenyu, whs, Wilber, wuhuanzhou, Zhang Ting, zhiboniu, Zhou Wei, zhoujun, 李季, 王明冬

2.1.0 Release Note

重要更新

飞桨框架2.1.0 版本有如下重要更新:

  • 环境适配: 增加了对Python 3.9、CUDA 11.2的支持;提供了对ROCm平台的支持(experimental);提供了对昇腾AI处理器的支持(experimental);增加了可在百度昆仑芯片上运行的模型数量;详情请见:开始使用

  • 分布式训练:在已有静态图的多维混合并行的基础上,新增动态图实现。

  • 框架功能:完成了多项功能增强和性能优化,特别的,新增了以下重要功能:

    • 自定义算子:提供了在框架外部自定义算子的新方案,简化了自定义算子写法与训练推理部署流程,详情请见:自定义外部算子

    • 新增inplace操作:新增可降低显存占用与提升性能的inplace操作,包括View策略,与12个inplace API。

    • 高层API相关:新增支持混合精度训练的高层API;新增通过paddle.hub来查看、共享、加载模型。

    • 自动混合精度训练优化: 优化了混合精度训练中slice、where、range等多个op的计算性能,提升了在MaskRCNN、ERNIE等模型上的加速效果。

    • oneDNN下BF16训练:新增支持了AMP(AutoMixedPrecision) pure_BF16模式; 新增支持了BF16类型的SGD和initializers初始值设定并减小了内存;新增支持了大部分word2vec BF16训练需要的前向和反向op。

飞桨的官方模型库和套件的最新更新请参见:Paddle projects notes along with PaddlePaddle2.1

不兼容升级

  • 飞桨框架2.1放弃了对python2和python3.5的支持,建议您升级python到3.8版本来使用飞桨。飞桨框架2.1不再提供支持CUDA9的预编译包,建议您升级CUDA版本来使用飞桨。

  • 对API可见性的优化,会导致无法使用from deeply_nested_namespace import *的方式导入被认为是实现细节的位于最底层的命名空间中的私有API。建议您通过查看飞桨官网的API文档说明来使用飞桨。具体的,以下行为在飞桨框架2.1版本中不再被允许。

# will import nothing from the deeply nested namespaces
from paddle.nn.layer.loss import *
from paddle.nn.layer.conv import *
  • Tensor.grad不兼容升级,返回值的类型由numpy变为Tensor。(#32142)

2.0 2.1
>>> import paddle
>>> x = paddle.to_tensor(5., stop_gradient=False)
>>> y = paddle.pow(x, 4.0)
>>> y.backward()
>>> type(x.grad)
< class ‘numpy.ndarray’ >
>>> import paddle
>>> x = paddle.to_tensor(5., stop_gradient=False)
>>> y = paddle.pow(x, 4.0)
>>> y.backward()
>>> type(x.grad)
< class ‘paddle.Tensor’ >
  • paddle.jit.TraceLayer.save_inference_model 接口不兼容升级。将原先的第一个参数dirname改为path,名字表意更通用并且与paddle.save和load等接口统一,表示由用户指定保存模型路径的前缀。(#31989)

2.0 2.1
>>> import os
>>> import paddle
>>> from paddle.vision.models import resnet18

>>> model = resnet18()
>>> x = paddle.rand([1, 3, 224, 224])
>>> _, static_layer = paddle.jit.TracedLayer.trace(model, inputs=[x])
>>> save_path = './save_infer_model'
>>> static_layer.save_inference_model(dirname=save_path)

>>> print(os.path.isdir(save_path))
>>> print(len(os.listdir(save_path)))
True
103
>>> import os
>>> import paddle
>>> from paddle.vision.models import resnet18

>>> model = resnet18()
>>> x = paddle.rand([1, 3, 224, 224])
>>> _, static_layer = paddle.jit.TracedLayer.trace(model, inputs=[x])
>>> save_path = 'save_infer_model'
>>> static_layer.save_inference_model(path=save_path)

>>> print(os.path.isdir(save_path))
>>> print([name for name in os.listdir('./') if name.startswith(save_path)])
False
['save_infer_model.pdmodel', 'save_infer_model.pdiparams']
  • paddle.io.DataLoaderDataset只包含一个字段时,DataLoader返回格式不兼容升级。当用户自定义数据集只包含一个字段并通过如return imageyield image返回数据时,2.0版本返回的数据格式是[image_tensor],而2.1版本返回的数据格式为image_tensor,保持输入输出数据结构的一致性。

2.0 2.1
>>> import numpy as np
>>> import paddle
>>> from paddle.io import DataLoader, Dataset
>>> 
>>> class RandomDataset(Dataset):
>>>     def __getitem__(self, idx):
>>>         return np.random.random((2, 3)).astype('float32')
>>> 
>>>     def __len__(self):
>>>         return 10
>>> 
>>> dataset = RandomDataset()
>>> loader = DataLoader(dataset, batch_size=1)
>>> data = next(loader())
>>> print(data)
[Tensor(shape=[1, 2, 3], dtype=float32, place=CUDAPinnedPlace, stop_gradient=True,
       [[[0.73782003, 0.62605530, 0.32727283],
         [0.37154925, 0.63570684, 0.53859973]]])]
>>> import numpy as np
>>> import paddle
>>> from paddle.io import DataLoader, Dataset
>>> 
>>> class RandomDataset(Dataset):
>>>     def __getitem__(self, idx):
>>>         return np.random.random((2, 3)).astype('float32')
>>> 
>>>     def __len__(self):
>>>         return 10
>>> 
>>> dataset = RandomDataset()
>>> loader = DataLoader(dataset, batch_size=1)
>>> data = next(loader())
>>> print(data)
Tensor(shape=[1, 2, 3], dtype=float32, place=CUDAPinnedPlace, stop_gradient=True,
       [[[0.73782003, 0.62605530, 0.32727283],
         [0.37154925, 0.63570684, 0.53859973]]])

训练框架

功能优化(含分布式)

基础API

  • 新增paddle.dtype 以及 paddle.float32 等数据类型,作为 paddle 内的数据类型。 (#32012)

  • 新增paddle.nn.functional.glu。 (#32096)

  • 新增paddle.nn.utils.spectral_norm#32633

  • 新增paddle.Tensor.register_hook API,用于在动态图场景中为前向Tensor对应的梯度Tensor注册hook函数。(#31775)

  • 新增Tensor.__array__函数,支持numpy.array(Tensor)numpy.asarray(Tensor)paddle.Tensor类型转换成numpy.ndarray类型 。(#32300)

  • 新增Tensor API:Tensor.item(*args),可将Tensor中指定位置的元素转化为Python的scalar值并返回。(#32634)

  • 新增paddle.nn.LayerList对负数索引的支持。(#31750)

  • 新增12个动态图inplace API:clip_scale_add_subtract_ceil_floor_exp_reciprocal_round_sqrt_rsqrt_flatten_。这些inplace API不能通过paddle.api_的形式调用,应该使用Tensor.api_来调用。(#32699)

  • 新增paddle.autograd.backward API, 用于自定义起始梯度。(#31540)

  • 新增paddle.nn.LayerDict 类。(#31951)

  • 新增layer.to API。(#32040)

  • 新增paddle.autograd.PyLayerAPI,用于支持动态图在Python端自定义反向计算。(#32130)

  • 新增支持paddle.optimizer在动态图中指定非参数的Tensor作为parameters进行优化。#32362)

  • paddle.static.nn添加了若干 sequence* 系列功能,在 paddle.nn.functional 添加了sequence_mask。 (#32089)

  • paddle.nn.CTCLoss中添加norm_by_times参数。(#32490)

  • paddle.fill_constant 支持 uint8_t。(#31911)

  • paddle.clip支持int32int64。(#32373)

  • 支持paddle.nn.functional.interpolate 在 Nearest neighbor 模式下,输入数据类型为int。(#32270)

  • API中所有支持传入list或tuple的参数,全部升级为支持传入list和tuple。(#32344, #32528 #32360)

  • 优化softmax算子性能。(#31821)

  • 优化paddle.norm文档说明,澄清paddle.normnumpy.linalg.normAPI 存在功能差异。(#32530)

  • 优化Tensor 的数据类型(datatype)的打印形式,例如,float32类型的Tensor的dtypeVarType.FP32变为 paddle.float32。(#30682)

  • oneDNN功能优化:

    • 升级 oneDNN 至 v2.2.1。(#31067 #31473, #30295 32227)

    • 增加了更加准确的,基于数据类型的 oneDNN kernel 选择策略。(#29840)

    • 融合oneDNN layer_norm子图为完整的单个layer_norm op。(#32162, #30891, #30962)

    • 减少oneDNN elementwise_mul创建中不必要的内存分配。(#30203)

    • 改进了缓存每个线程使用的内存消耗。(#30358)

    • 增加了LSTM oneDNN fp32 and int8 kernel支持。(#30719 #31894)

    • 增加了 OneDNN hardswish 支持。(#30211)

    • 增加了 bilinear_interp_v2nearest_interp_v2 的oneDNN支持。(#32312)

  • 升级 Xbyak 数学库 至 v5.81。(#30809)

  • 修复paddle.io.DataLoader支持数据集包含list,dict和string等嵌套的复杂数据格式,修复迭代中途程序退出偶现的报错、资源未释放等问题。(#31481)

  • 修复 paddle 中修改 logging 库的 root logger 导致的问题。(#32706)

  • 修复L1Decay动态图模式下backward报错的问题。(32718)

  • 修复paddle.nn.functional.cross_entropy中设置ignore_indexreduction='mean'下出Nan的问题。(#32545)

  • 修复bool tensor和float tensor相加输出的类型为bool的问题。(#32272)

  • 修复比较类API在broadcast的计算错误。(#32470)

  • 修复加减乘除在右侧输入是大shape下的broadcast下梯度计算错误。(#30818)

  • 修复segment mean OP在处理大shape tensor输入时,计算结果不正确的问题。(#32610)

  • 修复优化器变量的数据类型与模型参数的数据类型不一致的问题。(#29917)

  • 修复 paddle.io.DataLoader预处理中包含paddle的操作时,num worker>0时报错。(#31177)

  • 修复打印空tensor时的报错。(#32501)

  • 调整静态图参数初始化顺序,调整后与动态图保持一致,以便于相同模型设置相同随机种子在动态图和静态图中初始化得到相同参数。(#32177)

  • 修复paddle.to_tensor 不支持接受dtype=Tensor.dtype的bug。(#31931)

  • 修复paddle.dist 在2个输入相等时,梯度为nan的问题。(#32448)

  • paddle.nn.functional.temporal_shift API增加data_format属性,支持设置为NCHW或者NHWC。(#31642)

  • 修复adaptive_avg_pool2d在输入数据类型为float16时计算结果不正确的问题。(#31887)

  • paddle.nn.Layer.sublayerspaddle.nn.Layer.named_sublayers:将原本paddle.nn.Layer.sublayersinclude_sublayers = True参数修改为include_self = False, 从而修复从前include_sublayers = False时返回空的问题。现在不填写任何参数时默认行为和之前一致,即返回不包含自己的所有递归子层,当include_self = True时同字面意思,返回包含自己在内的所有递归子层。而paddle.nn.Layer.named_sublayersinclude_sublayers的参数则直接删除了 其他行为不变。(#31824 )

2.0 2.1
>>> from paddle.vision.models import resnet18
>>> model = resnet18()
>>> 
>>> print(len(model.sublayers(include_sublayers=True)))
>>> print(len(model.sublayers(include_sublayers=False)))
67
0
>>> from paddle.vision.models import resnet18
>>> model = resnet18()
>>> 
>>> print(len(model.sublayers(include_self=True)))
>>> print(len(model.sublayers(include_self=False)))
68
67

高层API

  • 新增paddle.hub功能,提供helplistload函数用于查看和加载第三方模型,支持加载远程和本地repository。(#31873)

  • 支持混合精度训练,提供O0, O1, O2三种模式,分别对应FP32训练、自动混合精度训练、纯FP16训练。目前纯FP16训练仅支持静态图。(#31417)

  • 支持paddle.Tensor类型的图像变换,包括normalize, to_grayscale, vflip, hflip, crop, center_crop, pad, rotate, resize等算子 。(#32705)

动态图转静态图

修复了动态图转静态图的bug:

  • 静态图arange、range API返回的shape与动态图不一致。

  • paddle.to_tensor在动转静中支持输入为int,float,bool基础类型。

  • for循环中支持解析dict推导式语法。(#32159)

  • 修复部分场景下嵌套控制流语句中存在变量未声明报错的问题。(#32153)

  • 修复了expand op缺少float16类型的bug。(#32238)

  • 修复了expand_v2、tile、expand、expand_as、expand_as_v2、meshgrid等6个OP反向梯度求解,当shape维度为6时,返回梯度信息为None的bug。(#32004)

  • 修复了paddle.jit.TraceLayer.save_inference_model接口中因未同时保存网络结构和参数导致与paddle.static.load_inference_model搭配使用不一致的问题。(#31989 )

混合精度训练

  • 动态图混合精度接口 auto_cast 中自动将不支持fp16 kernel的op保持为fp32计算。(#32543)

  • 修复静态图混合精度训练中因不支持FP16计算的Op列表(unsupported_fp16_list)统计不完整导致的意外报错问题,当前不支持FP16计算的Op列表可根据运行时环境自动生成。(#32102)

  • 优化update_loss_scaling for循环起多个相同cuda kernel问题,融合为一个cuda kernel。(#32554)

  • 优化slice多维情况下性能较慢问题。(#32266)

  • 优化elementwise_add_grad输入输出相同时的冗余拷贝问题。(#32051)

  • 优化check_finite_and_unscale for循环起多个相同cuda kernel问题,融合为一个cuda kernel。(#31954)

  • 优化range参数冗余拷贝问题。(#30811)

  • 优化top_k_v2input_width <= 1024时性能较慢问题。(#30403)

  • 移植where_index CPU计算流程到GPU上完成。(#30601)

BF16训练

  • 增加了初级 BF16 AMP 集成, 通过在前向网络中添加cast op来修改图使一些 operator 使用 BF16 kernel 。(#31093)

  • 增加了 BF16 pure_mode模式, 在此模式下,默认开启使用 BF16 数据类型的模型参数,BF16的operator,对于optimizer的BF16 decorator。(#32281, #32681)

  • 增加了对于CPU flags的检查以确认是否支持oneDNN BF16性能提升。(#30551)

  • 对BF16支持进行过程统一。(#31034)

  • 增加了对于constant initilizer的BF16数据类型的支持。(#31935)

  • 增加了BF16 uniform initializer支持。(#32468)

  • 增加了将startup_program initializer转化为BF16的机制。(#32720)

  • 增加了 sgd operator 的 BF16 数据类型支持。(#32162)

  • 增加了lookup_table op BF16 数据类型的支持。(#31558)

  • 增加了 sum kernel 和 SelectedRows 的 BF16的支持。(#32755, #32631)

  • 增加了conv_transpose的BF16数据类型支持。(#30877)

  • 增加了elementwise_add grad BF16数据类型的支持。(#30925)

  • 增加了reshape grad BF16 数据类型的支持。(#31035)

  • 增加了elementwise_add grad op 对于 broadcasting 的支持(FP32/BF16)。(#31385)

  • 增加了elementwise_mul grad op 对于fp32/bf16数据类型的支持。(#31647)

  • 增加了 LSTM BF16 支持,并修复GRU BF16的一些问题。(#31234)

  • 增加了 oneDNN reduce_op fp32 和 bf16支持。(#31816)

  • 增加了oneDNN reduce_op grad 对于 fp32 和 bf16 的支持。(#32280 #32592)

分布式训练优化

  • 加入图检索引擎,支持万亿边规模的分布式图神经网络存储、采样、训练(#31226)。

  • 加入基于索引的数据采样类,支持图、树深度匹配等模型的采样(#31696)。

  • 新增paddle.distributed.send, paddle.distributed.recv,paddle.distributed.new_group,paddle.distributed.wait,完善分布式通信API。(#32504, #31682)

  • 动态图分布式初始化支持sync_parameters_buffer,解决动态图buffer未全局初始化的问题。(#31625)

  • 流水线并行支持1F1B调度方式,优化显存占用量,理论上显存占用量为常量。(#31786

  • [混合并行] 优化Sharding 策略:Gradient Merge支持、减少参数通信量等,提升训练速度;支持与其他并行策略的灵活组合。(#31884 #32486 #32485 #31996 #31939 #31796)

  • [混合并行] Sharding策略中添加optimize offload支持,降低训练显存占用。(#32134)

  • [混合并行] 持久化广播通信ID的socket服务,减少混合并行端口冲突问题。(#31589)

  • [参数服务器] 优化日志输出和LOG打印,去除无效日志。

  • [参数服务器] 优化稀疏参数存储结构,维度较小(低于64)的情况下内存有较大降幅 。

  • [参数服务器] 修复在分布式预测时,准入策略生效的BUG。

  • [参数服务器] HeterPs支持多机GPU训练(#31102)。

动态图混合并行

动态图分布式支持混合并行功能,支持数据并行,模型并行以及流水线并行三种并行方式的任意组合。同时支持混合并行基础上添加AMP混合精度策略,ReCompute策略。

  • Fleet支持动态图混合并行,支持数据并行(DataParallel)/模型并行(ModelParallel)/流水线并行(PipelineParallel)三种并行的互相组合。(#32248)

  • 动态图分布式DataParallel添加find_unused_parameters参数,用于支持控制流组网。(#31625)

  • Fleet添加VocabParallelEmbeddingColumnParallelLinearRowParallelLinear API用于模型并行组网。添加model_parallel_random_seed / get_rng_state_tracker用于ModelParallel的随机性控制。(#32248)

  • Fleet添加distributed_scaler 接口,用于混合并行AMP策略下的loss scaler。(#32354)

  • Fleet添加PipelineLyaer用于流水线并行组网切图,添加LayerDesc用于动态图Layer描述以减少显存初始化。(#32449)

  • 动态图新增 Recompute 策略。(#32516)

自定义OP

  • 新增支持Mac平台上使用自定义OP功能。(#31976)。

  • Mac平台下支持C++/v11头文件目录的自动搜索功能,兼容本地可能存在多版本clang的情况。

  • 新增支持Op前反向函数Attribute参数以及inferShape, InferDtype函数输入参数使用const &类型。(#31588)

  • 新增支持在自定义Op实现时使用三种框架内部数据类型paddle::complex64, paddle::complex128, paddle::float16。(#31602, #31657, #31669, #31725)

  • 新增支持在自定义Op中使用std::vector<paddle::Tensor>类型参数作为前反向函数的输入。(#31535)

  • 新增支持InferShape函数使用Attribute参数作为输入。(#31713)

  • 优化自动生成的Python API在动态图下的调用栈,提升执行效率。(#32209)

  • 降低Windows上检查编译器cl.exe时的报错条件,增强Windows环境自检的鲁棒性。(#32769)

  • 修复Windows上安装多个CUDA环境时编译器选择时的bug。(#31694)

  • 修复Windows安装中文版本VS时出现的Python编码问题的bug。(#31493)

  • 移除对单独动态库文件的依赖,仅链接框架核心动态库文件。(#32404#32769)

  • 移除之前的旧自定义OP方案,并对whl包中多余的库文件与头文件进行了清理,降低了whl包大小约11M。(#31813), (#32463)

模型保存与载入

  • paddle.save, paddle.load支持Tensor的保存加载。(#31756)

  • paddle.save, paddle.load支持list[Tensor]、dict[Tensor]、tuple[Tensor]以及list、tuple、dict嵌套的包含Tensor的结构的保存加载。(#32446)

  • paddle.save, paddle.load支持Layer的保存加载。(#32446)

  • paddle.save, paddle.load支持Program的保存加载。(#32336)

  • paddle.save, paddle.load支持C++二进制格式单个Tensor的保存加载。(#32211)

  • paddle.jit.save, paddle.jit.load支持无参数的Fucntion的保存加载。(#32430)

性能优化(含分布式)

  • 优化重点算子,提升多个模型单GPU训练性能,Deeplabv3+单卡FP32和AMP性能分别提升11%、72%,TSM单卡AMP性能提升44.5%,HRNet单卡FP32、AMP分别提升46%、51%。

  • 增加 index_sample CUDA实现。(#30380)

  • 实现relu, leaky_relu算子的CUDA Kernel,代替原Eigen实现,正反向共提升5% ~ 20%。(#31869, #31841)

  • temporal_shift 性能提升20%~40%。(#31642)

  • 优化depthwise_conv2d,NHWC format下性能提升30%~50%。(#31667)

  • 优化interp_bilinear_grad算子NCHW性能,提升19%~303%。(#30950)

  • 优化adaptive_avg_pool2d算子NCHW、output_size = 1情况下的性能,提升80%~90% 。(#31197)

  • conv op当dtype为float16时,forward和backward支持开启exhaustive_search。(#30959)

  • momentumweight_decay参数设置为float类型时,实现momentumL2Decay的融合。(#30881)

  • 实现log_softmax算子axis为最后一维、维度<=1024时的CUDA Kernel,相比原Eigen实现,正反向算子性能提升4.55x ~ 26.45x。(#31630, #32180)

推理部署

模型量化

  • 新增支持将FP32模型保存为FP16模型。(#32112)

  • 重构动态图量化训练中统计输出量化信息模块,支持多Block和多分支的模型,增强通用性。(#31680 #31710 #31784 #31861)

  • 动态图量化训练功能支持跳过量化OP,并且和预测端形成打通。(#31704)

Paddle Inference

功能升级

  • 发布C API (experimental), 功能与C++ API基本对齐。(#32225)

  • 重构Tensor 底层代码,与旧有 ZeroCopyTensor 数据结构解耦。此升级不涉及用户 API 改动,对用户透明。(#31402)

  • 预测框架python接口接入训练自定义算子。用户在训练过程中加载自定义算子后,即可像框架原生算子那样,通过 PaddlePredictor 直接执行包含此自定义算子的预测模型部署。(#32533)

  • 支持从内存加载模型时TensorRT序列化和反序列化功能。(#31342)

性能优化

  • 支持ERNIE量化模型在NV GPU上混合精度推理,其中MatMul以Int8精度计算,其他部分以FP16精度计算。相比纯FP16推理,在T4上batch size=40时,标准ERNIE模型在XNLI数据集上推理性能由1898 seq/s提升至2310 seq/s,提升17.8%。(#32232)

易用性优化

  • 用户开启TensorRT变长输入,输入shape超出限定范围时增加报错信息。(#32155)

  • 增加运行时TensorRT版本检查,若运行和编译时TensorRT大版本号不一致会以warning提示。(#32443)

  • 增加TensorRT VERBOSE级别log开关,用户可通过export GLOG_v=3开启TensorRT VERBOSE日志,打印更多调试信息。(#32459)

BugFix

  • 修复预测结束后可能出现非指定使用显卡显存不足的错误。(#32655)

  • 修复动态图下原生推理非正规值引起的CPU推理性能问题。(#32350)

  • 修复在使用PaddleSlim量化模型开启TensorRT推理时,若从内存读入模型,仍会要求设置校准表路径的问题。(#32676)

  • 升级TensorRT量化校准表接口,修复在DLA上不支持TensorRT离线量化的问题。(#31060)

  • 修复当使用变长方式进行ERNIE/BERT模型推理时(EnableTensorRtOSS),不支持裁剪Attention的header数量的问题。(#31497)

  • 修复2.0之后训练的BERT模型QK输入顺序不稳定带来的结果偶现diff问题。(#32659)

  • 修复ERNIE模型开启TensorRT varlen加速时因输入变量名顺序错误导致报错或结果错误问题。(#32482)

  • 修复TensorRT的plugin ElementwisePluginDynamic序列化失败的问题。(#31587)

  • 修复TensorRT动态shape下FC layer维度补1带来的后续OP维度报错的问题。(#32458, #31803)

  • 修复FC使用Padding时repeated_fc_relu_fuse_pass.cc错误的问题。(#32648)

  • 修复conv2d_transpose op使用TensorRT推理时结果错误的问题。(#32593)

  • 修复NAN的错误比较导致的 OCR INT8 模型 oneDNN 预测报错的问题。(#32227)

  • 修复部署多个模型在多executor上多线程进行oneDNN 预测时出现数据争用的问题。(#32499, #32136 #32664)

环境适配

编译安装

  • 新增支持CUDA11.2编译,支持3070/3080/3090显卡架构的编译。(#31529)

  • 新增支持Windows Visual Studio 2017编译,并将发版、CI/CE、编译文档等各项配套设施,由VS2015全面升级至VS2017。(#311652)

  • 新增对cuda11.2镜像的支持。(#32531)

  • cuda10.1镜像支持gcc 5.4。(#32531)

  • 镜像中新增对python 3.9的支持。(#32385)

  • 修复run_check接口的bug,并在run_check接口里新增了对动态图的检查:现在run_check检测paddle安装的逻辑里,首先检测用户机器上是否有GPU,没有则报warning,未考虑安装cpu包的用户。(#32428)

  • 修复Windows系统上缺乏 symlink 方法的问题。(#31006)

新硬件训练支持

  • 新增支持海光芯片:飞桨基于 ROCM 4.0.1 版本可以在海光CPU与DCU上进行模型训练与推理。已经验证支持图像分类、目标检测、图像分割、自然语言处理、推荐系统、视频分类与语音合成共计7个分类的36个模型。(#29342, #30758, #30639, #31009, #31077)

  • 新增支持昇腾芯片:支持在昇腾NPU上进行单机多卡训练。(#31957, #32381, #32197, …)

  • 昆仑硬件训练支持

    • 昆仑XPU支持动态图分布式训练。(#30455, #30671)

    • 昆仑XPU支持fleet分布式训练。(#30858)

    • 昆仑XPU支持spawn启动多卡训练,优化XPU动态图多卡性能。(#31130)

    • 昆仑XPU静态图多卡支持fuse allreduce及gradient merge优化。(#31104)

    • 支持昆仑XPU暴露all_reduce/reduce集合通信API。(#32303)

    • 修复昆仑XPU动态图多卡随机hang住的bug。(#32662)

Thanks to our Contributors

This release contains contributions from:

123malin, Adam Osewski, alncat, arlesniak, AshburnLee, Aurelius84, Bai Yifan, Baibaifan, Bin Lu, cc, ceci3, chajchaj, chalsliu, channings, Chen Long, Chen Weihang, chen zhiyu, Chengmo, chentianyu03, cnn, CtfGo, cucuzg, danleifeng, denglin-github, Double_V, fangshuixun007, Feiyu Chan, fluffyrita, FlyingQianMM, FNRE, furnace, GaoWei8, GeminiCarrie, gongweibao, Gradie, GT-Zhang, Guanghua Yu, Guo Sheng, guofei, hong, houj04, huangjun12, huangxu96, Huihuang Zheng, hutuxian, iducn, Jacek Czaja, Jack Zhou, jakpiase, JamesLim, Jiabin Yang, jiangcheng, Jiaqi Liu, Jiawei Wang, joanna.wozna.intel, joejiong, JZ-LIANG, Kaipeng Deng, Kqnonrime, kuizhiqing, Lei.C, Leo Chen, lidanqing, LielinJiang, lijianshe02, lilong12, limingshu, littletomatodonkey, liu zhengxi, LiuChiachi, liuyuhui, liym27, LoveAn, LutaoChu, minghaoBD, mls1999725, niuliling123, Ouyang Chao, pangyoki, parap1uie-s, Pei Yang, procr, Qi Li, qingqing01, QingshuChen, Ren Wei (任卫), ronnywang, ruri, seemingwang, Shang Zhizhou, shanliang1992, ShenLiang, Shibo Tao, Steffy-zxf, syyxsxx, taixiurong, tangwei12, Tao Luo, Thomas Young, Thunderbrook, tianshuo78520a, TTerror, wangchaochaohu, wangguanzhong, wanghuancoder, wangna11BD, WangXi, wangxinxin08, wawltor, Wei Shengyu, weihaoji, WeiXin, wenbin, Wenyu, whs, Wilber, winter-wang, Wojciech Uss, wuhuanzhou, wuyefeilin, XGZhang, XiangGao, XiaoguangHu, xiaoting, xiegegege, xiemoyuan, xingfeng01, Yang Zhang, yaoxuefeng, yiak, yingshengBD, yinhaofeng, Yiqun Liu, ykkk2333, yongqiangma, Yuang Liu, yukavio, YUNSHEN XIE, Y_Xuan, Zhang Jun, Zhang Ting, zhang wenhui, Zhang Zheng, zhangchunle, Zhen Wang, zhiboniu, Zhong Hui, Zhou Wei, zhulei, zhupengyang, zlsh80826, 卖鱼的哲学, 石晓伟