Skip to content

Releases: PaddlePaddle/Paddle

PaddlePaddle 2.0.1

15 Mar 02:29
ffa88c3
Compare
Choose a tag to compare

2.0.1 Release Note

重要更新

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

  • 提供了在框架外部自定义算子的新方案,简化了自定义算子写法与训练推理部署流程。
  • paddle.save/paddle.static.save 支持用户选择pickle版本,在Python 3下提升模型保存效率。
  • 推理阶段支持在开启TensorRT的基础上使用NVIDIA的深度学习加速器DLA
  • Paddle Inference的C++ 和 Python 推理接口提供对昆仑 XPU的原生支持,与飞桨对XPU的训练支持能力相统一。

训练框架

功能优化

API

  • 为提高性能,roi_align 新增 aligned 参数,generate_proposals、distribute_fpn_proposals 中新增 pixel_offset 参数。
  • paddle.nn.functional.cross_entropy 支持昆仑设备下的float类型label。
  • paddle.nn.functional.softmax_with_cross_entropy 新增label错误检查和报错信息优化。
  • paddle.nn.LayerList 支持 paddle.nn.LayerList([None])

动态图转静态图

  • 增加了对for循环中含tuple作为循环变量的支持。
  • 增加对Tensor索引变量诸如x[:],x[2:], 这种不定起始或终点的支持。
  • 补齐静态图下Tensor slice左值功能,动态图使用slice后可正确动静转换。支持通过索引或切片修改 Tensor数据:支持索引类型是 Python.intTensorPython.slice;支持步长是1、大于1或者是负数;支持赋值数据类型是 Numpy.arrayTensor

混合精度训练

  • 动态图混合精度训练支持 paddle.nn.LayerNorm,减少cast的次数,提升训练效率。

分布式训练优化

  • paddle.distributed.fleet.DistributedStrategy amp 添加pure fp16策略。
  • 新增 paddle.distributed.ProbabilityEntrypaddle.distributed.CountFilterEntry 用于稀疏参数训练。
  • 优化流水线并行通信次数。
  • 新增参数服务器模式下模型保存count/unseen_day等字段。
  • 新增参数服务器模式下稀疏参数的淘汰策略。

模型保存与载入

  • paddle.savepaddle.static.save 支持用户选择pickle版本,默认pickle 版本为2。Python 3下,选择Pickle 4+版本,可以提升保存速度,突破单文件4G大小限制,但注意此时保存的模型也需要在Python3加载使用。
  • 为满足部分用户直接获取经裁剪后的推理计算图需求,正式化接口 paddle.static.normalize_program

复数计算

  • paddle.abs 算子新增支持Complex64和 Complex128类型功能。

自定义算子

  • 实现在框架外部自定义算子的新方案,简化了自定义算子写法与使用流程,支持两种编译安装与调用方式,同时支持Linux和Window;使用新方案自定义的算子能够在动态图、静态图、动转静和推理场景中使用;具体说明请参考自定义外部算子(新)

问题修复

API

  • 修复paddle.optimizer.AdamW的multi_precision功能,确保正则处理作用对象为FP32类型的master weights,防止收敛异常。
  • 修复激活函数ELU在输入为nan时输出也为nan的问题。
  • 修复Tensor.backward()进行梯度累加时,动态图多卡启动时的梯度计算错误。
  • 修复 paddle.nn.functional.softmax_with_cross_entropy 在处理元素个数超过2^31的 Tensor时,存在的整数溢出问题。
  • 修复 paddle.nn.Sequential 进行for遍历会发生溢出崩溃的Bug。
  • 修复动态图slice的报错信息有误的bug。
  • 修复 paddle.nn.functional.local_response_norm 在静态图及动转静中,无法使用batch_size=-1的问题。
  • 修复 paddle.nn.LayerNorm 在float64时计算错误。

分布式

  • 修复参数服务器模式下准入配置不生效的问题。
  • 修复参数服务器模式下保存的模型参数无法加载的问题。
  • 修复参数服务器模式下profiler异常的问题。
  • 修复参数服务器模式在使用超过INT32类型数据时训练异常的问题。
  • 修复参数服务器模式下无法绑定长stringIP的问题。
  • 修复分布式训练过程中LOG级别配置较低导致日志输出多的问题。
  • 修复动态图分布式中对if else控制流导致各卡参数不一致的问题。
  • 修复分布式训练FLAGS设置和单机不统一的问题。

其他

  • 修复PaddlePaddle/models仓下,metric_learning finetune 报错的问题。
  • 修复昆仑静态图多卡调度op时缺失导致的权重不同步问题。

推理部署

模型量化

  • 增加了对采用per-layer方式量化的模型trt量化预测的支持。

Paddle Inference

API

  • 新增API paddle_infer::Config::EnableTensorRtDLA(),支持在开启TensorRT的基础上使用Nvidia的硬件加速器DLA
  • paddle-trt增加对模型输入的检查,如果输入是变长,优化相关报错信息,提示用户开启dynamic_shape。

功能升级

  • 支持运行带有用户自定义算子的预测部署模型,并提供了用户文档
  • C++ 和 Python 推理接口新增对昆仑 XPU 的原生支持,用户可因此获得更完备的算子种类支持。

性能优化

  • Paddle-TRT新增group_norm op支持,为solov2_r50_fpn_1x模型提供如下加速:在T4,cuda11, cudnn8.1,trt7.1.3上,相比2.0.0版本,TRT FP32推理性能由87.019ms -> 75.13ms,提升13%;TRT FP16推理性能由72.9253ms -> 44.149ms,提升65%。

问题修复

  • 修复某些OP在TensorRT 7.1+版本下运行失败的问题(例如ERNIE模型的TensorRT推理)。
  • 修复Python pass_builder API 使用过程可能出错的问题。
  • jetson下由于内存资源有限,将显/内存分配策略默认设为auto_growth,解决由于资源问题导致部分模型跑不通的问题。
  • 对cudnn8.0的内存泄露问题进行了规避,保证可用性,该改动不影响到其它cudnn版本。
  • 修复预测库动态库中MakeCipher符号缺失的问题。
  • 修复mask_rcnn_r50_1x_coco动转静模型mask预测结果错误的问题。
  • 修复adaptive pooling不被oneDNN 完全支持导致的segmentation模型预测失败的问题。
  • 修复当batch_size> 1时,oneDNN下OCR模型预测得到不正确的结果的问题。
  • 修复由于relu的CPU实现错误导致 freeze_model 预测失败的问题。
  • 修复BF16中图片转二进制脚本对python3不兼容问题。

环境适配

训练框架

  • 将cuda9.0与cuda10.0相关镜像中的gcc4.8.2升级成gcc5.4。
  • 支持Windows用户从官网安装最新的develop版本Paddle,每天实时发包。

推理库Paddle Inference

  • 修复cuda10.2开发镜像无法编译带TensorRT的Paddle的问题,将原来powerpc架构的TensorRT7替换成x86-64架构的TensorRT6。
  • 飞桨推理库名称升级:Paddle Inference动态链接库由 libpaddle_fluid.so 更名为libpaddle_inference.so。

2.0.1 Release Note

Important Updates

This version fixed some function and performance issues of PaddlePaddle 2.0.0, and optimized some function. The important updates are as following:

  • The new scheme that operators can be customized outside the framework. The process of customized operators’ writing and inference deployment, is simplified.
  • paddle.save/paddle.static.save supports users to choose the pickle version, which can improve the efficiency of saving models under Python 3.
  • At the stage of inference, users can apply DLA of NVIDIA while using TensorRT.
  • PaddlePaddle inference APIs of C++ and Python support XPU, which is aligned with training supported by PaddlePaddle to XPU.

Training Framework

Function Optimization

API

  • Add aligned in roi_align, and pixel_offset in generate_proposals、distribute_fpn_proposals to improve performance.
  • paddle.nn.functional.cross_entropy supports float type label in XPU accelerator.
  • Add label error checks and optimized error message of paddle.nn.functional.softmax_with_cross_entropy.
  • paddle.nn.LayerList supports paddle.nn.LayerList([None]) .

Dynamic Graph to Static Graph

  • Add the support of tuple as loop variable in for-loop.
  • Add Tensor support to be indexed by unspecific start and stop variables, such as x[:], x[2:].
  • Now Tensor supports slicing with lvalue in static graph. In dynamic graph, Tensor uses slicing can correctly turn into static graph. Tensor can be modified by indexing or slicing. Python.IntTensorPython.slice can be used for indexing. The stride could be 1, greater than 1 or negative. NumPy.array, Tensor types could be used as rvalue.

Mixed Precision Training

  • Mixed precision training of dynamic graph supports paddle.nn.LayerNorm , improving efficiency by reducing the number of cast.

Distributed Training Optimization

  • paddle.distributed.fleet.DistributedStrategy amp adds pure fp16 strategy.
  • paddle.distributed.ProbabilityEntry and paddle.distributed.CountFilterEntry are added for sparse parameters training.
  • Optimized the number of communications in parallel pipeline.
  • In parameter server mode, fields like count/unseen_day could be saved into model.
  • Add the elimination strategy of sparse parameters in parameter server mode.

Model Saving and Loading

  • paddle.save and paddle.static.save allow users to select the pickle version, and the default version is 2. For Python 3, users can choose Pickle version 4+. In this way, saving speed could be increased and single file could over 4G. But, please notice that models saved this way must be loaded and used under Python 3.
  • Add paddle.static.normalize_program to obtain the pruned computation graph.

Complex Number Operation

  • paddle.abs supports Complex64 and Complex128 types.

Customized Operator

  • Offered the new scheme of custom operators outside the framework, simplify the writing and using process of custom operators, support two installation and calling methods, and support Linux and Window at the same time; custom operators by using the new scheme can be used in dynamic graphs, static graphs, dynamic-to-static and inference scenarios; for specific instructions, please refer to the file: Customizing External Operators.

Distributed Training

  • Fixed Entry Config has no effect issue in parameter server mode.
  • Fixed the saved parameters could not be loaded issue in parameter server mode.
  • Fixed Profiler abnormal issue in parameter server mode.
  • Fixed training abnormal issue when data type category is higher than INT32 in parameter server mode.
  • Fixed long stringIP cannot be bounded issue in parameter server mode.
  • Fixed the issue of too much log outputs issue, in distributed training caused by lower level LOG config.
  • Fixed the issue of inconsistent parameters of each devices, when if else control flow is used in dynamic graph distributed training.
  • Fixed the issue that FLAGS setting of multi-host distributed training is not consistent with single host distributed training.

Bug Fixes

API

  • Fixed the muti_precision function of paddle.optimizer.AdamW to ensure the master weights in FP32 type, which are regularized, in order to prevent possible diverge.
  • Fixed the issue when the input of paddle.nn.ELU is nan, the output is nan.
  • Fixed gradient calculation error of using Tensor.backward() for gradient accumulation, in dynamic graph mulit-card training.
  • Fixed the integer overflow issue when paddle.nn.functional.softmax_with_cross_entropy processes a Tensor with over 2^31 elements.
  • Fixed crash bug during the for-loop traversal of paddle.nn.Sequential.
  • Fixed Wrong error message of dynamic graph slicing.
  • Fixed the issue that batch_size=-1 cannot be used, when paddle.nn.functional.local_response_norm is used in static graph or dynamic graph to static graph converting.
  • Fixed paddle.nn.LayerNorm computation error when data type is float64.

Others

  • Fixed the error message of metric_learning finetune under PaddlePaddle/models.
  • Fixed weight asynchrony issue caused by lack of operators, when XPU's static graph multi-card is used.

Inference Deployment

Model Quantification

  • Support the quantification inference of TRT, which uses per-layer to quantize.

Paddle Inference

API

  • Add API— paddle_infer::Config::EnableTensorRtDLA(). At the stage of inference, users can apply DLA of NVIDIA while using TensorRT.
  • Paddle-TRT will check inputs of model, If input shape is variant, the error messages are optimized and Paddle-TRT will hint users to use dynamic_shape.

Function Upgrades

  • S...
Read more

PaddlePaddle 2.0.0

01 Feb 02:31
fd9d6fd
Compare
Choose a tag to compare

Release Note

重要更新

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

  • 编程范式:默认开启动态图模式进行模型开发和训练,通过动转静的方式进行模型部署和训练加速。如果需要使用静态图编程范式,可以通过paddle.enable_static()来切换到静态图模式。
  • API体系:对API进行了补充,对目录结构进行了调整,使得更加易用,详情请见:API文档,同时,提供高层API简化使用流程;详情请见: 飞桨高层API使用指南
  • 框架功能:对数据加载、动态图执行,OP性能,混合精度训练,分布式训练,动静转换,等进行了功能增强和性能优化。
  • 环境适配: 提供了对ARM架构CPU的支持,增加了对Python 3.8、CUDA 10.1/10.2的支持,发布支持CUDA11的安装包(experimental),发布支持百度昆仑芯片的安装包(experimental),详情请见:开始使用
  • 模型库及开发套件:飞桨的官方模型库和套件已经完成绝大部分模型升级至飞桨框架2.0.0版本。
    • PaddleHub:支持2.0动态图,全面迁移动态图编程模式,模型开发调试更加方便,finetune接口更加灵活易用。
    • PaddleDetection: 支持2.0动态图,覆盖检测方向主流算法(PP-YOLO、Faster-RCNN、SOLOv2),支持动静转换,打通预测部署,提供了更加模块化的组网方式。
    • PaddleClas: 支持2.0动态图,提供了29个系列的分类算法和134个预训练模型,提供了基于SSLD知识蒸馏的优化方案,将分类模型的精度普遍提升3%以上。
    • PaddleSeg: 支持2.0动态图,提供了50+的高质量预训练模型,支持15+主流分割网络,提供了业界的SOTA模型OCRNet,很好的提升了产品易用性。
    • PaddleOCR: 支持2.0动态图,PPOCR系统、文字检测模型(DB,EAST,SAST)与文字识别模型(Rosetta,CRNN,StarNet)完成2.0动态图适配。
    • PaddleGAN:支持2.0动态图,所有模型,包括风格迁移、视频增强、唇形迁移、人脸动漫化等九种模型均基于动态图开发。
    • PaddleRec:支持2.0动态图,免安装,动静组网统一,方便用户的调研和上线,同时整理发布了推荐系统经典数据集。
    • PaddleNLP:支持2.0动态图,提供25+预训练模型和易用的API方式提升文本建模效率。
    • Parakeet:支持2.0动态图,已发布的声学模型及声码器均良好支持动态图版本。
    • PaddleVideo:支持2.0动态图,包含了视频分类和视频动作定位方向模型,包括: TSN、TSM、SlowFast、AttentionLSTM、BMN模型以及特色应用预训练模型VideoTag和FootballAction。
    • AmazonDJL:易用流畅的Java推理接口,支持各操作系统平台(Mac/Windows/Linux),支持Paddle预训练模型部署,更多的信息请参考DJL支持Paddle的官方文档

前瞻性预告

  • 飞桨框架计划在未来的某个版本起,放弃对python2和python3.5的支持,建议您升级python到3.8版本来使用飞桨。
  • 飞桨框架计划在未来的某个版本起,放弃对CUDA9的支持,建议您升级CUDA版本来使用飞桨。

训练框架

兼容性说明

  • 编程范式:飞桨2.0.0默认开启了命令式编程范式(动态图),但仍然保留对静态图的支持,静态图代码(包括1.8版本的静态图代码),可以通过添加paddle.enable_static()后来运行。
  • API:飞桨框架2.0.0版本推荐用户使用位于paddle根目录下的API,同时在paddle.fluid目录下保留了所有的1.x版本的API,保留对之前版本API体系的支持。因此,1.x版本的静态图训练代码,添加paddle.enable_static()即可在2.0.0版本上正常运行;1.x版本训练保存的模型,可以使用2.0.0版本进行推理。
  • 我们整理了1.8版本API到2.0版本API的对应关系表
  • 我们提供了迁移工具,来方便您将基于旧版本的代码迁移为2.0.0版本的代码,详情请见:版本迁移工具

动态图模式

