Release Note

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

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

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

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

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

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

      • 自动混合精度训练优化: 优化了混合精度训练中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版本中不再被允许。

    • Tensor.grad不兼容升级,返回值的类型由numpy变为Tensor。()
    • paddle.jit.TraceLayer.save_inference_model 接口不兼容升级。将原先的第一个参数dirname改为path,名字表意更通用并且与paddle.save和load等接口统一,表示由用户指定保存模型路径的前缀。(#31989)
    • paddle.io.DataLoaderDataset只包含一个字段时,DataLoader返回格式不兼容升级。当用户自定义数据集只包含一个字段并通过如return imageyield image返回数据时,2.0版本返回的数据格式是[image_tensor],而2.1版本返回的数据格式为image_tensor,保持输入输出数据结构的一致性。

    基础API

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

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

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

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

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

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

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

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

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

    • 新增layer.to API。()

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

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

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

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

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

    • paddle.clip支持int32int64。()

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

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

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

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

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

    • oneDNN功能优化:

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

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

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

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

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

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

      • 增加了 OneDNN hardswish 支持。()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • 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 )

    高层API

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

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

    动态图转静态图

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

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

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

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

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

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

    • 修复了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搭配使用不一致的问题。( )

    混合精度训练

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

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

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

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

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

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

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

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

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

    BF16训练

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    分布式训练优化

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

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

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

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

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

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

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

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

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

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

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

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

    动态图混合并行

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

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

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

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

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

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

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

    自定义OP

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

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

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

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

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

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

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

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

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

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

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

    模型保存与载入

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

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

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

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

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

    • 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%。(, #31841)

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

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

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

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

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

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

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

    推理部署

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

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

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

    Paddle Inference

    功能升级

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

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

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

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

    性能优化

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

    易用性优化

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

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

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

    BugFix

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    新硬件训练支持

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

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

    • 昆仑硬件训练支持

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

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

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

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

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

    Thanks to our Contributors

    This release contains contributions from: