Releases: PaddlePaddle/Paddle
PaddlePaddle 2.0.0-beta0
2.0-beta Release Note
重要更新
本版本为飞桨框架v2.0的测试版,最重要的变化为API体系的全面升级以及命令式编程(动态图)能力的全面完善。本版本系统优化了飞桨基础API的目录结构,全面修复了历史遗留的相关问题,并对API做了充分补充,特别是提供了更为完善的高层API功能;同时提供了对动态图的量化训练、混合精度训练的支持,动静转换实现了完备的语法支持,并且易用性大幅提升,动态图相关功能趋于完善,推荐使用动态图模式。此外,推理库的C++接口也做了升级优化,推理库对量化模型的支持以及推理性能都有了全面增强。
训练框架
基础API
兼容性说明
- Paddle 2.x版本推荐用户使用位于paddle根目录下的API,同时在paddle.fluid目录下保留了所有的Paddle 1.x版本的API。按照设计,Paddle 1.x版本训练的代码,不做任何修改,即可在Paddle 2.x版本上正常运行;Paddle 1.x版本训练保存的模型,可以使用Paddle 2.x版本进行推理。
目录结构调整
- 在2.0-alpha版本的基础上,本版本对于目录结构进行了一些调整,调整完最新的目录结构如下:
目录 功能和包含的API paddle.* paddle根目录下保留了常用API的别名,当前包括:paddle.tensor和paddle.framework目录下的所有API paddle.tensor 跟tensor操作相关的API,比如:创建zeros, 矩阵运算matmul, 变换concat, 计算add, 查找argmax等 paddle.nn 跟组网相关的API,比如:Linear, 卷积,LSTM等,损失函数,激活函数等 paddle.static.nn 静态图下组网专用API,比如:输入占位符data, 全连接层fc, 控制流while_loop/cond paddle.static 静态图下基础框架相关API,比如:Variable, Program, Executor等 paddle.framework 框架通用API和imprerative模式的API,比如:to_tensor等 paddle.optimizer 优化算法相关API,比如:SGD,Adagrad, Adam等 paddle.optimizer.lr_scheduler 学习率衰减相关API paddle.metric 评估指标计算相关的API,比如:accuracy, auc等 paddle.io 数据输入输出相关API,比如:Dataset, DataLoader等 paddle.device 设备管理相关API,比如:CPUPlace, CUDAPlace等 paddle.distributed 分布式相关基础API paddle.distributed.fleet 分布式相关高层API paddle.vision 视觉领域API,比如,数据集,数据处理,常用基础网络结构,比如resnet paddle.text NLP领域API, 比如,数据集,数据处理,常用网络结构,比如transformer
API别名规则
- 为了方便用户使用,API会在不同的路径下建立别名,比如
paddle.add -> paddle.tensor.add,推荐用户优先使用较短的路径paddle.add - 所有framework, tensor目录下的API,均在paddle根目录建立别名;除少数特殊API外,其他API在paddle根目录下均没有别名。
- paddle.nn目录下除functional目录以外的所有API,在paddle.nn目录下均有别名;functional目录中的API,在paddle.nn目录下均没有别名。
- 以下为一些特殊的别名关系,推荐使用左边的名称:
- paddle.sigmoid -> paddle.tensor.sigmoid -> paddle.nn.functional.sigmoid
- paddle.tanh -> paddle.tensor.tanh -> paddle.nn.functional.tanh
- paddle.remainder -> paddle.mod -> paddle.floor_mod
- paddle.divide -> paddle.true_divide
- paddle.rand -> paddle.uniform
- paddle.randn -> paddle.standard_normal
- Optimizer.clear_grad -> Optimizer.clear_gradients
- Optimizer.set_state_dict -> Optimizer.set_dict
- Optimizer.get_lr -> Optimizer.current_step_lr
- Layer.clear_grad -> Layer.clear_gradients
- Layer.set_state_dict -> Layer.set_dict
常用API名称变化
- 此版本使用Tensor表示数据,创建张量API, paddle.fluid.dygraph.to_variable修改为paddle.to_tensor
- 加、减、乘、除使用全称,不使用简称
- 对于当前逐元素操作,不加elementwise前缀
- 对于按照某一轴操作,不加reduce前缀
- Conv, Pool, Dropout, BatchNorm, Pad组网类API根据输入数据类型增加1d, 2d, 3d后缀
Paddle 1.8 Paddle 2.0-beta paddle.fluid.layers.elementwise_add paddle.add paddle.fluid.layers.elementwise_sub paddle.subtract paddle.fluid.layers.elementwise_mul paddle.multiply paddle.fluid.layers.elementwise_div paddle.divide paddle.fluid.layers.elementwise_max paddle.maximum paddle.fluid.layers.elementwise_min paddle.minimum paddle.fluid.layers.reduce_sum paddle.sum paddle.fluid.layers.reduce_prod paddle.prod paddle.fluid.layers.reduce_max paddle.max paddle.fluid.layers.reduce_min paddle.min paddle.fluid.layers.reduce_all paddle.all paddle.fluid.layers.reduce_any paddle.any paddle.fluid.dygraph.Conv2D paddle.nn.Conv2d paddle.fluid.dygraph.Conv2DTranspose paddle.nn.ConvTranspose2d paddle.fluid.dygraph.Pool2D paddle.nn.MaxPool2d, paddle.nn.AvgPool2d
新增API
- 共计新增140个API,具体参考链接和API文档
- 新增环境设置API:paddle.set_default_dtype, paddle.get_default_dtype, paddle.set_device, paddle.get_device, paddle.manual_seed
- 新增Tensor操作API:numel, chunk, masked_select, isfinite, isinf, isnan, sort, topk, Flatten, dim, tile
- 新增组网API: Linear, Bilinear, Embedding, linear, bilinear, embedding
- 新增视觉组网类API:Conv1d, ConvTranspose1d, MaxPool1d, MaxPool2d, MaxPool3d, AvgPool1d, AvgPool2d, AvgPool3d, AdaptiveMaxPool1d, AdaptiveMaxPool2d, AdaptiveMaxPool3d, ReflactionPad1d, ReflactionPad2d, ReflactionPad3d, ReplicationPad1d, ReplicationPad2d, ReplicationPad3d, ZeroPad2d, ConstantPad1d, ConstantPad2d, ConstantPad3d, PixelShuffle, Upsample, UpsamplingNearest2d, UpsamplingBilinear2d, conv1d, conv_transpose1d, avg_pool1d, avg_pool2d, avg_pool3d, max_pool1d, max_pool2d, max_pool3d, adaptive_max_pool1d, adaptive_max_pool2d, adaptive_max_pool3d, adaptive_avg_pool1d, adaptive_avg_pool3d
- 新增文本处理组网类API: SimpleRNN, LSTM, GRU, MultiHeadAttention, Transformer, TransformerEncoder, TransformerEncoderLayer, TransformerDecoder, TransformerDecoderLayer
- 新增激活类API:ELU, Hardshrink, Hardtanh, PReLU, ReLU6, Tanh, Tanhshrink, Softmax
- 新增归一化API:BatchNorm1d, BatchNorm2d, BatchNorm3d, SyncBatchNorm, InstanceNorm1d, InstanceNorm2d, InstanceNorm3d, weight_norm, remove_weight_norm, batch_norm, instance_norm, layer_norm, normalize
- 新增Dropout类API:Dropout2d, Dropout3d, AlphaDropout, dropout, dropout2d, dropout3d
- 新增相似度、损失函数类API:CosineSimilarity, PairwiseDistance, CTCLoss, KLDivLoss, BCEWithLogitsLoss, MarginRankingLoss, SmoothL1Loss, consine_similarity, binary_cross_entropy, binary_cross_entropy_with_logits, cross_entropy, ctc_loss, l1_loss, mse_loss, margin_ranking_loss, nll_loss, smooth_l1_loss
- 新增分布式通信类API: broadcast, all_reduce, reduce, all_gather, scatter, barrier
- 新增概率分布类API: Distribution, normal, bernoulli
- 新增Optimizer相关API:step, AdamW
- 新增数据集相关API:Dataset, IterableDataset, TensorDataset, Sampler, RandomSampler, BatchSampler, DistributedBatchSampler
修复和完善API
- 共计修改和完善155个API,具体参考链接和API文档
- 修复随机数生成相关的API,包括:种子设置paddle.rand, randn, randint, randperm, dropout, Uniform, Normal等
- 以下API对应的底层C++ OP进行了代码升级,理论上可以实现兼容,但不排除会出现少量不兼容的情况:linspace, concat, gather, gather_nd, split, squeeze, unsqueeze, clip, argmax, argmin, mean, norm, unique, cumsum, LeakyReLU, leaky_relu, hardshrink, embedding, margin_ranking_loss, grid_sample, affine_grid
- 增加了relu6和Sigmoid激活函数的 oneDNN支持
多设备/分布式训练API
-
动态图单机多卡训练
- 新增paddle.distributed.spawn(func, args=(), nprocs=-1, join=True, daemon=False, **options),用于启动动态图多卡训练。
- 新增paddle.distributed.init_parallel_env(),用于初始化动态图多卡训练的环境。
- 新增paddle.distributed.get_rank(),用于获取多卡训练时当前进程的rank。
- 新增paddle.distributed.get_world_size(),用于获取多卡训练时参与训练的总进程数。
-
分布式集合通信
- 新增paddle.distributed.broadcast(tensor, src, group=0),将指定进程上的tensor广播到所有进程。
- 新增paddle.distributed.all_reduce(tensor, op=ReduceOp.SUM, group=0),对所有进程的指定Tensor执行归约操作,结果返回给所有进程。
- 新增paddle.distributed.reduce(tensor, dst, op=ReduceOp.SUM, group=0),对所有进程的指定Tensor执行归约操作,结果返回给指定进程。
- 新增paddle.distributed.all_gather(tensor_list, tensor, group=0),聚合所有进程的指定Tensor,结果返回给所有进程。
- 新增paddle.distributed.scatter(tensor, tensor_list=None, src=0, group=0),将指定进程Tensor列表中的Tensor分发到所有进程。
- 新增paddle.distributed.barrier(group=0),同步所有进程。
高层API
- 新增飞桨高层API,对模型开发过程中常见的组网、训练、评估、预测、存取等操作进行封装,实现低代码开发,MNIST手写数字识别任务对比命令式编程模式实现方式,高层API可减少80%执行类代码。
- 数据管理
- 统一数据加载使用方式
- 数据集定义,继承
paddle.io.Dataset进行实现。 - 多进程数据加载,使用
paddle.io.DataLoader。
- 数据集定义,继承
- 新增
paddle.io.IterableDataset用于流式数据集,并在paddle.io.DataLoader中支持对其进行并发加速。 - 新增
paddle.io.get_worker_info用于paddle.io.IterableDataset中划分子进程数据。
- 统一数据加载使用方式
- 模型组网
- 新增常见Loss接口
paddle.nn.loss.*和Metric接口paddle.metric.*的封装 - 发布基于高层API实现的12个模型
- Transformer,Seq2seq,LAC,BMN,ResNet,YOLOv3,VGG,MobileNet,TSM,CycleGAN,Bert,OCR
- 发布于PaddlePaddle/hapi仓库的examples目录
- 新增常见Loss接口
- 模型执行
- 新增Model类
paddle.Model封装,封装模型开发过程中常用的基础功能,包括:- 提供
Model.summary接口,用于查看动态图组网的网络结构与参数数量。 - 提供
Model.prepare接口,用于指定损失函数和优化算法。 - 提供
Model.fit接口,实现训练和评估,可通过callback方式实现训练过程中执行自定义功能,比如模型存储等。 - 提供
Model.evaluate接口,实现评估集上的预测和评估指标计算。 - 提供
Model.predict接口,实现特定的测试数据推理预测。 - 提供
Model.train_batch接口,实现单batch数据的训练。 - 提供
Model.eval_batch接口,实现单batch数据的评估。 - 提供
Model.text_batch接口,实现单batch数据的测试。 - 提供
Model.save/Model.load接口,支持动态图训练模式存储推理模型。
- 提供
- 新增Callback接口
paddle.callbacks.*,用于模型执行接口,进行日志记录、Checkpoint模型存储等,用户可继承paddle.callbacks.Callback进行自定义。
- 新增Model类
- 领域API
- 新增视觉(CV)领域接口
paddle.vision- 新增Dataset接口
paddle.vision.datasets.*,对常用数据集进行封装,支持数据的随机访问 - 新增Resize, Normalize等24种常见的数据预处理接口
paddle.vision.transforms.* - 新增图像分类骨干网络和预训练参数
paddle.vision.models.lenet或paddle.vision.lenetpaddle.vision.models.vgg或paddle.vision.vggpaddle.vision.models.resnet或paddle.vision.vggpaddle.vision.models.mobilenetv1或paddle.vision.mobilenetv1paddle.vision.models.mobilenetv2或paddle.vision.mobilenetv2
- 新增Dataset接口
- 新增自然语言处理(NLP)领域接口
paddle.text- 新增Dataset接口
paddle.text.datasets.*,对常用数据集进行封装,支持数据的随机访问 - 新增领域组网接口
paddle.text.*
- 新增Dataset接口
- 新增视觉(CV)领域接口
- 自动断点重启
- 新增接口
train_epoch_range:可以在静态图上实现基于epoch粒度的checkpoint自动保存和自动加载功能,支持自动断点重启。
- 新增接口
功能优化(含分布式)
动态图转静态图
- ProgramTranslator新增语法支持
- 新增对return语法动转静支持,使得动转静时可以在if-elif-else或者循环条件中提前return,也能return不同类型的tensor或None。
- 新增对print语法动转静支持,使得print(tensor)也能在动转静中打印出tensor。
- 新增对for遍历Tensor,for enumerate遍历Tensor,for遍历TensorList,for enumerate遍历TensorList几种语法的动转静支持,使得循环处理Tensor的相关操作在动转静中能够灵活使用。
- 新增对assert语法动转静支持,使得assert tensor也能在动转静中保证tensor为True(bool类型)或者非0(其他数据类型)。
- 新增对数据类型cast的转写支持,使得float(tensor), int(tensor) 等类似的动态图类型转化语句也能在静态图中进行类型转化。
- ProgramTranslator易用性优化功能
- 将动转静的返回类型从callable函数改为class StaticLayer,这个class可以调用.cod...
PaddlePaddle 1.8.4
新增功能
- 简化动态图C++报错栈,栈信息缩减50%上且无有效信息丢失。
- 在动态图执行报错时添加Op提示,提升调试体验。
- 量化训练模块支持用户自定义量化训练策略,提升量化功能的灵活性。
性能优化
- 优化DataLoader set_batch_generator接口在输入为ndarray时的性能,减少数据拷贝,351MB耗时从400ms降至80ms。
Bug修复
- 修复使用CPU DNNL预测OCR模型时,多次运行的预测结果不同的问题。
- 修复预测GRU模型时使用FC+GRU fuse报错的问题。
- 修复多处CUDA Kernel在Tensor数据较大时循环索引越界导致非法内存访问的问题。
- 修复错误配置DataLoader.from_generator时产生的非法内存访问问题,并增加报错提示。
- 修复paddle安装时找不到默认路径cudnn库的问题,并完善报错提示。
- 修复使用Paddle-TensorRT部署ERNIE模型时序列化和反序列化出core的问题。
- 修复在Jetson平台上编译报错的问题。
- cpuid.h not found/no member named ‘dynamicRangeIsSet’/‘kHARD_SIGMOID’ is not a member of ‘nvinfer1::ActivationType’
- 修复concat组网时维度判断问题。
- 修复fluid.dygraph.grad在多个分支时依赖关系分析存在的bug。
PaddlePaddle 1.8.3
Release Notes
新增API
- 新增
paddle.fluid.io.default_collate_fn:把一批样本合并为mini-batch。 - 新增
paddle.incubate.distributed.DistributedBatchSampler:将数据加载限制到数据集的子集的采样器。 - 新增
paddle.incubate.vision.transforms.ColorJitter:随机改变图片的亮度、对比度和饱和度。 - 新增
paddle.fluid.dygraph.StepDecay:支持动态图下StepDecay的学习率衰减策略,每隔等间隔个epoch调整,调整倍数为decay_rate倍,调整间隔为step_size。 - 新增
paddle.fluid.dygraph.MultiStepDecay:支持动态图下MultiStepDecay的学习率衰减策略,每隔若干个间隔epoch调整,调整倍数为decay_rate倍,调整间隔为自定义的tuple/list。 - 新增
paddle.fluid.layers.matrix_nms: 检测bbox后处理NMS操作。
新增功能
- 增强
paddle.fluid.contrib.slim.quantization.QuantizationTransformPass功能:支持用户自定义量化和预处理函数。
Bug修复
- 修复WITH_NCCL=OFF情况下的编译问题。
- 修复less_than等compare类op输出的数据类型错误的问题。
- 修复prelu在GPU上计算输入rank不为4的tensor时bug问题。
- 修复Paddle在ARM飞腾cpu机器的编译问题。
- 修复beam_search的InferShape未指明输出的形状导致transformer模型load_inference_model预测出错的问题。
- 修复inplace pass引起的mobilenetv1, mobilenetv2, transformer模型预测速度明显下降的问题。@intel
- 修复cos_sim op容易出nan的问题。
- 修复Fleet API在多卡运行终止进程时,终止失败的问题。
- 修复fluid.embedding op在参数服务器模式下,未触发稀疏通信,导致性能不及预期的问题。
- 修复index_sample op的python接口缺失的问题。
- 修复index_select op索引越界不报错问题。
- 修复gcc8下roll_op单测超时的问题。
- 标准的Ernie模型有四个输入,修复变种输入(输入个数不为4)的Ernie模型在推理期间emb_eltwise_layernorm fuse失效的bug。
- 修复concat组网的输入维度不确定时,维度计算错误问题。
- 增加concat多输入rank不同的报错提醒。
- 修复部分环境import paddle时报 dlopen: cannot load any more object with static TLS的问题。
PaddlePaddle 1.8.2
Release Notes
重要更新
- 移除命令式编程模式(动态图)中DataLoader.from_generator中配置generator时必须指定place参数的要求,改为默认使用动态图全局place。
- 动态图下增加与loss相关的自适应learning_rate策略,会根据loss的变化情况自动调整学习率。
Bug修复
- 量化功能中,修复Sigmoid OP输出名字错误的问题,修复不会收集BN OP输出Scale的错误。
- 预测python api中,加入AnalysisConfig的无参构造函数,以正常使用
set_model_buffer功能。 - 新增编译支持:修复Windows在GPU下无法进行/MD模式编译的bug,该bug在Paddle历史一直存在,属于编译上的功能缺失。
- 修复Windows上GPU版本的
API:paddle.fluid.layers.diag的bug,该bug由1.8.0引入,会使得diag OP运行出错。 - 修复sequence_pad的输出Length数据类型设置错误的问题,该问题会导致sequence_unpad在进行输入类型检查时报错。
- 修复elementwise op在特定数据shape下出现梯度计算出错的问题,导致op计算报错。
- 修复transpose_conv2d Op fp16运行结果出错的问题。
- 修复动态图在Python2中使用[]进行slice操作时的bug,该问题会导致slice结果错误。
PaddlePaddle 2.0.0-alpha0
Release Note
重要声明
- 此版本为测试版,还在迭代中,目前还没有稳定,后续API会根据反馈有可能进行不兼容的升级。对于想要体验飞桨最新特性的开发者,欢迎试用此版本;对稳定性要求高的工业级应用场景推荐使用Paddle 1.8稳定版本。
- 此版本主推命令式编程模式(动态图)的开发方式,并提供了高层API的封装。命令式编程模式具有很好的灵活性,高层API可以大幅减少重复代码。对于初学者或基础的任务场景,推荐使用高层API的开发方式,简单易用;对于资深开发者想要实现复杂的功能,推荐使用命令式编程模式的API,灵活高效。
- 此版本同时对飞桨的API目录体系做了优化,原目录下API会建立alias仍然可用,但建议新的程序使用新目录结构。
基础框架
基础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用来初始化随机数种子
-
部分原fluid目录下API,并没有迁移到paddle目录下
- 原fluid.contrib目录下API,保留在原位置,未迁移:BasicGRUUnit, BasicLSTMUnit, BeamSearchDecoder, Compressor, HDFSClient, InitState, QuantizeTranspiler, StateCell, TrainingDecoder, basic_gru, basic_lstm, convert_dist_to_sparse_program, ctr_metric_bundle, extend_with_decoupled_weight_decay, fused_elemwise_activation, fused_embedding_seq_pool, load_persistables_for_increment, load_persistables_for_inference, match_matrix_tensor, memory_usage, mixed_precision.AutoMixedPrecisionLists, mixed_precision.decorate, multi_download, multi_upload, multiclass_nms2, op_freq_statistic, search_pyramid_hash, sequence_topk_avg_pooling, shuffle_batch, tree_conv, var_conv_2d
- 原LodTensor相关的API,目前还在开发中,暂未迁移:LoDTensor, LoDTensorArray, create_lod_tensor, create_random_int_lodtensor, DynamicRNN, array_length, array_read, array_write, create_array, ctc_greedy_decoder, dynamic_gru, dynamic_lstm, dynamic_lstmp, im2sequence, linear_chain_crf, lod_append, lod_reset, sequence_concat, sequence_conv, sequence_enumerate, sequence_expand, sequence_expand_as, sequence_first_step, sequence_last_step, sequence_mask, sequence_pad, sequence_pool, sequence_reshape, sequence_reverse, sequence_scatter, sequence_slice, sequence_softmax, sequence_unpad, tensor_array_to_tensor
- 原fluid下分布式相关API,目前还在开发中,暂未迁移
- 原fluid目录以下API,将在高层API中重新实现,未迁移:nets.glu, nets.img_conv_group, nets.scaled_dot_product_attention, nets.sequence_conv_pool, nets.simple_img_conv_pool
- 原fluid目录以下API,有待进一步完善,暂未迁移:dygraph.GRUUnit, layers.DecodeHelper, layers.GreedyEmbeddingHelper, layers.SampleEmbeddingHelper, layers.TrainingHelper, layers.autoincreased_step_counter, profiler.cuda_profiler, profiler.profiler, profiler.reset_profiler, profiler.start_profiler, profiler.stop_profiler
- 原fluid目录以下API不再推荐使用,未迁移:DataFeedDesc, DataFeeder, clip.ErrorClipByValue, clip.set_gradient_clip, dygraph_grad_clip.GradClipByGlobalNorm, dygraph_grad_clip.GradClipByNorm, dygraph_grad_clip.GradClipByValue, initializer.force_init_on_cpu, initializer.init_on_cpu, io.ComposeNotAligned.with_traceback, io.PyReader, io.load_params, io.load_persistables, io.load_vars, io.map_readers, io.multiprocess_reader, io.save_params, io.save_persistables, io.save_vars, io.xmap_readers, layers.BasicDecoder, layers.BeamSearchDecoder, layers.Decoder, layers.GRUCell, layers.IfElse, layers.LSTMCell, layers.RNNCell, layers.StaticRNN, layers.Switch, layers.While, layers.create_py_reader_by_data, layers.crop, layers.data, layers.double_buffer, layers.embedding, layers.fill_constant_batch_size_like, layers.gaussian_random_batch_size_like, layers.get_tensor_from_selected_rows, layers.load, layers.merge_selected_rows, layers.one_hot, layers.py_reader, layers.read_file, layers.reorder_lod_tensor_by_rank, layers.rnn, layers.uniform_random_batch_size_like, memory_optimize, release_memory, transpiler.memory_optimize, transpiler.release_memory
高层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
性能优化
- 新增
reshape+transpose+matmulfuse,使得Ernie量化后 INT8 模型在原来基础上性能提升约4%(6271机器),量化后INT8模型相比未经过DNNL优化(包括fuses等)和量化的FP32模型提速约6.58倍。
调试分析
- 针对Program打印内容过于冗长,在调试中利用效率不高的问题,大幅简化Program、Block、Operator、Variable等对象的打印字符串,不损失有效信息的同时提升调试效率
- 针对第三方库接口
boost::get不安全,运行中抛出异常难以调试的问题,增加BOOST_GET系列宏替换了Paddle中600余处存在风险的boost::get,丰富出现boost::bad_get异常时的报错信息,具体增加了C++报错信息栈,出错文件及行号、期望输出类型和实际类型等,提升调试体验
Bug修复
- 修复while loop中存在slice操作时计算结果错误的bug
- 修复inplace ops引起的transformer 模型性能下降问题
- 通过完善cache key, 解决Ernie精度测试最后一个batch运行失败的问题
- 修复fluid.dygraph.guard等context中出现异常时无法正确退出的问题
2.0 alpha 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 imperative programming development method and provides the encapsulation of high-level APIs. The imperative programming(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 imperative programming 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 imperative programming and declarative programming modes(static graph)
-
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 imperative programming 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
-
Some of the APIs in the original fluid directory have not been migrated to the paddle directory
- The following API under fluid.contrib directory are kept in th...
PaddlePaddle 1.8.1
Release Note
功能升级
- 动转静训练方式可以支持嵌入动态图训练,或与动态图训练方式一致。使动转静训练和动态图训练代码使用切换简便易得。
- 动转静支持训练后通过ProgramTranslator相关接口,保存可预测部署的模型及参数文件,并支持C++端加载和预测。
- 优化部分算子的报错信息,使得在算子出错时能得到完整的报错信息,优化使用体验。
PaddlePaddle 1.8.0
Release Note
重要更新
本版本深度优化了命令式编程模式(动态图)的功能、性能和体验,框架基础功能也进一步强化;原生推理库性能显著优化,轻量化推理引擎PaddleLite实现了对硬件支持的极大覆盖,新发布前端推理引擎Paddle.js,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功能持续强化;发布国内首个开源JavaScript深度学习前端推理引擎Paddle.js,可以帮助用户实现网页端深度学习模型部署。
开发套件: 全新发布PaddleClas,包含23个图像分类网络实现,117个图像预训练模型,并添加了数据增广、SSLD蒸馏等辅助策略,以及特色应用案例;PaddleSeg人像分割系列模型全面升级,新增多种遥感相关的策略方案;PaddleDetection、PaddleOCR和语音合成套件Parakeet算法覆盖更全面,速度显著提升。
工具组件: PaddleHub新增包括一系列视觉预训练模型在内更多的模型,模型总数120+; PaddleFL发布1.0版本,开源基于Mulit-party Computation (MPC)的联邦学习,支持横向、纵向等多个联邦学习场景;PGL发布业界首个结合语义信息与结构信息的图神经网络模型ERNIESage;PARL开源工业界首个进化学习应用框架Evokit;全新发布量子机器学习框架量桨Paddle Quantum。
基础框架
新增API
- 新增
fluid.device_guard:设置OP的运行设备为CPU或者GPU。 - 新增
fluid.enable_imperative和fluid.disable_imperative接口,支持函数式启动关闭动态图模式,相对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,记录模式信息。
- 支持
condswitchwhile_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+reshapefuse,scale+matmulfuse。经过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 格式进行数据...
PaddlePaddle 1.7.1
Release Notes
功能升级
- 支持slice OP的二阶梯度计算。
- 在Ernie QAT量化的单元测试中增加可选参数:FP32 模型路径。用户设置后运行将呈现原始FP32模型精度和QAT INT8 模型精度。
BUG修复
- 修复编译安装时在CentOS 6下升级glibc至2.22以下引起的import paddle失败的问题。
- 修复预测C API在lod为空的时候,PD_GetZeroCopyOutput函数出core的问题。
- 修复DGC未对参数中regularizer项处理的问题。
- 修复Ernie QAT量化文档中精度复现指令问题。
PaddlePaddle 1.7.0
Release Notes
重要更新
本版本对框架功能层面进行了重点增强,预测部署能力全面提升,分布式训练发布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。
- 实现如下优化策略,并配合DALI数据预处理,ResNet50模型训练吞吐大幅提升:V100单卡混合精度训练吞吐从600+ images/sec提升到1000+ images/sec;单机8卡吞吐达到7840 image/sec,4机32卡吞吐达到28594 images/sec。
- 优化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%。
- DALI预处理加速
- 动态图
- 功能优化
- 移除了动态图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倍
- Python API
- 移动/嵌入式端Paddle Lite
- 对应发布v2.3版本。
- model_optimize_tool多项功能升级。
- 支持“无校准数据的训练后量化方法”,模型存储空间可减少2~4倍。
- OpenCL:完成30个Image2D Kernel迁移,涵盖14个OP。
- 对FPGA、NPU的支持进一步加强;支持昆仑XPU的预测。
- 发布全新官网文档;新增“无校准数据的训练后量化方法”使用文档。
- Paddle Serving:
- 发布bert类语义理解模型的远程文本向量表示预测服务。
- 发布了paddle-gpu-serving whl包,通过pip安装和Python代码即可部署和使用预测服务;
- 支持Paddlehub中的13种语义理解模型,支持单机多卡,使用Ernie_tiny模型在单张P4 GPU下平均样本长度为7时预测速度为869.56样本每秒。
- 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:支持受限于显存容量数据并行无法处理的大规模分类问题
- 内建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(单卡、多卡、多机)。
基础模型库
- 模型库地址
- 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
- 发布语音合成库Parakeet (Paddle PARAllel text-to-speech toolkit)
- 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利用率。
- 新增预训练模型SENet-vd、Res2Net、HRNet系列模型总共14个:
- 3D方向:
- 发布模型PointNet++、PointRCNN。
- 跟踪模型库 :
- 发布模型SiamFC、ATOM。
- 增加动态图模型实现: MobileNet-v1/v2、YOLOv3、FasterRCNN、MaskRCNN、视频分类TSM模型、视频动作定位BMN模型。
- 图像分类:
- PaddleRec
- 发布推荐领域多任务模型MMoE, 适用于工业界大规模多任务联合训练。
- 增加动态图模型实现:gru4rec、deepfm。
端到端开发套件
- PaddleDetection
- 进一步提升YOLOv3模型精度,COCO数据上精度达到43.2%,相比上个版本绝对提升1.4%。
- 新增模型实现及预训练模型:
- 新增Google AI Open Images 2019-...
PaddlePaddle 1.6.3
Release Notes
性能优化
- 优化ERNIE模型的CPU预测性能,BS=1时性能略优于竞品。
- 在FC的CPU实现中对GEMM进行Padding,使得ERNIE模型FP32的单线程预测性能提升8.97%,20线程预测性能提升42.52%。
- layer_norm实现多线程优化,该op 20线程性能提升4.73倍,ERNIE模型20线程性能提升8.88%。
Bug修复
- 修复由于动态图弃用reshape inplace策略而导致无法进行多卡训练的问题。
- 修复softmax_with_cross_entropy_op在axis dimension为1时出现Tensor未初始化报错的问题。
- 修复指数滑动平均(EMA) 连续多次 apply 时结果不正确的问题。
- 修复了Adagrad中设置decay参数不生效的问题。
- 修复了match_matrix_op设置较大lod整型溢出的问题。
- 修复 InitDevices() 在同一进程中前后调用的行为不一致问题。
- 一些 Passes 在 上一级 Scope 中创建中间变量,会引起克隆时 Scope 错误的修复。
- 修复 tensorrt calib engine key bug。
- 修复conv_elementwise_add_fuse_pass导致Xception模型预测出错问题。
- 修复multihead中softmax计算错误的问题。
- 修复conv_fusion在windows环境下无法找到GPU kernel的问题。
- 修复batch_norm_grad在scale和bias一个可训一个不可训练时会产生Shape为0梯度,导致后续若干错误的问题。
- 修复all_reduce会对Shape为0梯度做聚合操作的问题,添加断言定位出错Tensor。
- 针对多机开启sync_batch_norm会引入新拓扑依赖导致hang住的问题,对Fleet接口配置保持拓扑顺序避免hang住。
预测部署
- 修复由于图优化阶段node排序不稳定导致paddle-TRT int8 calib有时无法加载已有校准表,会重新生成校准表的问题。