默认开启动态图模式进行模型开发和训练,通过动转静的方式进行模型部署和训练加速。详情,请参看:动态图动态图转静态图

API体系

  • 基础API
    • API目录结构调整,1.x 版本的API主要位于paddle.fluid目录,本版本对API目录结构进行调整,使得分类更为合理,具体调整后的目录说明请参见API文档
    • 新增API共186个,修复和完善API共260个:详情请参考2.0.0 pre release版本的release notes,以及API文档
    • 新增分布式基础通信类API到paddle.distributed: broadcast, all_reduce, reduce, all_gather, scatter, barrier;动态图多卡训练启动API spawn, init_parallel_env,动静统一启动方式fleetrun
    • 组网类API实现动静统一,支持在动态图模式和静态图模式两种模式下运行。
  • 高层API
    • 新增飞桨高层API,对模型开发过程中常见的组网、训练、评估、预测、存取等操作进行封装,实现低代码开发,请参见飞桨高层API使用指南
    • 新增分布式高层API paddle.distributed.fleet,支持通过配置DistributedStrategy来支持多种优化策略组合和自动并行、分布式指标计算、InMemoryDataset

功能优化(含分布式)

动态图基础功能

  • 易用性优化:
    • Tensor功能增强:新增Tensor拷贝接口Tensor.clone(),及120余个Tensor计算操作接口(如Tensor.cos()等);新增使用索引或切片原地修改Tensor的功能;新增Tensor与Scalar运算时自动类型提升的功能;动态图Tensor打印信息优化,展示形式与Numpy保持相同。
    • Layer功能增强:新增Layer深拷贝接口Layer.deepcopy();新增Layer属性和函数查看接口Layer.dir();自本版本起,Layer.eval()调用后,Trace功能仍会自动记录反向操作,如不需要记录反向,需要显式调用paddle.no_grad()。
    • Optimizer新增set_lr()接口,可在动态图模式下灵活调整学习率。
    • 新增set_global_initializer()接口,可定义全局的参数初始化方法。
    • 多卡运行代码简化,不需要再显式调用scale_loss和apply_collective_grads。
  • 性能优化:
    • 多卡训练时Embedding等API支持使用稀疏参数梯度更新的功能。
    • 动态图训练和推理新增对Intel加速库oneDNN(原MKL-DNN)的支持,CPU训练场景Resnet50模型可提速6倍。
    • 新增动态图Inplace计算功能,可复用Tensor存储空间,减小显存占用,并新增View方法,可以在共享底层存储的情况下改变Tensor描述。
    • 【不兼容升级】新增动态图梯度累加功能,起到变相“扩大BatchSize”的作用,backward()接口默认不清空梯度,需要显式调用optimizer.clear_grad()来清空梯度
  • Bug修复:
    • 修复了多个模型在train/eval切换时会互相干扰的问题。

动态图转静态图

  • 动静转换新增语法支持
    • 新增return语法支持,可以在if-elif-else或者循环条件中提前return,并能够return不同类型的tensor或None。
    • 新增对函数signature中含有**kwargs参数的支持。
    • 新增for、for enumerate遍历Tensor和TensorList的语法支持,遍历Tensor的操作更加灵活。
    • 新增更多python语法支持,如print,assert,cast,isinstance,tuple,dict.pop()等。
  • 动静转换易用性优化
    • 动转静的返回类型从callable函数改为Class,可以调用Class的code,main_program等接口更轻松获取转化后的静态图信息。
    • 动转静装饰器to_static新增支持直接装饰model实例,如to_static(model, input_spec) 。
    • 新增jit.not_to_static装饰器,可以在动转静过程中,不转化该函数。
    • 增加set_verbosity()和set_code_level()接口,可以设置不同级别来查看动转静过程的log或者中间状态的代码。
    • 新增InputSpec,可以指定动转静时输入Tensor变量的形状和数据类型。
    • 报错信息优化,可以定位到原动态图错误的代码行,并隐藏与用户无关的报错信息。
    • 支持用 pdb.set_trace() 进行断点调试。
  • 优化部署模型存储载入接口
    • 新增paddle.jit.save接口用于动转静模型的保存,该接口同时兼容存储未经paddle.jit.to_static转写的Layer对象以及paddle.DataParallel模型,删除旧接口ProgramTranslator.save_inference_model。
    • 新增 paddle.jit.load 接口用于载入静态图格式存储的预测模型,包括paddle.jit.save和paddle.io.save_inference_model保存的模型,模型载入后可在动态图下用于模型推理或者模型训练调优。
    • paddle.jit.TransLatedLayer新增program方法,用于获取paddle.jit.load载入模型的program,便于了解模型结构。
    • 【不兼容升级】paddle.jit.save, paddle.jit.load接口参数model_path含义变更,改为存储文件前缀而非目录。

混合精度训练

  • 混合精度策略升级:黑白名单策略(下简称“O1策略”)之外,新增“Almost FP16(下简称O2策略)”支持,即尽可能多使用FP16进行计算。
    • 新增FP16 Guard功能(paddle.static.amp.fp16_guard),支持用户自由控制模型中单个Op是否选用FP16计算类型。
    • 用户可自定义custom_black_list,以控制某一类Op保持FP32计算。
    • 使用O2策略,Resnet50和Bert base在V100单卡训练速度分别可达1400images/s和590sequences/s。
  • 易用性优化:
    • 使用paddle.static.amp包统一管理与静态图混合精度训练相关的接口。
    • AutoMixedPrecisionLists提供简化名称CustomOpLists,即用户可使用CustomOpLists自定义AMP黑白名单Op列表。

分布式训练优化

  • 集合通信All Reduce
    • 支持千亿语言模型混合并行训练:支持基于executor接口的流水线并行训练,sharding-DP策略,GradientMerge+AMP策略,Recompute+Offload策略,megatron策略
    • 支持动态图:支持多流通信策略,自动rebuild group策略,高性能稀疏参数通信,多卡梯度顺序一致性策略
  • 参数服务器PS
    • 大规模稀疏功能升级:升级大规模稀疏PS-API,抽象通信组件/参数表/优化器基类,方便用户通过子类派生方式进行二次开发;同时还支持千亿特征流式训练,含特征准入,退场,增量训练,分布式指标预测等;通信方式从GRPC切换成了BRPC
    • 开源异构参数服务器,既支持传统的纯CPU机器PS,也支持基于三级存储(SSD/内存/显存)的纯GPU机器PS,还支持CPU机器+GPU机器/昆仑机器混布PS,可以完成万亿参数点击率预估模型的分钟级训练
  • 新训练机制支持:
    • 支持基于控制流的多任务分布式训练,性能较基于Intag的多任务提升50%以上
  • 分布式启动方式优化
    • 支持使用paddle.distibuted.spawn接口启动all_gather等分布式低阶API;
    • paddle.distributed.launch接口升级,支持指定单节点的进程数,并可简化为fleetrun
    • 优化gen_nccl_id,去除grpc依赖,添加一定的容错性,提升分布式任务启动的稳定性;
    • 支持Gloo方式启动集合通信多CPU

模型保存与载入

  • 规范Layer、Optimzier等API的set_dict方法名,统一改为set_state_dict。
  • paddle.load兼容性增强:支持从fluid.io.save_inference_model和fluid.io.save_params/persistables等接口的存储结果中载入Layer的state_dict。
  • 修改paddle.save/load接口行为,paddle.save不再为存储结果添加后缀,paddle.load每次载入仅返回一个结果,规范接口语义。
  • 移除paddle.SaveLoadConfig,对于paddle.jit.save, paddle.jit.load, paddle.load等接口兼容载入的场景,使用**kwargs传入额外的配置,简化接口的使用。
  • 原静态图API paddle.io.save, paddle.io.load, paddle.io.save_inference_model, paddle.io.load_inference_model移动到paddle.static模块下。
  • 优化paddle.static.load_program_state接口使用体验,在不指定载入var_list的使用场景中,载入目录存在干扰文件时仅警告而不报错。

复数计算

  • 扩展动静态图执行引擎,支持复数神经网络训练与复数梯度累加。
  • 新增mul, div, matmul, kron, abs等Op对复数计算支持。

