Releases: PaddlePaddle/Paddle
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,记录模式信息。
- 支持
cond
switch
while_loop
控制流接口和 tensor array 的读写也可在动态图下使用 ,便于高层API的统一。 - 修改
if var
在动态图模式下的行为(不兼容升级),按var中的值进行判断,解决动态图模式下 if x > y 行为与预期不符的问题;并支持将var转换为float/long/int/len/index的功能,提动态图升易用性。 - 针对任务中强依赖hook的功能,新增Layer的forward pre-hook和forward post-hook接口,可以在不改变网络输入输出的结构的情况下方便地获取、改变网络中间层变量的值,提升动态图易用性。
- 支持cudnn algorithm cache可以在动态图模式下生效,在waveflow模型上性能提升200%。
-
声明式编程模式(静态图):
- 执行器支持根据feed和fetch变量在运行时自动裁剪网络,去掉与当前feed和fetch无关的部分,提升运行效率,支持多任务学习网络。
- 优化反向传播过程,对本身无需反向传播的变量进行自动裁剪,不再需要组网时对变量显式设置stop_gradient=True。
- 执行器支持多卡运行时fetch不定长Tensor的功能,对使用不定长数据的任务(如NLP类部分任务等)提供更好的支持。
- 解决单进程多卡预测阶段会丢弃尾部不足卡数的部分数据的问题,可以在DataLoader中设置drop_last=False来避免丢弃尾部数据。
- 增加混合精度(AMP)与重计算(Recompute)配合的机制,在Bert-large模型上配合使用二者,最大batch size提升400%,吞吐提升17.5%~31.4%;
-
DataLoader:
- 新增多进程模式加速数据读取,对于Map-style类型的数据集,用户可以通过实现自定义Dataset和BatchSampler的方式来提高数据读取性能,对于数据读取量大及预处理复杂的任务速度提升明显,如在视频分类TSM模型上,使用多进程读取模式,在声明式编程模式(“静态图”)下训练性能提升419%,命令式编程模式(“动态图”)下训练性能提升89.6%。
-
梯度裁剪使用方式:
- 裁剪类型统一由optimizer的grad_clip参数传入,支持全局参数裁剪和部分参数裁剪功能,原有set_gradient_clip接口不再推荐使用,并可能在后续版本中删除。同时,ParamAttr中取消了grad_clip参数(不兼容升级),无法再通过ParamAttr对单个参数进行梯度裁剪,对部分参数进行梯度裁剪的功能统一通过上述新接口实现。
-
动态图、静态图以及高层API支持一致的Collective Operators调用。
-
Intel对Ngraph停止维护,移除NGraph库相关代码。
-
移除所有MKL-DNN相关op中未使用的或者不兼容的属性,如
is_test
属性。 -
新增对复数计算的支持:
- 新增 ComplexVariable,支持复数张量的表示和常见的复数运算,包括四则基本运算、matmul、kron product、reshape、transpose 等;
-
性能分析工具(Profiler)功能升级:
- 支持按照事件之间的嵌套调用关系,分层次统计和打印Profile结果。
- 添加tracer_option参数,可配置为
Default
、OpDetail
和AllOpDetail
,支持用户选择不同程度的计时和分析对象。 - 添加对框架开销、GpuMemcpy操作的统计功能。
-
报错信息全面优化
- 累计优化数千条表意不清的报错信息,规范错误类型及错误描述。
- 自动检测某些用户易错操作,给出明确的报错信息。
- 优化GPU相关API报错信息,将不可读的错误代码转换为具体信息,与NVIDIA官网信息保持同步。
性能优化
-
命令式编程模式(“动态图”):
- 为降低框架overhead, 优化自动生成的OP函数的数据结构,ptb lm模型任务单卡训练速度提升4%。
- 为降低框架overhead, 优化InferVarType接口设计,提升了InferVarType的速度,ptb lm模型任务训练速度提升超5%。
- 为降低框架overhead, 减少了动态图op中非必要attribute的添加,在ptb lm模型训练任务上速度提升4%
- 为提升数据加载性能,实现Tensor申请共享内存存储及Tensor序列化与反序列化机制,支持进程间传输Tensor,优化原动态图异步DataLoader性能,ResNet模型任务在P40机器上单卡训练速度进一步提升超15%
- 优化了动态图 Variable slice 的性能,性能提升60%,并支持slice中step为负数。
-
声明式编程模式(“静态图”):
- 新增自动融合功能,支持将elementwise类、activation类、sum、cast、scale、fill_constant等逐元素计算类型的算子组成的子图进行融合,性能提升幅度依赖于在网络中匹配到的相关子图数量,目前对RNN语言模型训练速度有大幅提升。
-
OP性能优化:
- OP的执行过程增加对Prepare Data的缓存,在10+模型训练任务上平均加速2%,框架开销最高减少6%。
- 优化depthwise_conv2d的GPU性能,常用参数设置下加速20%。
- 优化elementwise_mul的GPU广播模式的实现,针对不同输入可加速2~50倍。
- 优化conv2d_transpose的GPU实现,针对fp16有显著性能提升。
- 优化shape OP实现,避免在不同设备间的不必要数据传输而引起的等待。
Bug修复
-
修复当数据量很大时,SGD报错
Xbyak::Error
的问题, 使得支持SGD大数据量可以成功运行。 -
修复Linux版本下MKL内存泄漏的问题。
-
修复动态图多卡启动时命令行参数解析的bug。
-
修复clone(for_test=True)接口处理含控制流op的网络时的问题。
-
修复动态图模块和静态图模块环依赖。
-
修正 python 2 & 3 之间 pickle dump/load 的兼容性问题。
-
修复动态图Layer不能注册或覆盖参数为None的问题。
-
修复不同Op name属性值相同时造成的Op输出Var命名冲突的问题。
-
修正concat op在axis=0时输出的LoD设置,应为输入LoD的拼接。
-
修复BatchNorm在eval模式下无法更新的mean和var的bug。
推理部署
Paddle Inference
功能升级
- 新增TRT子图对动态shape输入的支持, 新加
config.SetTRTDynamicShapeInfo(min_input_shape, max_input_shape, opt_input_shape)
接口。此接口用来指定子图的输入的最小,最大,最优的shape信息(最优shape表示,TRT会在此shape选择运行时最优kernel)。指定shape信息后,Paddle-TRT运行期间会使用Dynamic shape模式,预测期间支持min_input_shape
,max_input_shape
间的任意shape的输入。该功能支持包括FCN,Faster RCNN,Ernie/Bert等动态shape输入的模型。 - 为满足用户预测时将计算流绑定在当前线程上的需求,重构了设备上下文数据结构支持 CUDA 计算流优先级,并增加一个线程本地的显存分配器 ThreadLocalAllocator。具备不同线程绑定不同 CUDA 流的能力。
- MKL-DNN 量化功能全面支持所有量化模型,新增支持'weight_quantize_type'为range_abs_max和'channel_wise_abs_max',支持out_threshold属性。
- 新增官网推理API reference
性能优化
- CUDA Bert/Ernie针对性的优化, 添加了
embedding_eltwise_layernorm
融合实现,优化了multihead_matmul
,fc_elementwise_layernorm
融合实现。相比上一版本,P4卡,cuda10,batch_size=1下,ernie fp32预测从10ms优化至8.7ms。提升13%. - TRT子图对Ernie/Bert模型动态shape支持, 在T4卡,cuda10, batch_size=1下,ernie fp16 预测性能为2.9ms, 相比fp32的6.6ms,加速56%。
- Paddle-TRT对mobilenet v3的优化,支持TRT hard sigmoid OP,以及新增hard swish plugin,batch_size = 1下,P4下预测从3.48ms 到2.29ms, 性能提升34%; V100下预测从2.76ms 到1.33ms, 性能提升51%。
- 增加 swish 激活函数 DNNL 支持,使得ShuffleNet 在 6248单核上性能提升了76%。
- 量化:新增支持matmul op量化;新增
matmul+transpose+reshape
fuse,scale+matmul
fuse。经过matmul量化和新增fuses,Ernie fp32模型和量化后INT8模型都在原来基础上性能提升了~10%(在6271机器上)。 - 新增 DNNL inplace op支持:目前支持
elementwise_add
和包括softmax, gelu,relu等大部分激活函数的inplace执行,使得Ernie性能在6248上提升了~2% - 经过上述优化量化,目前Ernie INT8模型相比未经DNNL优化(包括fuses等)和量化的FP32模型提速~5.51倍。
Bug修复
- 修复Inference阶段在TRT int8离线量化中,因融合策略不稳定导致本地与服务端生成校准表名字不一致,从而本地生成的校准表在服务中无法识别加载,会重新生成校准表的问题。目前已经能够保证在多次运行TRT离线量化校准时,校准表名字保持一致。
- 修复Inference阶段TRT离线量化产生校准表过程中传参错误的问题。该问题会一定程度上影响最终的量化预测精度。
Paddle Serving
易用性提升
- 使用pybind对c++代码进行封装,提供python api的使用方式,提供paddle_serving_server、paddle_serving_server_gpu、paddle_serving_client的python2和python3环境whl安装包,发布了0.2.1版本
- 提供centos6/7环境的cpu和gpu Docker镜像,包含可执行镜像和可编译镜像
- 提供直接保存Serving部署所需的模型和配置文件的api,与Paddle训练框架无缝衔接
- 实现一行命令启动模型预测服务
功能完善
- 提供RPC和HTTP两种预测服务方式
- 支持Python和Go语言客户端
- 支持A/B test
- 发布了paddle_serving_app 0.0.2版本,针对LAC分词分词预处理、中文BERT模型预处理、图像处理提供预处理api。
- 支持预测服务Timeline可视化
性能优化
- RPC服务模式下,中文BERT语义向量表示预测服务比paddle_gpu_serving 0.8.2版本在单张P4卡batch size 1时预测速度提升2.04倍。
文档和示例
- 完善和添加中英文使用文档、中英文开发和部署文档、中文性能调优文档。
- 提供7种模型预测服务示例,包含中文分词、英文情感分析、中文语义向量表示、CTR预估、图像分类等领域。
Paddle Lite
功能升级
- 编译安装
- Paddle-Lite 编译脚本优化:Android\iOS\ArmLinux 平台各拆分出单独编译脚本,脚本提高易用性。
- 支持Python安装:可以在PC Linux/Windows/Mac 上安装Paddle-Lite Python 库;Python 可以调用Lite opt 优化模型。
- 支持windows 编译: 可以在windows环境编译Paddle-Lite ,当前windows环境只支持x86 编译。
- 基础功能
- 增加分割子图功能。对于以子图接入方式lite的模型,通过配置文件手动切分子图,让指定OP跑在host端,以提高性能(ssd_mobilenet_v1,加速约4.3倍)。
- 优化支持无校准训练后量化方法产出的量化模型,常见分类模型量化到8bit,精度损失从2%减小到0.1%。
- 硬件支持
- 新增RK 1808 NPU,支持全量化MobileNetV1模型;
- 新增MTK MT8175 APU,支持全量化MobileNetV1模型;
- 新增百度昆仑XPU Kernel接入方式,支持ERNIE、ResNet-50和BERT模型。
- 新增寒武纪MLU270,支持一下模型:Resnet50(int8)、Senet101(int8);
- 新增特大陆BM1682,支持以下模型: Mobilenet、Yolov3、Mobilenet-ssd、Inceptionv4、Vgg16、DarkNet-YOLOv3、PyramidBox。
- 移动端GPU(opencl):支持模型mobilenetv1/v2、GAN相关、mnasnet、sqeueezenet、shufflenet、resnet、unet、vgg16
- Nvidia GPU: 增加exec多流支持,对于存在并行性的模型结构,相对单流预计有5-15%的性能提升,对于常见视觉模型,一般不具有并行性结构,开启多流无收益。cuda平台下打开多流功能
config.set_multi_stream(true);
。 - 对x86 平台的优化:降低预测库体积(200M---->16M),支持关闭LOG(--shutdown_log=ON)、full_api 支持多线程共享模型权重参数、新增x86 cxx_demo
- 华为NPU:
- benchmark模型(mobilenet_v1,mobilenet_v2,squeezenet_v1.1,mnasnet,shufflenet_v2),提速5-10倍。
- 支持缓存不同尺寸的NPU模型,提升可变输入尺寸模型的性能。
- Demo:
- 新增基于相机预览的实时口罩检测Android Demo
- 新增实时人脸关键点检测和美颜Android Demo
- 新增移动端训练的波士顿房价预测Android Demo
性能优化
- InferShape耗时降低: Predictor连续运行时,infershape总耗时从0.25ms 降低至0.08ms
- opencl部分kernel支持动态shape并将部分计算移到ReinitWhenNeeded。fc_buffer、elementwise_add、scale、activation、grid_sampler。
- 优化sgemm在低端机上的性能表现
- 优化Precision Profiler功能。排版优化,新增支持标准差属性、增长率属性(在均值和标准差一样时,可以比较顺序),支持对OpenCL的Image/Buffer的每层output的精度打印,支持将每层的精度结果(最终的precision summary)写入手机设备上,便于APP调试,将精度打印与原有统计耗时的profiler的依赖分开。
Bug修复
- 修复conv op的激活act_type未初始化导致的不同Predictor结果随机的问题。
- 修复opencl kernel。bilinear kernel在mali gpu上兼容性问题、instance norm计算结果不对的问题、reshape的kernel注册错误导致模型转换失败问题、exp和tanh找不到kernel的导致注册kernel名写错绑定模型op失败问题。
- 修复opencl在mali gpu的执行计算结束卡主的问题。
- 修复opencl的资源相关问题。隔离每个Predictor中每个cl::kernel/cl::program等资源。
PaddleSlim
量化
- 增加无校准数据训练后量化方法,int16精度无损,int8精度损失低于0.1%。
- 增强量化功能,完善量化OP的输出scale信息,支持CPU预测端全面适配量化模型。
剪裁
- 新增FPGM和BN scale两种剪裁策略, 在MobileNetV3-YOLOV3-COCO任务上,同等压缩率下精度提升0.6% 。
- 新增自定义剪裁策略接口,方便开发者快速新增压缩策略。
- 剪裁功能添加对新增Operator的默认处理逻辑,扩展支持剪裁更多复杂网络。
NAS
- 新增DARTS系列搜索算法,并提供扩展接口,方便用户调研和实现新的模型结构搜索策略。
- 模型结构搜索添加早停机制,提升搜索功能易用性。
- 新增一种基于强化学习的模型结构搜索策略,并提供扩展接口,为用户调研实现新策略提供参考。
Pantheon
- 支持以 fp16 格式进行数据...
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有时无法加载已有校准表,会重新生成校准表的问题。
PaddlePaddle 1.6.2
Release Notes
重要更新
- 报错信息优化
- 规范并升级Paddle的报错体系,为内部检查增加了声明报错类别的功能,具体地,增加了12种错误类型、以及相应兼容原有体系的用于声明错误类型的接口,解决了Paddle报错无类别的问题。
- 进一步简化了C++报错信息栈,去掉C++报错信息中由于Place参数引入的大量无用boost模板参数信息,对于Op类报错缩减了50%以上的栈信息,显著提升了有效信息的密度和调试体验。
- 全量拦截Op获取Kernel类型时由于Tensor未初始化导致内部报错且报错信息晦涩难懂的问题,增加了合理的检查,并辅以清晰明确的报错提示信息,有效提升了调试体验。
- 进一步优化了Paddle报错信息栈的排版,将开发者书写的错误提示置于Error summary最前方,调整Paddle错误检查模板生成的提示至次行,用Hint字样标明,使用户能够直观看到最重要的错误提示信息,提升了调试体验。
- DGCMomentumOptimizer完善及bug修复
- 完善DGC算法流程使其与论文一致,对论文中未涉及的Regularization(Weight Decay)项进行修正,精度已完全对齐baseline。
- 针对DGC下开启fuse策略会导致DGC失效的问题,添加报错信息引导用户关闭fuse。
- 修复DGC通信流下临时分配buffer导致的nan及hang住问题。
bug修复
- 修复one_hot算子中allow_out_of_range参数无效的问题。
- 修复softmax_with_cross_entropy GPU数值稳定版计算可能出现INF最终导致出现NAN的bug。
- 修复pool/conv/conv_transpose系列中padding是”SAME”模式时实际padding值计算的bug。
- 修复expand API报错信息文案中写错类型名字。
- 修复test_accuracy_op.py和test_zeros_op.py两个错误的报错单测。
- 修复ParallelExecutor fuse_all_optimizer_ops策略在部分Operator没有GPU kernel时,网络使用脏数据训练导致计算错误的bug。
- 修复ParallelExecutor fuse_all_optimizer_ops策略在混合精度训练时仍然使策略生效从而导致训练报错退出的易用性问题。
- 修复elementwise_mod float/double kernel可能计算出负值的问题。
- 修复custom op编译时mkldnn等头文件未提供问题。
- 修复batchnorm中用户不能同时使用fuse_with_relu和act参数不能同时使用问题。
- 修复elementwise_add op MKL-DNN kernel中内存错误(导致人脸模型预测报错)。
- 修复pool/conv/conv_transpose MKL-DNN kernel中padding是“SAME”模式时实际padding计算的bug。
- 修复ERNIE-large模型使用MKL-DNN预测报错问题。
- 修复Gelu grad op在AVX2机器上的精度diff问题。
- 修复layernorm反向单测问题。
- 修复训练后量化和训练中量化优化性能在C-API下比较问题。
- 修复ernie预测中multihead计算的differ问题。
- 修复GRU OP计算的问题。
- 修复共享参数模型如retinanet下使用paddle-TensorRT预测时,重复设置cpu weight的报错仍然存在的问题。
Op升级
- crop_tensor支持参数
shape
任意元素为-1。 - maxout、lrn支持输入为NHWC格式。
- batch_norm momentum参数支持Variable作为输入。
- AdamOptimizer beta1/beta2参数支持Variable作为输入。
- conv/conv_transpose/lrn/pool op MKL-DNN kernel 支持前向NHWC计算。
- 对于conv/conv_transpose/lrn/pool op MKL-DNN kernel 反向无法支持NHWC格式进行报错提示。
- 提升argsort op的性能,添加descending排序模式。
- conv_fusion OP 支持非对称padding特性。
性能优化
- 优化数据规模较大场景下topk op的性能。
预测部署
AnalysisPredictor
的DisableGlogInfo()
接口提供屏蔽预测所有日志输出的功能,满足在使用paddle预测库时仅输出用户自定义日志的需求。- Paddle预测(包括Paddle-TRT子图)支持NV Jetson硬件,包括nano,tx2,Xavier。
- 支持Paddle预测在Jetson硬件上的源码编译。
- 发布1.6.2 Jetson硬件C++预预编译预测lib,官网链接。
- 保持接口的一致性:C++预测接口没有发生变化,在Jetson硬件上使用预测接口同Server端一致。
- 支持所有Paddle训练产出的模型在Jetson硬件上可使用Paddle原生预测。
- 支持Paddle-TRT预测在Jetson硬件上的加速。
PaddlePaddle 1.6.1
Release Notes
Bug修复
- 修复crop_tensor不支持shape参数中多个元素为-1的bug。
- 修复conv_transpose未兼容AnyLayout设置的bug,该bug会导致预测模型运行出错或者结果与以前版本存在差异。
- 修复reshape的input不支持多个维度值为-1。
- 修复split op不检测参数num_or_sections为list/tuple时元素值的正确性。
- 修复anaconda安装失败,不需要把检查文档示例的python文件打入whl包。
- 修复MKL-DNN在第二代智强可扩展平台6271上FP32和INT8性能回归问题。
- 修复concat中报错信息中未正确打印变量。
- 修复pool参数pool_padding和conv/conv_transpose参数padding不兼容旧版本预测库。
预测部署
- 模型支持
- paddle-TensorRT支持分割模型pspnet,在P4上提升性能11.8%。
- 易用性优化
- 针对TensorRT 5及以下版本不支持变长输入,而用户在输入不一致shape时无明确报错信息的问题,为paddle-TensorRT输入shape添加了检查,现在当输入shape不一致时会抛出正确报错信息,提示用户设置正确的输入shape。
- 问题修复
- 针对paddle-TensorRT在含有adaptive_pool2d op的模型上存在diff的问题进行了修复,现在paddle-TensorRT已支持adaptive pooling。
- 针对paddle-TensorRT在转换split op时不能正确处理num_or_sections属性为整数时的情况导致报错的问题进行了修复,现在paddle-TensorRT已经能对split op正常支持。
训练框架
- OP功能优化升级
- split op参数num_or_sections支持包含Tensor的list,参数dim支持Tensor;
- split op参数num_or_sections 是list/tuple时,支持包含-1并自动推断-1的值;
- concat op参数axis支持Tensor;
- unsqueeze op参数axes支持int,Tensor及包含Tensor的list;
- maxout op支持NHWC格式输入,新增参数axis用来指定通道所在维度索引。
- lrn op支持NHWC新增参数data_format指定数据格式。
- OP功能完善
- 重新实现squeeze_op使之能够支持动态图。
- 报错信息优化:
- 增强Operator类中TypeError的报错信息文案。
PaddlePaddle 1.6.0
Release Notes
本版本重点完成了针对用户体验和易用性的全面优化工作,增加并优化了大量的OP,对于基础训练、预测及大规模分布式训练性能有了进一步的提升,模型库及配套工具组件对应实现了全方位的完善升级。
重要更新
- 用户体验和易用性专项提升,包含全面的文档优化、报错信息优化、配置项优化、接口优化、编译优化、多平台支持以及编程易用性提升等各方面。
- 训练框架进一步优化了速度,完善了显存优化机制,并支持在框架外部自定义C++/CUDA OP。新增了大量OP,并从多个维度优化了大量存量OP,包括兼容性、行为一致性、功能提升等方面。
- 分布式训练新增LocalSGD、GEO-SGD等策略,大规模同步训练、异步训练速度继续提升,并支持K8S + Volcano任务提交。
- 部署能力强化:
- 服务器端预测库增加C API,并支持版本兼容检查,实现了大量性能优化工作。
- 发布PaddleLite,定位高性能、多平台、轻量化的端侧预测引擎,并可作为服务器端预测库的加速库。
- PaddleServing新增超大规模分布式预估服务能力。
- PaddleSlim强化了量化训练功能,增加了基于硬件的小模型搜索功能。
- 模型库易用性和丰富度提升:
- PaddleNLP,发布全新seq2seq相关API和文本生成模型样例。语义表示库新增XLNet预训练模型;开源EMNLP2019阅读理解竞赛冠军模型D-NET,同时支持18个不同抽取式阅读理解数据集打榜。发布飞桨多任务学习库PALM (PAddLe Multi-task learning),更便捷支持多任务机器学习调研。
- PaddleCV,发布训练部署端到端的图像分割库PaddleSeg。图像分类新增EfficientNet等43个预训练模型。PaddleDetection新增2019 Objects365 Full Track冠军模型、BlazeFace等人脸检测小模型,行人检测和车辆检测的预训练模型。PaddleVideo新增ActivityNet Challenge 2019夺冠模型,扩展包含video caption、video grounding等模型。
- 发布PaddleSpeech,包含语音识别模型DeepSpeech和语音合成模型 DeepVoice3。
- 增加PaddleRec的模型覆盖。
- 配套工具组件全面升级:
- PaddleHub新增超参优化Auto Fine-tune功能,并全面提升Fine-tune功能的灵活性和易用性,预训练模型数量大幅增加。
- 飞桨图学习框架PGL正式版发布,易用性、规模性、丰富性全面提升。
- 飞桨深度强化学习框架PARL并行能力进一步提升,支持进化算法。
- Paddle2ONNX和X2Paddle全面升级,飞桨和其他框架的模型互转更加方便。
- 发布飞桨联邦学习框架PaddleFL。
用户体验提升
- 编程易用性提升
- fetch变量便利化:针对以往基于变量重命名的存储优化策略必须要求fetch变量设置persistable=True的bug,重构了Inplace复用和跨Operator复用策略,不再强制要求fetch变量必须设置persistable=True,且不会改变任何变量的名称,且均能保证结果的正确性。
optimizer.minimize
和其他接口调用的位置敏感性问题- 针对用户搭建网络时易将
exe.run(startup_program)
置于optimizer.minimize
之后执行,从而导致不明报错的问题,在Optimizer类Op中增加了初始化检查以及易于理解的提示信息,使再出现此类问题时用户能够快速定位错误。 - 针对用户搭建网络时易将
test_program = main_program.clone(for_test=True)
置于optimizer.minimize
之后执行,从而导致模型测试结果错误的问题,在clone中增加了自动反向裁剪策略,使test_program的clone操作的正确执行不再依赖于optimizer.minimize
的先后关系
- 针对用户搭建网络时易将
- 默认配置项
- 显存Garbage collection开关默认打开(对应FLAGS_eager_delete_tensor_gb环境变量=0)。
- build_strategy的选项:
build_strategy.enable_inplace
策略默认打开,提供更好的内存优化效果。build_strategy.memory_optimize
跨Op内存复用优化策略的默认行为调整为:在Garbage collection策略打开时默认关闭(规避两者合用会比只用Garbage collection策略效果差的问题);而在Garbage Collection策略关闭时默认打开。用户可显式设置build_strategy.memory_optimize = True/False
强制打开或关闭跨op内存复用优化策略。build_strategy.fuse_all_reduce_ops
和build_strategy.fuse_broadcast_ops
选项默认打开,可以减少计算图中的计算节点个数,进而加速计算图执行。
- execution_strategy选项:
- 将
num_iteration_per_drop_scope
默认值从1改成100,每次迭代之后都要进行一次同步操作,提升速度。
- 将
- 接口优化
paddle.fluid.memory_optimize
接口废弃,由于该接口存在优化效果差,不稳定等问题,从此版本起,调用该接口不会对用户网络进行任何操作,并可能在后续版本中彻底移除该接口,建议用户删除代码中的paddle.fluid.memory_optimize
调用,并使用Garbage Collection策略进行内存优化(设置FLAGS_eager_delete_tensor_gb环境变量为0,默认已开启)。- 新增数据读取接口DataLoader。用户可通过
fluid.io.DataLoader.from_xxx
创建数据加载器,如DataLoader.from_generator
,DataLoader.from_dataset
等,可通过Python的for-range方式迭代,简化使用方法,统一接口形式。其他数据读取接口如py_reader等将在未来版本中弃用。 - RecordIO接口移除,不再支持RecordIO接口。
- 优化data接口,新的fluid.data接口相对fluid.layers.data 接口将对输入的数据的 shape 和 dtype 进行检查,使用None 和 -1 支持可变长维度。如果输入的 shape 或者 dtype 不对,将会报错。
- 报错信息优化:
- 简化C++信息栈输出,过滤和paddle函数无关的、对调试几乎没有帮助的栈信息和符号,大幅缩短了信息栈长度,提升了调试体验。
- 对报错信息栈重新排版,添加清晰的分段标识与提示,并将核心提示置于最后,便于用户迅速定位重要信息,提升了调试体验。
- 对34个重点python api增加输入类型检查,能正确报出输入类型不符合的错误,避免误导性报错。
- 增强34个重点Op的维度检查报错信息,能打出详细维度信息,便于用户调试。
- 针对sequence类op输入不含LoD的Tensor时报错不清晰的问题,为sequence类op增加了Input Tensor LoD信息检查,使错误提示更加直观易懂。
- 强化机器自动化报错信息输出,在CI中强制推荐使用
PADDLE_ENFORCE_XXX
来替换PADDLE_ENFORCE
接口,模版化打印出更具体的报错信息,并对应完成修复存量修复。
- 文档优化
- 全面优化了所有API的中英文文档,保证文档的正确性、规范性、易读性,完善对应示例。
- 增加了动态图中相关的更多文档说明和实例。
- 对预测教程文档进行整体修改,重新组织结构和内容,提高了可读性和实用性。
- 优化了部分指南性文档。
- 编译优化:
- 将默认的
CMAKE_BUILD_TYPE
从RelWithDebInfo
改成Release
,减少初次接触的开发者的编译目录大小,避免因为编译目录太大导致编译失败 。 - 修复
inference_lib.cmake
编译随机失败的问题。 - 去掉
use_fast_math
编译选项,避免为了提升性能而降低了CPU/GPU上的精度。
- 将默认的
- Windows支持增强
- 支持vs2017编译。
- 编译流程优化,拆分第三方和Paddle的编译依赖关系,不再依赖openblas的预编译库。
- 支持cuda10。
- 增加模型支持,修复之前在windows无法正常运行的模型。
- 支持Paddle CPU 版本离线安装包。
- 支持预测SDK C-API。
训练框架
-
性能优化
- GPU性能优化
- 使用cuRAND库优化dropout的GPU实现,dropout op本身加速3.4倍,Transformer base模型和big模型在V100上的训练分别加速3.8%和3.0%。
- 对smooth_label的CUDA核函数完成代替Eigen实现,smooth_label op本身加速1.47倍。
- 对 recurrent_op 的冗余 tensor copy 进行 share data,和删除运算过的 scope,该优化使得 benchmark 中 RNN 相关模型显存占用减少了 3 - 4 倍,速度有 2% - 数倍的提升。
- CPU性能优化
- BERT优化:新增matmul multi-head MKL的支持。
- 对lookup_table_op和sequence_pool_op (sum类型)做fuse,使用sparse GEMM优化,PyramidDNN模型在CPU上的训练速度获得8%的提升。
- 内存/显存优化:
- 新增变长输入下的MKLDNN分层缓存策略和清理策略,修复MKLDNN在变长输入下内存泄漏问题。
- 添加了控制流 op 多层嵌套情况下的显存优化策略支持。
- Allocator容错机制。针对多线程并发申请显存导致显存可能瞬间峰值超标问题,设计了Allocator重试策略,在第一次申请显存失败后会等待最长10s进行失败重试(若期间有显存释放,会提前触发失败重试)。
- 显存Cache清理。解决了以往TemporaryAllocator和cuDNN workspace单例会cache显存不释放的问题,提高显存利用率。
- 新增AutoGrowth显存分配策略。用户可通过设置环境变量
FLAGS_allocator_strategy=auto_growth
开启显存自增长策略,按需分配显存,解决了原有预分配92%可用显存策略占用显存过多、难以按需分配的问题,且不影响模型训练速度。 - 显存的Allocator容错机制完善,保证Allocator的稳定性。针对多线程并发申请显存导致显存可能瞬间峰值超标问题,设计了Allocator重试策略,在第一次申请显存失败后会等待最长10s进行失败重试(若期间有显存释放,会提前触发失败重试)。
- GPU性能优化
-
OP
- 支持用户在框架外部、脱离框架自定义C++/CUDA OP。
- 新增OP
- 新增eye_op,用于构建单位矩阵,或一批单位矩阵。
- 新增gather_nd_op,gather_op的高维推广,用于将输入数据中的切片,收集到由索引指定的形状的张量中。
- 新增scatter_nd_op,scatter_op的高维推广,这个操作与scatter_nd_add_op类似,除了相加的张量是通过零初始化的。相应地,
scatter_nd(index, updates, shape)
等价于scatter_nd_add(fluid.layers.zeros(shape, updates.dtype), index, updates)
。 用于根据索引indices将更新数据updates散布到新的(初始为零)张量中。 - 新增scatter_nd_add_op:通过对Variable中的单个值或切片应用稀疏加法,从而得到输出的Variable。
- 新增center_loss:用以辅助Softmax Loss进行人脸的训练,利用softmax loss来分开不同类别,利用center loss来压缩同一类别。center loss意思为:为每一个类别提供一个类别中心,最小化mini-batch中每个样本与对应类别中心的距离,从而达到缩小类内距离的目的。
- 新增LookAHead Optimizer:针对Paddle不支持Lookahead优化算法这一问题,我们新增了这一优化算法。它的核心原理是:维护两个参数,快参数正常做前向反向运算,当快参数更新k次后,用它来更新慢参数,使二者同步。他的效果是在某些模型上能收敛更快。
- 新增InstanceNorm op 实例归一化:根据每个样本的每个通道的均值和方差做归一化,一般用在图像生成模型中,把一个样本的风格迁移到另一个样本中。
- 新增PreciseRoiPooling :PrROI Pooling采用积分方式计算每个pool区域的值,这种计算方式将区域中的插值看作是连续的,计算所有插值点求积分得到该区域所包围点的总和,最后除以pool区域面积就得到该区域的值,因此结果更加准确。
- 新增hard_swish_op:hard_swish激活函数,在MobileNetV3架构中被提出,相较于swish激活函数,具有数值稳定性好,计算速度快等优点。
- 新增mse_loss_op:均方损失函数,用于计算两个输入间的均方差。
- 新增elementwise_mod的float/doule kernel。
- 新增strided_slice op。
- MKLDNN kernel更新
- 新增Leaky_relu的MKL-DNN kernel 和 conv + activation fusion pass。
- 支持不同axis的softmax MKL-DNN kernel。
- 重构5个op (conv, pooling, batch_norm, softmax,LRN)的FP32 MKL-DNN kernel代码,增强代码可维护性和可读性。
-OP功能优化升级
- 部分op参数升级支持tensor及包含tensor的list,支持常数对应维度的推断:
- slice op 涉及参数
starts
和ends
; - reshape op 涉及参数
shape
; - expand op 涉及参数
expand_times
; - pow op 涉及参数
factor
; - fill_constant op 涉及参数
shape
,并将calc_gradient接口中使用的fill_constant_batch_size_like替换为fill_constant; - uniform_random op 涉及参数
shape
, 支持tensor及包含tensor的list; image_resize
、resize_nearest
、resize_bilinear
、resize_trilinear
支持out_shape
为tensor或者包含tensor的list,支持常数对应维度的推断,scale
参数支持tensor;- 新增
crop_tensor
,支持shape
参数为tensor或者包含tensor的list,支持常数对应维度的推断。
- slice op 涉及参数
- 优化部分op输入tensor的维度检查
- 移除
huber_loss
、rank_loss
和cross_entropy
op中输入shape的最后一维强制为1的限制,输出loss的shape与label保持一致。 - 新增
fluid.one_hot
和fluid.embedding
op,移除input参数shape最后一维为1的限制。 - 优化
sequence_pad
和sequence_unpad
op中length的shape,由[n,1]
简化为[n]
。
- 移除
- 部分op升级支持channel_last格式输入:
- conv2d、conv3d、pool2d、pool3d新增
data_format
参数,支持channel_last格式输入。 - conv2d_transpose、conv3d_transpose新增
data_format
参数,支持channel_last格式输入。 - image_resize、resize_nearest、resize_bilinear、resize_trilinear新增
data_format
参数,支持channel_last格式输入。 - group_norm支持channel_last格式输入。
- conv2d、conv3d、pool2d、pool3d新增
- 涉及padding操作的OP,支持非对称padding,以及
SAME
和VALID
两种padding方式- conv2d、conv3d、pool2d、pool3d支持上述padding方式。
- conv2d_transpose、conv3d_transpose支持上述padding方式。
- 对以下op进行inplace显存优化支持:
- elementwise_add_grad_grad, elementwise_sub_grad_grad, elementwise_mul_grad_grad, elementwise_div_grad_grad, relu_grad_grad, leaky_relu_grad_grad, sqrt_grad_grad, square_grad_grad。针对GAN模型梯度惩罚显存占用较高的问题,为二重反向op添加inplace,优化其显存占用。
- 升级部分仅支持LoDTensor输入的OP兼容padding模式,包括linear_crf_op , crf_decoding_op, hash_op, edit_distance_op, chunk_eval_op, warpctc_op, ctc_align_op, row_conv_op。
-
Intel N-Graph集成
- 增加了ngraph_subgraph_pass对训练的支持,通过build strategy激活N-Graph提供对parallel executor的支持。
- 修正N-Graph对多线程问题,提供对多线程预测的支持。
-
动态图
- 性能优化
- 对动态图底层执行机制进行了重构,在大部分模型上有30%左右的速度提升 ,显存开销有2%左右下降。
- 功能完善:
- 支持基于stop_gradient设置的自动剪枝功能和detach接口,满足冻结部分子网的需求 。
- 支持模型在不同设备上执行data_transform, 可以使用less_than/greater_than等功能。
- 重新实现op(unsqueezed_op、unstack_op、flatten_op、fill_constant_op)等,使之能够支持动态图。
- 易用性提升:
- 针对部分动态图不支持的接口提供了优化的报错 (包括Variable相关接口和Optimizer相关接口)。
- 针对Layer中的参数提供了可供访问的接口。
- 优化动态图save load接口,旧的dygraph下面的 save_persistables 删除。
- 支持了Layer call()可以使用关键字传入,使得前向执行时可以自定义传入的参数。
- 性能优化
预测部署
- 服务器云端预测库
- 接口优化
- 增加预测C API。
- 针对设置环境变量
GLOG_v=4
可以打印出预测过程中包含模型op及op fuse的详细log会暴露较多信息,为AnalysisConfig
添加DisableGlogInfo()
接口(当前仅支持全局最多调用一次),方便使用者关闭GLOG输出,避免模型结构泄漏。 - 针对用户在使用C++预测库时不易获得模型描述中的输入shape的问题,为
AnalysisPredictor
添加GetInputTensorShape()
接口,方便用户在运行预测引擎之前从模型中拿到输入shape,以避免输入错误的shape。
- 功能优化
- 在模型中添加了模型版本号及算子兼容性信息。在此版本之后,旧版本模型在新版本 Paddle 库上使用 AnalysisPredictor 执行预测时会进行兼容性检查。
- CPU INT8量化预测支持持续加强:支持mobilenet-ssd的训练后量化, 精度下降1%内, 性能提升3倍在第二代智强可扩展处理器6271上;新增Mul op的INT8 MKL-DNN kernel。
- 性能优化
- 优化了Mobilenetv2, ShuffleNet, Effecientnet 在CUDA GPU下的预测速度,mobilenetv2 从 5.3ms 减至 1.9ms,Shufflenetv2 从 6.3ms 减至1.4ms,Effecientnet 从60ms 减至 32ms。
- 实现一个简化Graph中基础op的Pass,预测时,upscale_in_train类型的dropout op直接移除,downgrade_in_infer类型的dropout op使用scale op代替。该优化使ERNIE模型在P40上的预测速度提升1.8%。
- 实现一个cudnn_placement_pass,将Graph中所有op的use_cudnn设置成true。该优化使ERNIE模型在P40上的预测速度提升10%。
- 实现fc op的GPU Kernel,并支持将激活操作融合到fc op中。该优化使ERNIE模型在P40上的预测速度提升2.1%。
- 实现融合fc+elementwise_add+layer_norm操作的Pass和GPU Kernel。该优化使ERNIE模型在P40上的预测速度提升4%。
- 实现了multihead matmul 融合算法的相关PASS和Kernel。该优化使Ernie模型在P4 GPU上...
- 接口优化
PaddlePaddle 1.5.2
Release Notes
训练框架
- 易用性
- 性能
- 显存
- 优化默认显存预分配策略。新策略会默认预分配GPU当前可用显存的92%,而不是总显存的92%,保证用户在已有任务占用显存时起PaddlePaddle任务不会失败。
- 修复了affine_channel op在scale和bias有梯度时开启垃圾回收策略后出现变量误删除的Bug。相关PRPR18849。
- op 修复
- windows支持
- 增加了cuda9, cuda10 的预测库支持,支持编译cuda9 与 cuda10的预测库
- windows平台CUDA相关报错优化,优化了部分cuda和cublas相关API调用出错的提示信息
- 预测库编译和文档优化,优化了windows平台下预测库编译的文档说明
- 安装
- 修复了文档中的部分错漏
- 增加了conda的安装支持和相关文档
预测部署
- 增加paddle-trt fp16支持
- 修复Mask RCNN模型预测的Bug
- 修复affine channel fuse 导致mask rcnn的diff。
- 修复condition block op导致预测期间显存/内存持续增长问题。
- 修复merge lod tensor op导致的bug:当有中间样例预测为空时,后续的样例都被预测为空。
- 修复预测中打开memory optim开关由于lod_reset op导致的结果diff问题。
- 修复TensorRT多线程clone预测会访问野指针的Bug。相关PR#19379
- 修复tensor_array_to_tensor临时scope导致的显存/内存泄漏。相关PR#19380
- 修复Anakin接口调用的一处尺寸错误。相关PR#19383
- 支持seqpool_cvm_concat的融合。相关PR#19381
- 升级预测Python API,支持直接使用numpy传递数据。
分布式训练
- 修复distributed lookup table模式下save参数的Bug。
- 修复communicator模式析构时core dump的Bug。相关PR#18606
- 修复同步模式下,训练过程中出现rpc deadline的Bug。相关PR#18984
- 修复compiled program模式下使用communicator。相关PR#18350
- 修复了文档中关于多机增量训练的错误。相关PR#1077
- 修复了Fleet API GPU训练的Bug。相关PR#18966 #19167
动态图
- 修复了动态图下conv2d transpose op bias问题。
模型建设
- 添加了roi_perspective_transform变换矩阵和mask的输出。
- 修复了depthwise_conv kernel size为5x5时的Bug。
- 修复了sqrt, square二次反向操作中的InferShape问题,使得生成模型中含有InstanceNorm的梯度惩罚可以正常使用。
PaddlePaddle 1.5.1
Release Notes
Bug修复&新增功能
- 修复在Mac上判断AVX标志时的随机错误
- 修复Mac编包时没有nproc命令
- 修复gpu镜像中nccl2软链失效问题
- 修复在使用AnalysisPredictor进行预测时,显存/内存优化功能对带while,condition block op的模型出现Segmentation Fault的Bug
- 修复fp16 使用fusion allreduce的Bug
- 修复预测中conv_affine_channel fuse pass中导致预测误差的Bug
- 修复topk处理一维数组的错误
- 自动混合精度训练新增黑白名单功能
- 模型在单卡情况下选用Reduce模式运行时,执行器会提示警告之后正常运行,而不会直接挂掉
- Anakin预测引擎的接口更新,支持x86和gpu同时开启时的Anakin子图
- 新增Python API paddle.fluid.is_compiled_with_cuda用于判断安装的Paddle是否支持cuda
PaddlePaddle 1.5.0
Release Notes
重要更新
- 训练性能在数据读取、执行调度优化、OP计算逻辑及底层cudnn、CUDAKernel、MKLDNN等方面进行了大量优化,训练性能大幅提升;进一步优化显存占用,整体具备领先优势
- 新增基于Padding方式实现的LSTM、GRU,更方便用户学习和使用;并基于对应API新增语言模型、seq2seq翻译模型的示例模型;增强部分OP功能,更好地支持NLP中Tensor多个维度可变的任务
- 正式发布动态图Preview版并提供相关的API文档,并提供 7个模型动态图版本官方实现
- 官方模型库方面正式发布PaddleDetection物体检测统一框架,覆盖主流目标检测算法,易扩展和模块化组合使用;发布图像生成库,覆盖主流的GAN算法,可一键式运行;发布PaddleNLP-Research,包含百度在 NLP 领域最新研究工作
- 模型压缩框架PaddleSlim新增基于模拟退火的自动剪切策略和轻量级模型结构自动搜索功能(Light-NAS)
- 分布式训练发布HighLevel API Fleet,单机转分布式训练成本显著降低;GPU多机多卡性能显著提升,在ResNet50、BERT、ERNIE等模型中4x8 v100配置下相比此前发布的Benchmark提速超过50%
- PaddleHub新增29个预训练模型,总计覆盖文本、图像、视频三大领域40个模型,并全面提升易用性,发布PaddleHub官网
- 发布图学习框架PGL(Paddle Graph Learning) Preview版,提供基于游走以及消息传递两种计算范式去搭建最前沿的图学习算法
训练框架
- 安装&环境:
- 增加Linux下对CUDA 10的支持,增加Windows下对CUDA 9的支持,cuDnn版本统一为7.3+
- 安装包不按照CPU处理器是否支持AVX指令集做区分,支持自动判断并选择选择使用AVX指令集或不使用用AVX指令集
- 针对Python2、Python3下可能版本不兼容的依赖包限制了版本范围,以支持Python相应环境下正确安装
- 提供可全离线安装PaddlePaddle的Docker镜像
- 增加安装后的GPU多卡运行检测
- 解除GPU单卡训练时对NCCL的依赖
- 动态图Preview版:
- 发布动态图相关的API和文档
- 基础功能完善,显存和速度优化,支持GPU单机多卡训练
- 增加transformer、ocr recognition、resnet、language model等7个模型效果对齐的动态图版本实现
- 性能优化:
- 数据读取优化
- 使用多进程优化数据读取、预处理部分,DeepLab V3+单GPU训练获得63%的性能提升。
- Op计算逻辑优化
- 优化concat/spilt op输入/输出个数<=4的实现,避免1次CPU->GPU的数据传输。
- 优化recurrent op中执行器的调用方法,修改成在迭代前调用一次executor.Prepare,迭代中executor.RunPreparedContext执行计算,从而避免每次迭代反复创建op。该优化对PaddingRNN padding small和large模型分别带来23%和15%的性能提升。
- 融合优化器Momentum op的计算,对Resnet50单GPU、4 GPU训练分别可带来1.6%、10.6%的性能提升。
- cuDnn使用策略优化
- 使用cuDnn v7中新增的算法选择API cudnnGetConvolutionForwardAlgorithm_v7优化conv_cudnn op算法选择策略,Mask-RCNN和YoloV3单GPU训练分别取得32%和11%的加速。
- 一些op的cuDnn实现慢于cuda实现,比如conv2d_transpose、pool2d(global_pooling=True)时,设置use_cudnn=False后,Cycle GAN、SE-ResNeXt单GPU训练分别获得33%、34%的性能提升。
- Op CUDAKernel优化
- 使用精心优化的CUDA kernel优化sum op,对多个LoDTensor求和这种情况优化效果特别明显,GPU执行获得3.3x的加速。
- 使用2D线程Block配置优化elementwise_mul grad op,加速其CUDA Kernel中的Broadcast操作。
- Intel CPU底层计算优化
- 增加新的OP融合Pass(conv+relu6,conv_transpose+elementwise_add)
- 增加新的FP32 MKLDNN kernel (FC),INT8 MKLDNN kernel (Concat)
- 优化若干OP,包括sequence_reverse(前向), sequence_padding(前向), sequence_unpad(反向),bilinear interpolate(前向)
- 优化MKLDNN集成(如对reorder原语进行重用以减少每次创建原语的时间)
- 数据读取优化
- 显存优化:
- Op层显存优化(在Transformer、Mask-RCNN等模型上显存节省1G以上)
- 提高了inplace策略的覆盖面,支持sum、softmax、softmax_with_cross_entropy等op的inplace计算
- 修复了dropout、conv_transpose、activation op的反向注册,降低op的显存占用
- 显存分配与显存复用策略重构
- 重构Allocator底层架构,为后续扩展Allocator策略提供基础
- 重构Inplace策略重构,使其代码便于维护,并排除之前策略中变量可能存在误inplace、graph存在环等bu
- 配置优化
- 用户可通过环境变量FLAGS_conv_workspace_size_limit设置conv层的最大workspace size,单位为MB
- Op层显存优化(在Transformer、Mask-RCNN等模型上显存节省1G以上)
- 执行优化:
- 更新CPU_NUM的默认配置为1,之前为设备的逻辑总核数。
- 对Operator中OpKernel进行cache,避免每次run都重复的选择kernel。
- ParallelExecutor执行模式(CompiledProgram.with_data_parallel())下的优化:减少同步操作;优化在num_thread=1时的速度,对于小模型的速度提升较为明显。(对于PaddingRNN small model 速度提升16%)
- 框架基础功能增强
- build_strategy新增mkldnn_enabled_op_types选项,用户可以灵活地控制哪些op需要使用mkldnn kernel以获得加速
- 新增ParallelExecutor下的drop_local_exe_scopes接口,可以控制什么时候清理local scope中的数据num_iteration_per_drop_scope的设置依然有效
- 新增自动混合精度训练接口fluid.contrib.mixed_precision.decorate(),支持图像分类、BERT等模型的训练
- 新增fluid.gradients接口,11个操作支持做二次反向,使用于图像生成的梯度惩罚功能
- Intel nGraph图编译引擎支持加强,增加了Bert模型所需的op支持,可以通过Intel nGraph图编译引擎进行BERT模型训练,收敛效果对齐。
- OP完善
- 增强fused_elewise_activation op的功能,添加对x+sigmoid(y)、x+tanh(y)计算模式的支持
- 新增指数滑动平均(Exponential Moving Average), 是模型训练更加平滑稳定
- 新增sigmoid_focal_loss损失函数
- 新增deformable RoI pooling操作
- 新增deformable convolution v2操作
- 提供unfold操作(即im2col)操作
预测部署
- 服务端部署库
- 优化显存优化功能。DAM模型显存占用从4G下降至940M; MobileNet 模型显存占用从1G下降至500M。
- 将Paddle-TRT的优化过程迁移到模型初始化期间,解决Paddle-TRT初次预测时间过长的问题。例如使MobileNet初次预测时间从秒级别下降至毫秒级。
- 解决使用AnalysisPredictor从内存载入模型时,模型参数多次内存分配的问题。
- 增强Python预测API,并在官网文档预测部署下增加Python预测API的使用说明。
- Intel INT8 量化预测持续加强
- 持续优化INT8量化框架(训练后量化),新增五个模型( GoogleNet, MobileNetV2, VGG16, VGG19, ResNet101);与FP32模型相比,精度损失均在1%以内,性能提升2~3.7倍
- 支持QAT(训练中量化)训练出来的模型运行在INT8 kernel上,通过Pass对QAT模型进行修改,使其能运行在INT8 kernel上(目前支持 量化/去量化/卷积),在7个模型上(GoogleNet, MobileNetV1, MobileNetV2, VGG16, VGG19, ResNet50, ResNet101),和在FP32 kernel上模拟运行相比,精度变化在0.1%以内
- Paddle Serving
- 支持GPU设备;支持多卡并行预测
- 提供SE_ResNeXt50_32x4d模型作为标准示例,给出图像分类任务上单卡多并发、多卡多并发等场景benchmark
- 支持大规模稀疏参数任务:用于CTR预估等场景下超大规模embedding的存储和在线访问。一期发布单机版本,支持亿级别embedding访问
- 易于使用的API接口,API demo示例
- PaddleSlim
- 集成INT8量化框架
- 新增自动剪切策略,基于模拟退火算法搜索最优剪切率:对比MobileNet V1在ImageNet 1000类分类任务上FLOPS减少50%; Top1-Accuracy=69.7%
- 新增轻量级模型结构自动搜索功能(Light-NAS):对比MobileNet V1在ImageNet 1000类分类任务上精度无损情况下FLOPS 减少17%
分布式训练
- 分布式High-Level API Fleet
- 分布式训练统一API,支持参数服务器(Parameter Server)和Collective模式训练,大幅度降低用户从单机切换到多机训练的新增代码量
- 用户可以通过配置分布式策略调用不同的并行训练方法,对于不同的分布式环境支持多种内建RoleMaker,方便用户调用
- 参数服务器(Parameter Server)训练新增Communicator设计
- 独立通信逻辑到Communicator,简化异步训练逻辑
- 提供可控制通信开关,可针对不同模型针对性调优
- GPU多机多卡增加多个提升扩展性Feature,NLP/CV经典模型下多机多卡训练提速50%
- 新增Fused All Reduce:通过对gradient tensor进行自动合并,降低参数同步次数
- 新增Hierachical All Reduce:层次化all reduce操作
- 新增All Reduce通信并发能力:增加多机训练下,训练对网络波动的容忍能力
- 新增反向与优化算法之间的依赖分析:提升通信与计算overlap并发的能力
- 以上新增能力融合可实现在Bert Large(batch 16 x 128)和Resnet50(batch 32)上多机(v100 8*4 卡)训练速度比PaddlePaddle1.4.1提速50%+。
- GPU多机多卡Benchmark更新
- ResNet50、VGG16、Transformer和Bert上的速度对比,并提供可复现的benchmarks脚本。
- CPU-GPU异构设备流水线并行能力支持
- 新增流水线并行能力,可支持用户自定义在异构硬件分配计算OP,通过流水线交换数据,从而实现异构计算设备的搭配和计算资源的自由配比,提升训练速度。
- 在IO量大、计算量较小的场景例如CTR预估,Graph Neural Network下相比纯GPU训练有明显速度优势。
模型建设
- 图像分类
- 发布9个ImageNet预训练模型,包含ResNet50_vc, ResNet50_vd, ResNet101_vd, ResNet152_vd, ResNet 200_vd, ResNeXt101_64x4d, ResNeXt101_vd_64x4d, SENet154_vd, InceptionV4
- ResNet50_vd相比已发布的ResNet50效果提升2.62%,可以达到ResNet101精度。ResNet101_vd相比已发布ResNet101效果提升1.88%
- PaddleDetection
- 发布PaddleDetection物体检测统一框架,包含Faster-RCNN (支持FPN), Mask-RCNN (支持FPN), Cascade-RCNN, RetinaNet, Yolo v3, SSD算法,其中FPN, CascadeRCNN, RetinaNet是本次新增算法。
- 发布一系列预训练模型,其中RCNN系列模型支持ResNet, ResNet_vd, ResNeXt, ResNeXt_vd, SEResNeXt主干网络。Yolo v3持续增加更加轻量的ResNet34, MobileNet主干网络,并发布预训练模型
- PaddleGAN
- 发布PaddleGAN图像生成库,包含CGAN、DCGAN、CycleGAN、Pix2Pix、StarGAN、AttGAN、STGAN,支持多种数据集,支持经典的GAN网络结构。其中STGAN是百度视觉技术部自研的任意图像属性编辑模型。
- PaddleVideo
- 优化已经发布的分类模型,NeXtVLAD训练速度提升60%, TSM速度领先竟品39%
- 增加已发布的模型骨干网络,Nonlocal模型增加ResNet101和I3d网络结构
- 增加动作定位模型C-TCN,百度2018年ActivityNet比赛夺冠方案
- PaddleNLP
- ERNIE / BERT支持动态混合精度训练;支持以多进程的方式进行多卡任务的训练,提高了多卡加速比;优化多机多卡训练的加速比,在 V100 GPU集群上将 6 机相对于单机的 FP32 训练加速效率提高至76%
- 发布PaddleNLP-Research,开源MRQA2019阅读理解竞赛Paddle Fluid基线、 DuConv (ACL2019)、ARNOR(ACL2019)、MMPMS(IJCAI2019)、MPM(NAACL2019) 等近期百度在 NLP 学术领域的工作
工具组件
- PaddleHub
- 全新发布PaddleHub官网,易用性全面提升
- 新增网站http://www.paddlepaddle.org.cn/hub, 包含PaddlePaddle生态的预训练模型使用介绍
- 迁移学习Demo接入AI Studio与AI Book,无需安装即可快速体验
- 新增PaddleHub后端服务,支持模型检索、下载、私有化部署等功能
- 新增29个预训练模型,覆盖文本、图像、视频三大领域;目前官方提供40个预训练模型
- CV预训练模型
- 新增图像分类预训练模型11个:SE_ResNeXt, GoogleNet, ShuffleNet等
- 新增目标检测模型Faster-RCNN和YOLOv3
- 新增图像生成模型CycleGAN
- 新增人脸检测模型Pyramidbox
- 新增视频分类模型4个: TSN, TSM, StNet, Non-Local
- NLP预训练模型
- 新增语义模型ELMo
- 新增情感分析模型3个: Senta-BOW, Senta-CNN, Senta-GRNN
- 新增中文情绪识别模型EmoTect
- 新增中文语义相似度分析模型Simnet
- 升级LAC词法分析模型,新增词典干预功能,支持用户自定义分词
- CV预训练模型
- Fine-tune API升级,灵活性与性能全面提升
- 支持多卡并行、PyReader多线程IO,ERNIE文本分类Fine-tune速度提升60%
- 简化finetune、evaluate、predict等使用逻辑,提升易用性
- 增加事件回调功能,方便用户快速实现自定义迁移学习任务
- 新增多标签分类Fine-tune任务
- 全新发布PaddleHub官网,易用性全面提升
- 图学习框架PGL (Paddle Graph Learning)
- 发布基于PaddlePaddle的图学习框架PGL Preview版,提供基于游走 (Walk Based) 以及消息传递(Message Passing)两种计算范式去搭建最前沿的图学习算法,如图表征学习、图神经网络等。PGL充分利用Paddle LoD Tensor特性大幅提升Message-Passing范式中信息聚合效率,兼顾了灵活性和高效性
- 新增基于PGL实现的GCN、GAT,在多个数据集达到SOTA水平
- 新增基于大规模子图采样模型Graphsage模型,单机可支持5千万节点、20亿条边的巨图
- 新增node2vec,deepwalk等图表征学习方法,达到SOTA水平
- 新增PGL文档、API、Tutorial等材料
- 发布基于PaddlePaddle的图学习框架PGL Preview版,提供基于游走 (Walk Based) 以及消息传递(Message Passing)两种计算范式去搭建最前沿的图学习算法,如图表征学习、图神经网络等。PGL充分利用Paddle LoD Tensor特性大幅提升Message-Passing范式中信息聚合效率,兼顾了灵活性和高效性
BUG修复
- 修复softmax_with_cross_entropy操作CPU版本中ignore_label不支持在0到类别数之外label的问题
- 修复import paddle之后logging.basicConfig设置失效问题
- 修复python/paddle/fluid/layers/ops.py在python3下报错的问题
- 修复sequence unpad op在训练过程中不稳定的问题
- 修复Concat Op属性axis为负数时挂掉的问题
- 修复了enable_inplace和memory_optimize的潜在bug,保证某些op的输出变量不会被错误地复用
- 修复了Eager Deletion策略可能会提前误删变量存储空间的bug,提高Eager Deletion策略的稳定性
- 修复了模型图分析中拓扑排序存在bug导致的在相同模型的输入情况下有不同的模型图的生成情况
- 修复了预测结束后其他服务线程OMP线程冲突的问题。修复为在CPU模式下,预测引擎会在预测结束后将全局的OMP线程数设回为1
Release Notes
Table of Contents
- Highlights
- Fundamental framework updates
- Installation
- Dynamic Diagram Preview Version
- Performance Optimization
- Optimization of Memory
- Execution optimization
- Framework basic functions enhancements
- OP perfect
- Inference engine
- Server-side Deployment Library
- Paddle Serving
- PaddleSlim
- Distributed training
- Model construction
- Image classification
- PaddleDetection
- PaddleGAN
- PaddleVideo
- PaddleNLP
- Tools and Components
- Bug fixes notes
Highlights
- The training performance has been greatly optimized in data reading, execution scheduling optimization, Op computing logic and base cuDNN API call, CUDA kernel and MKLDNN. Further optimize the memory occupation, the whole has the leading advantage.
- Add LSTM and GRU based on Padding, which is more convenient for users to learn and use. And add the new language model and the example model of seq2seq translation model based on corresponding API ; Enhanced partial OP functionality to better support Tensor multiple dimension-variable tasks in NLP.
- Release the dynamic Preview version and provide the relevant API documents, and provide the official implementation of the seven model dynamic versions.
- The official model library publishes the uniform framework of PaddleDetection object detection, which covers the mainstream targe...