ONNX功能升级

  • 新增API: paddle.onnx.export支持paddle2.0动态图转换到ONNX协议
  • 新增PPOCR,PPYOLO,FasterRCNN,ERNIE等模型转换
  • 更丰富的Paddle op覆盖,支持88个Paddle OP算子,同时支持导出为ONNX 1~12不同版本的算子集

性能优化(含分布式)

  • 动态图性能优化:

    • 数据读取性能优化:简化动态图模式下DataLoader底层实现逻辑,降低读取线程开销,进一步提升数据读取效率,提升模型整体训练速度。MobileNetV1在V100单卡、BatchSize=128的场景下整体训练速度提升34%。
    • 动态图组网API升级和性能优化,大量动态图API将直接调用自动生成的Pybind接口,性能显著提升。
    • 提高了Resnet50 oneDNN动态图训练的性能。目前CPU场景Resnet50 oneDNN 动态图训练速度提升6.4 倍。
  • OP性能优化:

    • argsort:优化输入Tensor的元素个数等于其axis维长度时的性能,前向速度提升34倍,反向速度提升10倍。
    • dropout:优化GPU性能,FP32性能提升约20%,FP16性能提升约50%。
    • cast:优化GPU性能,性能提升10%~20%。
    • softmax:优化axis=-1的情况下的GPU性能,针对不同shape有3倍~96倍的提升。
    • 其他OP性能优化:cumsum,reshape,Flatten,IndexSelect,Roll,elementwise_add,AdamW及RNN类(LSTM,GRU,SimpleRNN)等OP,均有明显性能提升。
  • 策略优化:

    • 新增fused_bn_add_act融合策略,可以自动对batch_norm+elementwise_add+activation的组合模式进行自动融合加速。
    • 新增梯度聚合的inplace addto策略,支持原位梯度累加,在ResNet-50混合精度训练中性能提升6.3%。
  • 优化FastThreadedSSAGraphExecutor调度,修复通信同步场景下,通信计算不重叠的情况,4机32卡resnet50提升约0.3%。

  • 分布式性能优化:

    • 优化lars策略, ResNet50 分布式多卡训练 16k batch size 的 time2train 指标小于 10 分钟。
    • 优化paddle.fleet amp分布式性能,修复最后一个通信和计算不重叠的情况,fp16 4机32卡性能提升约0.5%。
    • 优化paddle.fleet.gradient_merge分布式性能,先聚合梯度再通信,多机性能可提升20%-40%,达到线性加速比。
    • 优化参数服务器通信组件Communicator性能。GEO-400batch通信一次的情况下,W2V模型吞吐率、Simnet-Bow模型性能均有显著提升。Async模式下,相较于飞桨框架1.8按本,W2V模型吞吐率提升11%,CTR-DNN模型性能提升14% 。

调试分析

  • 将框架内仅100处使用LOG(FATAL)抛出异常的写法统一改为使用PADDLE_THROW,优化由于框架不支持某种行为而导致的报错格式与内容。
  • 完善框架内Signal Handler实现,优化执行遇到系统Signal错误时的报错格式与内容。
  • 优化框架报错栈格式,将编译时python报错栈移至原生报错栈下方,提升报错信息阅读体验。
  • 累计进一步完善约1500余条框架内检查报错的错误类型与提示文案,提升框架整体调试易用性。
  • 动态图报错信息增强,动态图下Pybind层的报错信息进行系统性增强,提升用户体验。
  • 优化Paddle Python端报错异常类型,与Python原生报错类型对齐。
  • 默认隐藏C++报错栈,优化隐藏C++栈之后的报错格式,去掉分界标志Error Message Summary,与Python原生报错格式对齐。
  • 优化部分static模块下API在非静态图模式下使用报错提示,包括static.append_backward, static.gradients, static.scope_guard, static.Print, static.nn.embedding, static.nn.data_norm, static.nn.multi_box_head, static.nn.nce, static.nn.py_func共9个API。
  • 优化了动态图模型下传入Tensor为None时的报错信息。
  • 优化了Layer的打印信息,支持打印Layer中的各个层次结构关系。

推理部署

模型量化

  • 动态图训练时量化功能增强,新增`ImperativeQu...
Read more

PaddlePaddle 2.0.0-rc1

18 Dec 09:06
d82d59e
Compare
Choose a tag to compare

Release Note

重要更新

飞桨框架2.0-RC1版本有如下重要更新:

  • 安装环境 官方发布支持CUDA11的安装包(experimental);官方发布支持百度昆仑芯片的安装包(experimental)
  • API功能 支持numpy兼容的paddle.Tensor 索引和切片操作(基本索引);去除部分API中的axis参数,支持numpy兼容的广播语义;新增了部分API,完善了部分API的功能,修复了部分API的bug
  • 动静转换 支持动态图转静态图的更多python语法,并支持通过 paddle.jit.not_to_static 标识不进行动转静的函数
  • 框架功能 支持多次调用paddle.Tensor.backward() 进行累计梯度,效果等同于增加batch size后计算的梯度;默认隐藏了C++报错栈,并优化了报错格式;分布式训练支持heterbox异构训练
  • 框架性能 混合精度训练支持纯FP16模式,ResNet50模型V100单卡训练性能达1400+ samples/sec;分布式训练做了性能优化

前瞻性预告

  • 飞桨框架计划在未来的某个版本起,放弃对python2和python3.5的支持,建议您升级python到3.8版本来使用飞桨
  • 飞桨框架计划在未来的某个版本起,放弃对CUDA9.0的支持,建议您升级CUDA版本来使用飞桨

训练框架

基础API(含分布式)

新增API

  • 新增paddle.log2
  • 新增paddle.log10
  • 新增paddle.nn.initializer.set_global_initializer
  • 新增paddle.median
  • 新增paddle.broadcast_shape,可以计算两个tensor shape经过broadcast计算后的shape
  • 新增paddle.vision.ops.deform_conv2d, paddle.vision.ops.DeformConv2d
  • 新增paddle.subtract
  • 新增paddle.optimizer.lamb
  • 新增Tensor相关API,Tensor.cpu、Tensor.cuda(idx)、Tensor.pin_memory、Tensor.is_leaf、Tensor.clone

修复和完善API

  • paddle.multiply 去掉axis
  • paddle.pow 去掉 type promotion
  • paddle.add, paddle.subtract, paddle.multiply, paddle.divide, paddle.matmul, paddle.reshape, paddle.transpose, paddle.kron, paddle.trace, paddle.sum 支持complex64 和complex128 数据类型
  • 移除paddle.maximum, paddle.minimum的axis参数
  • multiplex支持动态图
  • CrossEntropyLoss增加soft_label and axis,修改形状,并提升性能
  • paddle.nn.functional.interpolate size参数支持Tensor格式输入
  • paddle.nn.functional.pad添加在constant模式时,对N和C维度的padding
  • paddle.optimizer.momentum支持恢复训练
  • 修复转换前对BatchNorm指定weight_param名字,再使用paddle.nn.SyncBatchNorm.convert_sync_batchnorm 转换成SyncBatchNorm时报错
  • paddle.to_tensor选择设备时,支持直接输入其他Tensor的place
  • 优化Tensor.detach的性能,与原Tensor共享内存,减少1次内存拷贝,并且不保留在原计算图中
  • 静态图模式下,新增支持通过paddle.optimizer.get_lr()获取学习率
  • 修复paddle.Embedding在GPU下使用超范围ID报错异常

移除API(包括别名)

  • 移除complex module下的api: paddle.complex.matmul, paddle.complex.reshape, paddle.complex.transpose, paddle.complex.kron, paddle.complex.trace, paddle.complex.sum, paddle.complex.elementwise_add, paddle.complex.elementwise_sub, paddle.complex.elementwise_mul, paddle.complex.elementwise_div
  • 移除paddle.nn.functional下的sigmoid_cross_entropy_with_logits

高层API

  • 新增api paddle.callbacks.ReduceLROnPlateau
  • 新增api paddle.callbacks.LRScheduler
  • 新增api paddle.vision.datasets.FashionMnist
  • paddle.io.DataLoader中places参数变更为可选参数,当为默认值None时,自动选择paddle.CPUPlace()或paddle.CUDAPlace(0),places参数将在后续版本删除
  • paddle.io.DataLoader支持通过设置batch_size=None来禁用DataLoader自动组batch功能
  • 新增api paddle.io.ComposeDataset 用于将多个数据集按字段拼接为一个数据集
  • 新增api paddle.io.ChainDataset 用于将多个数据集按sample整合为一个数据集
  • 新增api paddle.io.WeightedRadnomSampler 用于通过指定权重进行随机采样
  • 新增api paddle.vison.ops.yolo_loss和paddle.vision.ops.yolo_box
  • 新增api paddle.flops
  • 新增api paddle.callbacks.EarlyStopping
  • 更新api model.save,保存文件格式与底层保持一致
  • 修复api 修复动态图input dtype为非float32且Model初始化不提供inputs时,保存预测模型报错的bug
  • paddle.metric.Accuracy支持输入多维Tensor,支持rank为1的label和one-hot表示的label

功能优化(含分布式)

动态图基础功能

  • 支持Tensor和Scalar在使用运算符运算时进行正确的类型提升
  • 修复了多个模型train/eval模型切换互相干扰的问题。动态图Layer.eval()与no_grad解耦,改动前调用Layer.eval()后Tracer不会自动记录反向,改动后调用Layer.eval()仍会自动记录反向,如果需要反向,可以使用paddle.no_grad
  • 支持通过索引或切片修改 Tensor数据
  • 增加 inplace 反向检测模块,检测是否前向inplace 操作会影响梯度计算的正确性
  • 新增Tensor.backward()自动求导时,梯度会累加在之前的梯度上,可以实现变相扩大“batch_size”
  • 支持了 SE-ResNext oneDNN 动态图训练

动态图转静态图

新增语法

  • 增加在动转静循环中使用isinstance语法的支持
  • 添加对赋值shape给tuple的动转静语法支持,如a, b, c, d = tensor.shape
  • python的 and/or 语句的左右操作数的执行是有先后顺序的,若左操作数的结果能够确定逻辑值,将不执行右操作数。过去动转静图中的logical_and/logical_or对这种情况处理有问题。增加了这种支持。
  • 增加支持了函数 signature中含有**kwargs的情况
  • 支持使用 jit.not_to_static 装饰函数,在动转静过程中,不转化该函数
  • 支持python字典语法 dict.pop()

bug修复

  • 修复动转静存储lstm接口时一个表示drop_state的变量没有初始化导致模型存储失败的问题
  • 修复嵌套循环在变量分析上的问题
  • 修复return在一些特殊情况的问题
  • 修复if-else中处理列表生成式及变量分析上的问题
  • 修复迭代变量在一些特殊情况的问题
  • 修复transpose API 在动态图和静态图行为不一致问题,使之支持动转静
  • 修复concat API 在动态图和静态图行为不一致问题,使之支持动转静
  • 优化部分动转静报错信息,使报错位置更准确
  • 修复convert_call在特殊情况下会重复递归调用问题
  • 修复由于2.0 API对out.dtype判断不同导致的动转静问题
  • 修复了x.shape == y.shape在动态图是判断list相等,返回True/False,但静态图下会被重载成elementwise的问题,这种转为静态图后对elementwise结果进行reduce。
  • 修复了param_guard覆盖不到hook的问题。
  • 修复了init运行动态图一些参数变量在静态图因为类型不是静态图变量不能赋值的问题
  • 修复了用户在__init__函数中定义的非参数类型变量值无法正确修改和更新的问题
  • 修复了动转静过程中错误转化第三方库logging的问题
  • 修复了for-enumerate语法AST转写有误的问题
  • 修复了部分warning信息循环显示多次的问题

混合精度训练

  • 支持更为激进的FP16训练模式(即纯FP16训练)。为保证模型的收敛性在Momentum优化器中新增multi_precisionrescale_grad属性,multi_precision主要指示优化器需要维护一份master weights
  • 使用纯FP16训练,ResNet50模型在配有16GB显存的V100上单卡训练性能可达1400+ samples / sec

模型量化

  • 动态图量化支持skip指定Layer
  • 动态图量化支持2.0 API Conv 以及Linear

分布式训练优化

  • 支持使用paddle.distibuted.spawn接口启动all_gather等分布式低阶API
  • 支持heterbox异构训练
  • 流水线并行支持Executor.run接口,提升易用性
  • Launch接口升级,支持指定单节点的进程数
  • Sharding支持百亿参数模型多卡训练

模型保存与载入

  • 支持有多个方法声明由paddle.jit.to_static转写的Layer在使用paddle.jit.save存储后,仍然能够通过paddle.jit.load载入,并且由paddle.jit.to_static转写的多个方法仍然能够使用
  • 支持由paddle.jit.load载入的Layer在fine-tune或者作为其他Layer的子Layer使用之后,仍然能够通过paddle.jit.save正确存储
  • 拓展paddle.jit.save支持存储paddle.DataParallel模型
  • 优化paddle.static.load_program_state接口使用体验,在不指定载入var_list的使用场景中,载入目录存在干扰文件时仅警告而不报错
  • 支持paddle.jit.save处理dict类型的InputSpec
  • 支持paddle.onnx.export将动态图模型导出为ONNX文件格式

性能优化(含分布式)

  • 提升RNN类OP在CPU上的性能(LSTM,GRU,SimpleRNN),对比2.0-rc版本,LSTM、GRU、SimpleRNN前向性能与后向性能均有显著提升
  • 优化FastThreadedSSAGraphExecutor调度,修复通信同步场景下,通信计算不重叠的情况,4机32卡resnet50提升约0.3%
  • 优化paddle.fleet amp分布式性能,修复最后一个通信和计算不重叠的情况,fp16 4机32卡性能提升约0.5%
  • 优化分布式通信组件Communicator性能。GEO-400模式下,W2V模型吞吐率、Simnet-Bow模型性能均有显著提升。Async模式下,相较于飞桨框架1.8按本,W2V模型吞吐率提升11%,CTR-DNN模型性能提升14%
  • 优化参数服务器模式下Worker为GPU设备时的性能,降低Embedding查表的拷贝耗时,在CTR-DNN模型中,训练吞吐率有显著提升
  • 分布式GPU动态图实现计算和通信overlap,并支持用户细粒度配置梯度fuse的group大小等选项。在ResNet152、Bert两个模型上,多节点性能提升在5%以上。在ResNet50也有3%以上的提升
  • 提升cumsum在GPU上的性能。
  • 提高了Resnet50 oneDNN 动态图训练的性能。目前Resnet50 oneDNN drgraph训练比CPU训练快 6.4 倍
  • 新增GRU和SimpleRNN的cudnn支持

调试分析

  • 优化Paddle Python端报错异常类型与Python原生报错类型对齐
  • 默认隐藏C++报错栈,优化隐藏C++栈之后的报错格式,去掉分界标志Error Message Summary,与Python原生报错格式对齐
  • 优化部分static模块下API在非静态图模式下使用报错提示,包括static.append_backward, static.gradients, static.scope_guard, static.Print, static.nn.embedding, static.nn.data_norm, static.nn.multi_box_head, static.nn.nce, static.nn.py_func共9个API
  • 优化了动态图模型下传入Tensor为None时的报错信息
  • 动态图print tensor的格式进一步优化

编译安装

新增支持

  • (experimental)发布支持cuda11的安装包
  • 将cuda10.1及以上的Paddle镜像以及CI系统镜像中的NCCL版本到2.7.8
  • 发布支持xpu的安装包
  • 发布支持jetpack的安装包,以及支持nv_jetson的C++预测库。

体验优化

  • 修复联编策略,单独发布包含tensorrt的gpu包,避免用户在安装其他GPU版本的包出现没有tensorrt的报错
  • 删除安装依赖包:scipy、rarfile、prettytable、pathlib
  • 安装文档优化

Bug修复

  • 修复多卡训练时0号GPU卡显存占用多于其他卡的Bug
  • 修复了tile op计算时shape推导错误的问题
  • 修复了使用paddle时出现的大量invalid escape sequence的warning信息
  • 修复了paddle.full设置INF、NAN、NINF等时的bug
  • 修复paddle.fleet多nccl comm设置不生效的问题,添加同步模式下多nccl comm通信不重叠的警告
  • 修复paddle.framework.seed在TruncatedNormal初始化不符合预期的问题
  • 修复AvgPool 相关 API动转静exclusive参数行为不一致问题;修复MaxPool 相关 API ceil_mode传参问题
  • 修复paddle.topk在GPU下结果不正确的bug
  • 修复 fluid.layers.nn.gather 动态图API,缺少了 overwrite 选项 bug
  • 修复Windows下终端不识别CUDA_VISIBLE_DEVICES为空字符的bug,通过设置空字符串可以使框架以CPU模式执行
  • 修复当LinearLrWarmup中递归包含Learning Rate Scheduler时,optimizer.state_dict/set_dict时的无法递归保存加载的Bug
  • 修复了ptb lm模型单机训练性能下降的问题
  • 修复了softmax_with_cross_entropy使用ignore_index时梯度计算的bug
  • 修复了AdamW第一次执行后再次获取要进行decay的参数为空的bug

推理

Paddle Inference

功能升级

  • Paddle 在 2.0 中新增或升级了部分算子。从本版本起,对前向算子版本规则进行定义与兼容约束。通过框架间算子版本的对齐,确保不同框架中同一算子版本的定义和行为一致,从而增强框架整体的健壮性
  • 新增TryShrinkMemory接口,通过释放临时tensor的方式减少应用显/内存占用,demo示例可参考Paddle-Inference-Demo
  • Paddle-TRT支持clip op,支持分类模型GhostNet在Paddle-TRT下运行
  • Paddle-TRT int8预测支持含有channelwise量化的mul op的模型,支持PaddleOCR检测和识别的PaddleSlim量化模型在Paddle-TRT int8下运行
  • load_inference_modelsave_inference_model 两个API迁移到 paddle.static 下,提升了易用性,兼容旧接口。
  • 新增 serialize_program, deserialize_program, serialize_persistables, deserialize_persistables, save_to_file, load_from_file 六个API,用来满足用户执行序列化/反序列化 program,序列化/反序列化 params,以及将模型/参数保存到文件,或从文件中加载模型/参数的需求。
  • 支持部分模型的BF16预测。目前支持resnet50,googlenet,mobilenetv1和mobilenetv2模型的BF16预测
  • 添加了一些oneDNN 算子的版本兼容性支持

性能优化

  • ERNIE模型在开启TenorRT时增加变长输入的支持,带来性能提升147%。在软件版本cuda10.1、cudnn 7.6、tensorrt 6.0、OSS 7.2.1,模型ernie-base-2.0,数据集QNLI,输入BatchSize = 32时,Nvidia Telsa T4上的性能从905 sentences/s提升到2237 sentences/s。示例代码:Paddle-Inference-Demo/c++
  • 提高了oneDNN INT8 GRU性能。GRU INT8 模型的预测速度是原Paddle NativeConfig float32 模型的 1.65倍(线程= 1,batch_size = 50)
  • 添加了oneDNN batchnorem + activation的fuse支持,pvanet_ocr模型性能因此提高了2.8%

Bug修复

  • 修复含有avg pooling或global pooling的模型在jetson设备上出现计算结果错误、报错跳出或hang住的问题
  • 修复使用TensorRT动态shape推理时,TensorRT子图输出Tensor的shape结尾是x1时会被错误的删除的问题
  • 修复当使用TensorRT推理时,config.pass_builder()->DeletePass()不生效的问题
  • 解决了某些模型的性能取决于 matmul 算子的 weights 数值的问题
  • 修复了当CPU oneDNN加载多个模型预测时性能变慢的问题

模型升级

PaddleDetection

  • 升级动态图模型:
    • Faster RCNN, Faster FPN, Mask RCNN, Mask FPN, Cascade RCNN, Cascade Mask, YOLOv3模型精度打平静态图
      • 支持动转静功能,并打通Paddle Inference,精度速度打平静态图
  • 发布实时实例分割模型SOLOv2,相较竞品精度提升2.4个点,预测速度提升31.2%, 训练速度为竞品2.4倍
  • 新增Android移动端检测demo,包括SSD、YOLO系列模型
  • 新增PACT新量化策略,YOLOv3-Mobilenetv3在COCO数据集上比普通量化相比提升0.7%。

PaddleSlim

  • 动态图压缩功能支持
    • 新增动态图剪裁、量化训练功能
    • 剪裁新增通道数对齐功能,使产出模型更容易被预测库加速
    • PACT量化训练方法改为内置方法,方便用户直接调用
  • 新增OFA模型压缩技术,TinyERNIE经压缩后加速40%,精度无损

PaddleSeg

  • 全新发布2.0-rc版本,全面升级至动态图,支持15+分割模型,4个骨干网络,3个数据集,4种Loss:
    • 分割模型:ANN, BiSeNetV2, DANet, DeeplabV3, DeeplabV3+, FCN, FastSCNN, Gated-scnn, GCNet, HarDNet, OCRNet, PSPNet, UNet, UNet++, U^2Net, Attention UNet
    • 骨干网络:ResNet, HRNet, MobileNetV3, Xception
    • 数据集:Cityscapes, ADE20K, Pascal VOC
    • Loss:CrossEntropy Loss、BootstrappedCrossEntropy...
Read more

PaddlePaddle 2.0.0-rc0

30 Oct 03:37
97227e6
Compare
Choose a tag to compare

2.0-rc0 Release Note

重要更新

相对2.0-beta版,本版本在如下方面进一步完善:

  • 默认模式:paddle2.0-rc后将默认开启动态图模式;如果需要使用静态图编程模式,可以通过paddle.enable_static()来切换到静态图模式。
  • 框架API:修改50个常用API名称,新增8个基础API实现,移除220个API(包含别名移除),8个API增加二阶导数计算,更多API增加了对昆仑芯片的支持,分布式FleetAPI正式化,高层API进行了功能增强。
  • 框架功能:优化动静转换用法,优化模型读取和载入,优化混合精度训练和量化策略,优化分布式训练策略。删除了nltk等6项编译依赖;安装包增加对Python 3.8、CUDA 10.1/10.2的支持。
  • 推理引擎:增强int8量化能力,增加算子版本信息,oneDNN相关的功能强化和性能优化。

训练框架

基础API(含分布式)

新增API

  • 新增 paddle.emtpy API,返回未初始化的内存
  • 新增 paddle.emtpy_like API,返回未初始化的内存
  • 新增 paddle.mv API,返回矩阵-向量乘的结果
  • 新增paddle.multinomial多项分布API
  • 新增paddle.nn.LocalResponseNorm和paddle.nn.functional.local_response_norm
  • 新增paddle.nn.Pad1D/Pad2D/Pad3D api,支持constant,reflect,replicate和circular模式
  • 新增paddle.add_n
  • 新增动态图混合精度训练API,paddle.amp.auto_cast和paddle.amp.GradScaler

修复和完善API

  • paddle.reshape API支持bool类型输入
  • paddle.distribution.Categorical API添加sample和log_prob方法
  • BatchNorm1D, BatchNorm2D, BatchNorm3D 添加了 channel last 数据布局支持
  • paddle.optimzier.Adam和paddle.optimizer.AdamaW参数顺序修改
  • yolo_box支持输入特征图H,W不相等,用于完成长宽不相等的图像预测
  • paddle.nn.function.interpolate 支持 scale_factor 输入类型为 list
  • 添加了adaptive pool2d运算符的oneDNN支持 @intel
  • 添加了dilated conv和dilated conv_transpose的oneDNN支持 @intel
  • unique支持GPU设备计算
  • paddle.multiply 支持非variable 和 tensor 数据类型 输入
  • paddle.nn.AdaptiveMaxPool1D/2D/3D 和paddle.nn.functional.adaptivemaxpool1d/2d/3d,重构python端PoolAPI的实现
  • paddle.set_printoptions支持设置动态图Tensor的显示选项
  • paddle.assign API,支持数组/张量到张量的赋值
  • paddle.nn.functional.swish/paddle.nn.Swish,删除beta参数
  • paddle.nn.functional.thresholded_relu/paddle.nn.ThresholdedReLU,threshold参数默认值为1.0
  • paddle.norm,升级后支持fro、inf、-inf、0、1、2,和任何正实数p对应的p范数
  • paddle.nn.AdaptiveMaxPool1D/2D/3D 和paddle.nn.functional.adaptivemaxpool1d/2d/3d,重构python端PoolAPI的实现
  • RNN类(SimpleRNN、LSTM、GRU)优化参数顺序和基类RNNBase实现,集成cudnn lstm
  • 修复adaptive_pool op在特殊输出情况下GPU梯度异常的问题
  • 新增支持二阶求导功能:batch_norm、abs、log、expand、tile、squeeze、unsqueeze、matmul
  • 新增50余个算子对昆仑(XPU)训练的支持

API名称变化

  • 对2.0-beta的50个API名称进行了修改,详见 链接

移除API(包括别名)

  • 移除220个API(包括别名),详见 链接

多设备/分布式训练API

  • Fleet API正式化,统一到paddle.distributed.fleet作为Paddle通用分布式训练统一入口
  • paddle.distributed.fleet.DistributedStrategy作为Paddle统一并行策略定义入口暴露
  • 增加paddle.distributed.fleet.meta_optimizer.RecomputeOptimizer API,支持分布式下的重计算机制
  • 增加paddle.distributed.fleet.meta_optimizer.GradientMergeOptimizer API,支持分布式下的梯度累加机制
  • 增加paddle.distributed.fleet.meta_optimizer.PipelineOptimizer API,支持分布式下的流水线并行机制
  • paddle.distributed.fleet.DistributedStrategy新增amp优化策略,支持分布式下自动混合精度机制的开启
  • paddle.distributed.fleet.DistributedStrategy新增dgc优化策略,支持分布式下深度梯度压缩机制的开启
  • paddle.distributed.fleet.DistributedStrategy新增fp16_allreduce优化策略,支持分布式下fp16 allreduce通信机制的开启
  • paddle.distributed.fleet.DistributedStrategy新增lars优化策略,支持分布式下大batch size 训练使用 lars 优化器
  • paddle.distributed.fleet.DistributedStrategy新增lamb优化策略,支持分布式下大batch size 训练使用 lamb 优化器
  • paddle.distributed.fleet支持多优化策略组合,支持包括amp+recompute, dgc+recompute, amp+recompute+lars等十余种策略的组合
  • paddle.distributed.fleet.DistributedStrategy新增a_sync优化策略,支持分布式下使用参数服务器进行同步、异步、GeoSGD以及异构参数服务器优化训练
  • paddle.distributed.fleet.DistributedStrategy新增auto实验性优化策略,支持分布式下多策略最优化自动并行
  • 增加fleetrun启动分布式训练任务,支持Collective模式在单机单卡,单机多卡和多机多卡下启动,支持参数服务器模式在CPU集群、GPU集群、异构集群下启动,支持直接提交PaddleCloud集群
  • paddle.distributed.fleet支持动态图执行,支持GPU模式下动态图单机单机、单机多卡和多机多卡训练
  • paddle.distributed.fleet 新增通信集合功能,支持all_reduce,all_gather及 barrier功能
  • paddle.distributed.fleet 新增分布式指标计算功能,包括auc,rmse, mae,acc 等
  • paddle.distributed.fleet下废弃原fleet.main_program和fleet.startup_program,替换为paddle.static.default_main_program() 和 paddle.static.default_startup_program()
  • paddle.distributed.fleet支持异构参数服务器模式,可通过fleetAPI配合用户组网实现异构计算设备训练,跨设备协作进行分布式训练
  • 分布式集合通信API支持CPU设备
  • paddle.distributed.fleet.DistributedStrategy新增localsgd优化策略
  • paddle.distributed.fleet.DistributedStrategy新增adaptivelocalsgd优化策略,支持分布式下自动计算step步长的localsgd策略
  • 新增paddle.distributed添加InMemoryDataset和QueueDataset支持使用Dataset进行分布式训练

高层API

  • 新增IterableDataset基类支持流式数据集,DataLoader支持对IterableDataset进行多进程加速,并支持通过paddle.io.get_worker_info()获取子进程状态并进行进程间数据划分
  • paddle.io.DataLoader的places参数更新为可选,不指定places使用默认的places
  • 新增CIFAR10, CIFAR100, Conll05st等10个map-style数据集,支持数据集自动下载并以map-style方式获取数据
  • DIstributedBatchSampler接口新增num_replicas和rank参数用于指定卡数和当前卡逻辑序号
  • 新增paddle.io.TensorDataset支持tensor数据集读取
  • 新增paddle.io.Sampler基类,并新增SequenceSampler,RandomSampler用于在BatchSampler中顺序或乱序获取数据
  • paddle.io.BatchSampler支持Sampler作为输入,删除原输入参数indices
  • 下线paddle.reader下原有API
  • paddle.vision.transforms中的图像变换算子添加处理PIL的后端
  • paddle.summary支持多个输入与多个输出的Layer
  • model.save升级,在动态图保存预测模型时,用户不需要调用paddle.jit_to_static或者为layer函数增加装饰器(动转静的功能)。并且如果用户在Model初始化时如果传入了inputs,则可以保存正确的输入shape,否则模型的输入shape会按照运行模型时传入的输入shape保存

功能优化(含分布式)

动态图基础功能

  • 新增Tensor的clone接口,会拷贝一个完全相同的Tensor,同时clone后的Tensor继续保留在计算图中,并支持梯度回传
  • 支持通过索引或切片原地(inplace) 修改 Tensor
  • 动态图Tensor打印和显示优化,高维tensor数据显示方式对齐numpy,支持缩略形式
  • 优化了initializer类的__call__方法,不再需要传入block,避免用户在动态图中感知到静态图block概念
  • 隐藏动态图多卡API DataParallel的scale_loss和apply_collective_grads方法,编写多卡模型代码时不再需要调用这两个方法,简化写法,提升易用性
  • 添加oneDNN 动态图支持,支持了 Resnet50模型训练和推理。@intel

动态图转静态图

  • 动态图转静态图相关API接口迁移2.0,简化了import 路经
  • 动转静装饰器 to_static 新增支持直接装饰 model 实例,如 to_static(model, input_spec)
  • 新增InputSpec中name参数的默认值解析机制,若未指定name,则使用被装饰函数参数名作为name
  • StaticLayer重命名为StaticFunction
  • 优化了动转静Debug log
  • 修复了一些场景下动转静的bug

混合精度训练

  • 重构静态图混合精度训练中的梯度有效性检查和动态loss scaling逻辑,去除一些condition block逻辑

模型量化

  • 新增动态图分channel量化功能,支持对Conv2D和Linear等layer的权重进行分channel求取量化参数
  • 新增动态图量化训练过程中对模型layer求取output scale参数功能,供Server端量化推理部署使用

分布式训练优化

  • 支持流水线并行训练
  • 支持参数服务器模式下异构分布式训练,支持PS+GPU,PS+昆仑, PS+CPU,PS+CPU+GPU(昆仑)等多种设备进行训练,单台GPU/昆仑机器+10台cpu机器上,完成千万数据千亿参数点击率模型分钟级训练
  • 大规模稀疏功能进行了升级,支持int64范围内的稀疏ID,支持稀疏表自增长、配置准入条件及增量模型保存功能
  • 分布式支持控制流多任务,性能较instag多任务提升50%以上

模型保存与载入

  • 支持paddle.jit.save接口存储未经paddle.jit.to_static转写的Layer对象,扩大接口使用场景
  • 规范Layer、Optimzier等API的set_dict方法名,统一改为set_state_dict,规范接口名
  • 支持paddle.load从fluid.io.save_inference_model接口存储的结果中载入Layer的state_dict,打通接口体系,提升易用性
  • 支持paddle.load从fluid.io.save_params/persistables接口默认存储结果中载入Layer的state_dict,打通接口体系,提升易用性
  • 修改paddle.save/load接口行为,paddle.save不再为存储结果添加后缀,paddle.load每次载入仅返回一个结果,规范接口语义
  • 为paddle.jit.TransLatedLayer新增program方法,用于获取paddle.jit.load载入模型的program,便于了解模型结构
  • 移除paddle.SaveLoadConfig,对于paddle.jit.save, paddle.jit.load, paddle.load等接口兼容载入的场景,使用**kwargs传入额外的配置,简化接口的使用
  • 更新paddle.jit.save, paddle.jit.load接口参数model_path的含义,用户输入的字符串作为存储文件前缀而非目录
  • 原静态图API paddle.io.save, paddle.io.load, paddle.io.save_inference_model, paddle.io.load_inference_model移动到paddle.static模块下

性能优化(含分布式)

  • 提升Argsort OP当输入Tensor的元素个数等于其axis维长度时的性能,前向速度提升34倍,反向速度提升10倍
  • 优化lars策略, ResNet50 分布式多卡训练 16k batch size 的 time2train 指标小于 10 分钟
  • 新增fused_bn_add_act OP,融合batch_norm、elementwise_add和activation OP
  • 新增梯度聚合的inplace addto策略,支持原位梯度累加,在ResNet-50混合精度训练中性能提升6.3%

调试分析

  • 继续完善paddle中约1500条报错检查的提示文案,提升框架调试易用性

编译安装

  • 新增安装包对python3.8的支持
  • 删除对matplotlib的安装依赖
  • 删除对graphviz安装依赖
  • 删除对objgraph安装依赖
  • 删除对netifaces的安装依赖
  • 删除对nltk的安装依赖
  • 删除对opencv的安装依赖
  • 新增安装包对cuda10.1、cuda10.2的支持
  • 预测库支持cuda10.2-cudnn8-trt7.1的版本

Bug修复

  • 修复梯度裁剪GradientClipByGlobalNorm在Paddle默认dtype是float64的网络下使用报错的bug
  • 修复Windows的CUDA10.1/10.2版本的无法加载CUDA相关dll的bug
  • 修复Tensor在CUDAPinnedPlace与其他Place之间相互拷贝的bug
  • 修复paddle.jit.load载入无参数Layer出错的bug
  • 修复paddle.diag对于大尺寸输入计算错误的bug,修复paddle.diag在Windows Python3.8环境下内存占用异常的bug
  • 修复paddle.topk在静态图组网时输出的shape不合理的问题
  • 修复paddle.io.DataLoader多进程模式经paddle.distributed.spawn启动时直接报错退出的bug
  • 修复paddle.set_device接口设置运行时设备在部分场景中失效的问题
  • 修复paddle.static.nn.while_loop反向计算中使用前向计算的变量而导致的梯度计算错误的bug
  • 修复fleet不支持paddle.optimizer的bug
  • 修复Adam优化器计算公式与论文有diff的bug
  • 修复logsumexp导致部分机器上编译太慢的问题
  • 修复ParamAttr缺失类型检查的问题
  • 修复AvgPool API ceil_mode=true情况下在CPU上平均池化核计算问题
  • 修复paddle.distributed.fleet.init_server()加载模型时维度不匹配的问题
  • 修复paddle.distributed.fleet参数服务器模式下训练节点不支持GPU的问题
  • 修paddle.allclose在float64数据类型下精度diff问题
  • 修复了反向传播支持分组的conv算子(conv2d grad op with groups)的错误 @intel
  • 修复了动转静to_static装饰模型,直接切换eval模式无法保存模型的bug
  • 修复matmul不支持fp16bug
  • 修复matmul反向计算性能差以及显存占比高的问题
  • 修复paddle.nn.Transformer参数bias_attr和weight_attr指定为bool,list/tuple出错问题
  • 修复dynamic_decode预测解码不能正确提前结束的问题
  • 修复paddle.unsqueeze在axis为Tensor的情况下结果错误的问题
  • 修复了paddle.to_tensor在某些场景下zero_copy带来的问题,暂时禁止了zero_copy行为

推理

Paddle Inference

  • 预测库默认命名从fluid_inference改为paddle_inference

功能升级

  • Paddle-TRT 动态shape功能支持PaddleSlim量化Int8模型
  • Paddle Inference GPU Int8支持conv2d_transpose量化
  • 增加预测模型的算子版本信息
  • 在oneDNN INT8量化策略中增加了对有偏移的scales的量化和反量化的支持 @intel
    • Add support for (de/re) quantization with shiftted scales in INT8 quantization strategy
  • 添加了对oneDNN BF16的支持:支持conv2d bf16运算符和gru bf16 op,启用了resnet50 bf16模型推断 @intel
    • Added CPU BF16 support: support conv2d bf16 operator and gru bf16 op, enabled resnet50 bf16 model inference.

性能优化

  • ERNIE模型在T4上使用Paddle-TRT FP16推理性能提升15%。@NVIDIA
  • 通过支持oneDNN FP32 GRU和oneDNN INT8 GRU,GRU INT8模型的速度与NativeConfig推理相比,提高了约1.49倍(线程= 1,batch_size = 50)@intel
    • Added support for oneDNN FP32 GRU and oneDNN INT8 GRU. The GRU INT8 model has 1.49X speed-up compared with NativeConfig inference (with thread=1, batch_size=50)
  • 通过oneDNN升级到1.6,Ernie Large oneDNN在Skylake上(Intel Core 6148)推理的速度提高了约2.7倍(即单元测试 test_analyzer_ernie_large)@intel
    • Since oneDNN is upgraded to 1.6, Ernie Large (test_analyzer_ernie_large) oneDNN inference has speed up ~2.7x.

Bug修复

  • 修复用户使用Paddle Inference ZeroCopyRun接口,开启MKLDNN时,在变长输入下内存泄露的bug
  • 修复ERNIE模型含有共享参数时预测出错的bug
  • 修复带Paddle-TensorRT功能的预测库在未安装TensorRT的环境下初始化报错的bug
  • 修复softmax op、layer_norm op使用Paddle-TRT预测时维度计算错误的bug
  • 解决了增加cpu_math_library_num_threads_数目,预测性能却无法提高的问题(PaddleOCR repository)@intel
    • Fix the issue that increasing cpu_math_library_num_thr...
Read more

PaddlePaddle 2.0.0-beta0

15 Sep 01:25
264e76c
Compare
Choose a tag to compare

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目录
  • 模型执行
    • 新增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进行自定义。
  • 领域API
    • 新增视觉(CV)领域接口paddle.vision
      • 新增Dataset接口paddle.vision.datasets.*,对常用数据集进行封装,支持数据的随机访问
      • 新增Resize, Normalize等24种常见的数据预处理接口paddle.vision.transforms.*
      • 新增图像分类骨干网络和预训练参数
        • paddle.vision.models.lenetpaddle.vision.lenet
        • paddle.vision.models.vggpaddle.vision.vgg
        • paddle.vision.models.resnetpaddle.vision.vgg
        • paddle.vision.models.mobilenetv1paddle.vision.mobilenetv1
        • paddle.vision.models.mobilenetv2paddle.vision.mobilenetv2
    • 新增自然语言处理(NLP)领域接口paddle.text
      • 新增Dataset接口paddle.text.datasets.*,对常用数据集进行封装,支持数据的随机访问
      • 新增领域组网接口paddle.text.*
  • 自动断点重启
    • 新增接口 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...
Read more

PaddlePaddle 1.8.4

04 Sep 09:23
1e01335
Compare
Choose a tag to compare

新增功能

  • 简化动态图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

06 Aug 02:51
a44085b
Compare
Choose a tag to compare

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

15 Jun 06:39
0b3f626
Compare
Choose a tag to compare

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

19 May 10:48
32f0721
Compare
Choose a tag to compare

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+matmul fuse,使得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...
Read more

PaddlePaddle 1.8.1

19 May 10:33
ea1c05d
Compare
Choose a tag to compare

Release Note

功能升级

  • 动转静训练方式可以支持嵌入动态图训练,或与动态图训练方式一致。使动转静训练和动态图训练代码使用切换简便易得。
  • 动转静支持训练后通过ProgramTranslator相关接口,保存可预测部署的模型及参数文件,并支持C++端加载和预测。
  • 优化部分算子的报错信息,使得在算子出错时能得到完整的报错信息,优化使用体验。