Skip to content

Releases: PaddlePaddle/Paddle

PaddlePaddle 2.4.0 Release Note

28 Nov 01:45
3fa7a73
Compare
Choose a tag to compare

2.4.0 Release Note

1. 重要更新

  • 新动态图架构正式生效:新动态图框架调大幅提升了调度性能,超90%API的调度性能提升超过50%,超50%套件模型性能提升超过5%,功能架构更加清晰,二次开发能力和体验显著增强。

  • 全面提升了飞桨的动静统一能力: 动转静功能提供了更加丰富的Python语法支持,飞桨的Python语法覆盖率达到90%,对语法转写逻辑进行了重点地优化,完备地支持了控制流语法,提供了更加流畅的一键转静态图体验;借助全新升级的静态图执行器,让动转静训练具有更优的加速能力,重点模型测试显示接近静态图最佳水平;提升了动转静的可扩展性,新增支持多函数合并导出和推理,支持用户使用PHI算子库进行二次开发和灵活部署,有效支撑语音领域U2++特色模型的自定义解码。

  • 新增稀疏计算类API: 新增55个稀疏API paddle.sparse.*,支持稀疏计算主流场景,已应用于3D点云目标检测、Sparse Transformers等任务的稀疏训练和推理部署,高稀疏度场景下相比使用DenseTensor提速105.75%,相比同类产品稀疏计算提速4.01%~58.55%;支持多种稀疏Tensor(SparseCoo 和 SparseCsr等)的计算,极致节省显存;同时保持了一致的使用体验,和稠密Tensor的API使用方式一致。

  • 大规模图神经网络GPU训练引擎: 通过SSD、内存、显存的异构层次化存储技术,突破显存瓶颈,支持超大规模图的全GPU存储和训练;实现了游走、采样、训练的全GPU一体化解决方案,相比传统的分布式CPU解决方案,相同成本的情况下训练速度提升10+倍。

  • 环境适配: 新增了适配CUDA11.7 版本的预编译安装包,新增了支持在Ubuntu 22.04及以上版本中运行。

前瞻性预告

  • 飞桨框架将在2.5版本废弃对python 3.6的支持。
  • 飞桨框架将会逐步废弃python端的paddle.fluild命名空间下的API,在2.5版本时,部分该命名空间下的API将会被直接删除。

2. 不兼容升级

  • 取消了适配CUDA10.1 版本的预编译安装包。
  • Tensor.clear_gradient(bool set_to_zero)接口不再接收kwargs传入的值,只能通过args传入set_to_zero的bool变量。
  • 为了提高显存利用效率,动态图默认仅保留前向叶子结点变量的梯度如训练中网络参数的梯度,而不再支持默认保留非叶子结点的梯度。如果需要保留特定Tensor的梯度,可以在反向执行前调用Tensor.retain_grads()接口。
  • paddle.autograd.PyLayer将不再支持输入是tuple的情况,如果输入希望是一组Tensor的情况请传入list of Tensor。

3. 训练框架(含分布式)

(1)新增API和增强API功能

  • 新增稀疏计算类API:paddle.sparse

  • 新增语音领域API: paddle.audio

    • 新增MFCC、Spectrogram、LogMelSpectrogram等特征提取API,支持GPU计算,相比CPU实现处理性能提升 15x 倍以上,可大幅提升语音模型训练GPU利用率。#45424
    • 新增窗函数、离散余弦变换等特征提取基础API,方便用户自定义语音特征提取。#45424
    • 新增语音 IO 模块,提供2种 音频I/O backend,支持6种编解码,便捷地实现语音数据的加载。 #45939
    • 新增TESS,ESC50语音分类数据集,方便用户完成经典语音分类模型。#45939
  • 新增图学习领域API: paddle.geometric

    • 图学习逐渐成为机器学习领域的关键技术,飞桨新增paddle.geometric模块提供更好的图学习建模和训练开发体验。
      • 消息传递:图学习消息传递机制是图建模的基础,因此新增7个图学习消息传递API,更方便完成进行图学习建模。其中,新增的3个消息传递融合算子可大幅减少图模型训练显存占用,稠密图场景下GCN系列模型可节省50%+显存,训练速度可提升20%+。#44848, #44580, #43174, #44970
      • 图采样:图采样是图模型训练的性能瓶颈,此次新增了高性能图采样算子,支持高并发图采样,GraphSage的采样速度可提升32倍以上,模型训练速度可提升12倍以上。#44970
  • 新增视觉领域API

    • paddle.vision新增目标检测领域算子paddle.vision.distribute_fpn_proposals(#43736), paddle.vision.generate_proposals(#43611), paddle.vision.matrix_nms(#44357), paddle.vision.prior_box和paddle.vision.box_coder(#47282)。
  • 增强API功能

    • 增加BatchNorm1D的大batch_size计算功能 #43072
  • 完善集合通信分布式训练API

    • 完善fleet.init函数,增加log_level参数,方便用户查看运行过程中的日志 #45909
    • 新增paddle.distributed.fleet.recompute_sequential paddle.distributed.fleet.recompute_hybrid接口,方便用户使用recompute功能#45348
    • 新增paddle.distributed.fleet.layers.mpu package,方便用户使用张量并行功能 #45803
    • 新增通信API paddle.distributed.destroy_process_group paddle.distributed.isend paddle.distributed.irecv paddle.distributed.all_to_all_single,提升了通信的功能完备性和易用性 #43918
    • 新增paddle.distributed.stream 通信package,性能比基础版本提升5%到10% #46023 #45282
    • 通信API新增多种数据类型Char/Byte/Bool等的支持,提升了通信的功能完备性和易用性 #45574 #45440
    • 通信API异步参数从use_calc_stream变成sync_op,增强了接口的语义可读性 #46493
  • 增强高层API

    • 高层API中视觉模型ResNeXt实现复用ResNet代码进行重构。 #40588
    • 高层API中视觉模型Inceptionv3、MobileNetv1、MobileNetv2、ShuffleNetv2实现改进。#40431

(2)新功能及重要功能升级

  • 新动态图架构正式上线:新动态图框架调度性能大幅提升,相比原有架构大幅提升了调度性能,超90%API的调度性能提升超过50%,超50%套件模型性能提升超过5%; 新动态图架构清晰,耦合度低,基于新架构实现Hook、PyLayer等扩展模块的学习与开发成本显著降低。#37550#37574#37813#37926#39192#37599#37406#37466#37599#40945#39989

  • 高阶自动微分机制:为了更好支持科学计算等场景,飞桨框架针对高阶自动微分能力进一步完善优化。目前,已在paddle.incubate.autograd 目录下提供了支持前反向高阶自动微分相关试用功能及API(当前处于孵化状态,相关功能及API 签名可能会发生变化)。如果想自行实现相关模型、探索自动微分机制,请仔细阅读高阶自动微分使用方法及限制。具体的升级包括:

    1. 静态图高阶微分机制升级,通过基础算子体系和程序变换,支持高阶前向及反向微分,并打通编译器、分布式功能。#41919, #41201
    2. 新增前向和反向高阶自动微分API, paddle.incubate.autograd.forward_grad, paddle.incubate.autograd.grad#43354
    3. 新增18个高阶自动微分算子sin, cos, exp, erf, abs, log, cast, where, equal, not_equal, greater_than, greater_equal, elementwise_pow square, elementwise_max, gelu, reduce_mean, size#46184, #46024, #45888, #45338, #44345
    4. 修复现有elementwise_div, reduce_sum, p_norm等算子缺陷。#46514, #46184
  • 通用异构参数服务器架构

    • 参数服务器...
Read more

PaddlePaddle 2.3.2 Release Note

16 Aug 08:23
4596b9a
Compare
Choose a tag to compare

2.3.2 Release Note

2.3.2 版本修复了已知问题,并新增了少量功能。

训练框架(含分布式)

  • 性能分析器增加对静态图和动态图的算子的输入张量的input shape的采集。(#44245#44384#44654
  • 修复部分单测在CUDA 11.7环境失败的问题。(#44785#44796
  • 修复量化后训练与量化感知训练时,部分 scale 命名不统一问题。(#44903
  • 修复在外部基于paddle开放的PHI C++ API,编写C++程序并且编译为可执行文件使用的场景中,因为PHI中ContextPool没有初始化而报错的问题。(#43910
  • 修复paddle编译产出的core_(no)avx.so动态库so name与实际文件名不一致,导致外部链接的时候报错找不到 libpaddle_pybind.so的问题。(#43977
  • 修复自定义算子中调用Tensor.stream()获取的stream与实际运行时stream不一致的问题。(#44500
  • 修复在新动态图模式下执行自定义算子出现输入属性类型解析错误的问题。(#44938
  • 修复性能数据采集器因为线程局部变量被释放而丢失数据的问题。(#44384
  • 修复PACT感知量化训练中支持量化新格式的问题;增强量化新格式C++ kernel计算逻辑;支持Reduce Max算子量化。(#44876

部署方向(Paddle Inference)

  • FusedMultiTransformer 新增 normalize_before=False 功能,支持 layer_norm 计算在 attention 和 feed forward 后的 Transformer 结构。(#44931
  • 新增 NVCC_LAZY 算子按需加载选项,通过 export CUDA_MODULE_LOADING=LAZY,即可实现算子按需加载。(#44957 #44997
  • ONNX Runtime后端新增支持partial_sum、partial_concat、bilinear_interp、conv3d、pool3d、multiclass_nms convert。(#44791
  • 优化ONNX Runtime后端:支持Clone接口、支持获取输入mutable data,降低内存消耗。(#44766
  • 新增 squeeze2、unsqueeze2、cast、slice TensorRT convert 支持。(#44887#44837#44757
  • 修复skip layernorm fp16 kernel计算错误的问题。(#45041

2.3.2 Release Note

V2.3.2 fixed known bugs, and added a tiny set of features.

Training Framework (distributed included)

  • Profiler collects input tensors' shape for static graph and dynamic graph operators. (#44245, #44384, #44654)
  • Fixed failed unit tests in CUDA 11.7. (#44785, #44796)
  • Fixed scale name incosistency issue when being used in post training quantization and quantization aware training. (#44903)
  • Fixed ContextPool in PHI uninitialized issue when PHI's C++ APIs are being used to compile a standalone executable. (#43910)
  • Fixed the compiled output core_(no)avx.so's so name is not consistent with the actual file name issue, so libpaddle_pybind.so could be linked correctly. (#43977)
  • Fixed the issue that Tensor.stream() is not returning the correct stream when being used in a customized operator. (#44500)
  • Fixed iniput attribute type parsing error when customized operator is being executed in new dynamic graph mode. (#44938)
  • Fixed the issue that profiler's performence data collector is missing data caused by thread local variables not being freed correctly. (#44384)
  • Fixed issue of supporting new format of PACT context aware training; Improved quatization new format C++ kernel computation logic; support Reduce Max operator quatization. (#44876)

Deployment Direction (Paddle Inference)

  • FusedMultiTransformer added normalize_before=False, which supports layer_norm to compute the Transformer structure after attention and feed forward. (#44931)
  • Added NVCC_LAZY operators loaded by demand option, which could be enabled by setting export CUDA_MODULE_LOADING=LAZY. (#44957, #44997)
  • ONNX Runtime backends added support for partial_sum, partial_concat, bilinear_interp, conv3d, pool3d, multiclass_nms convert. (#44791)
  • Optimized ONNX Runtime backend support: support Clone interface, support getting input mutable data, reduce memory consumption. (#44766)
  • Added squeeze2, unsqueeze2, cast, slice TensorRT convert. (#44887, #44837, #44757)
  • Fixed skip layernorm fp16 kernel computation error. (#45041)

PaddlePaddle 2.3.1 Release Note

12 Jul 03:54
3cc6ae6
Compare
Choose a tag to compare

2.3.1 Release Note

1. 重要更新

  • 2.3.1 版本是在 2.3 版本的基础上修复了已知问题,并且发布了支持 CUDA 11.6 的安装包。

2. 训练框架(含分布式)

(1)功能优化

API

  • 修改paddle.nn.initializer.KaimingUniformpaddle.nn.initializer.KaimingNormal 两种初始化方式,使其支持多种类型的激活函数。(#43721, #43827)
  • 优化 paddle.io.DataLoader 的数据预读取功能,使其支持设置了 prefetch_factor 设定的预读取数据的缓存数量,避免在读取大块数据时出现 IO 阻塞。(#43674 )

新动态图执行机制

  • 修改新动态图 API 逻辑中 optional 类型 Tensor 的初始化方法,防止被提前析构导致数据异常。(#42561)

全新静态图执行器

  • 延迟初始化执行器中的线程池,避免只执行一轮的 program(如 save、load、startup_program等)创建线程池。(#43768)

混合精度训练

  • 设置 paddle.nn.Layerset_state_dict中禁用 state_dict hook。(#43407)

分布式训练

  • 使 paddle.incubate.nn.functional.fused_attentionpaddle.incubate.nn.functional.fused_feedforward支持张量模型并行。(#43505)

其他

  • 调整框架算子内核打印字符串的格式,便于进行自动化拆分解析。(#42931)
  • 更新模型量化 API,支持rounding to nearest ties to even的四舍五入方式,支持量化取值范围 [-128, 127]。(#43829)
  • 量化感知训练适配支持 AMP 混合精度训练。(#43689)
  • 量化感知训练在启动时新增 progress bar,便于查看量化初始化进度,统计 out_threshold 时跳过 scale op,加速初始化过程。(#43454)
  • 动态图量化训练支持 convbn 融合,静态图离线量化支持设置 skip_tensor_list 来跳过某些层不做量化。(#43301)

(2)性能优化

  • 优化paddle.incubate.nn.functional.fused_attentionpaddle.incubate.nn.functional.fused_feedforward算子,增加add_residual属性,用以控制最后一步是否进行加residual操作,CAE 模型性能提升 7.7%。(#43719)
  • 优化 linspace 算子,将 startstopnum三个输入 Tensor 初始化在 CPU 上,避免在算子中进行 GPU -> CPU 拷贝,SOLOv2 模型性能提升6%。(#43746)

(3)问题修复

API

  • 修复 paddle.io.DataLoaderreturn_list=True 时因多线程冲突小概率报错问题。(#43691)
  • 修复 paddle.nn.Layer的参数存在 None类型参数时 to方法报 NoneType 不存在 device 属性的错误。(#43597)
  • 修复 cumsum op 在某些 shape下计算结果出错的问题。 (#42500, #43777)
  • 修复静态图下 Tensor.__getitem__在使用 bool索引时组网阶段输出结果维度为 0 的问题。 (#43246)
  • 修复 paddle.slicepaddle.strided_slice 处理参数为负数时出现异常的问题。(#43432)
  • 修复 set_value op 在处理切片 step为负数时赋值结果异常的问题。 (#43694)
  • 修复 C++ 端 copy接口不能在多卡设备间拷贝的问题。(#43728)
  • 修改 paddle.incubate.nn.functional.fused_attentionpaddle.incubate.nn.functional.fused_feedforward 中属性命名引发的推理时的问题。(#43505)
  • 修复 ConditionalBlockGrad op 处理不需要 grad的 Tensor 时异常的问题。(#43034)
  • 解决 C++ 的 einsum op 反向速度优化引起的显存增加问题,并将反向优化默认打开。(#43397)
  • 修复单卡下 paddle.io.DataLoader多进程数据读取在固定随机种子时数据无法固定的问题。(#43702)
  • 修复 softmax op 在 Tensor 元素超过 2G 时,触发 CUDNN_STATUS_NOT_SUPPORT 的错误。(#43719)
  • 修复 trace op Event 字符串在不同算子无区分,导致性能分析不便利的问题。(#42789)

其他

  • 修复动转静多次 deepcopy 并保存导致的显存溢出问题。(#43141)
  • 修复自定义算子中使用的 PlaceType 类型升级引入的 device id 在多卡场景中出错的问题。(#43830)
  • 优化 paddle.profiler.Profiler timeline 可视化逻辑,将在 python 脚本中自定义的事件从 C++ 折叠层显示移动至 python 折叠层显示。(#42790)

3. 部署方向(Paddle Inference)

(1)新增特性

新增功能

  • CPU 上 ONNX Runtime 后端新增 PaddleSlim 量化模型支持。 (#43774, #43796)

(2)底层优化

CPU性能优化

  • EnableMkldnn 配置中移除 gpu_cpu_reshape2_matmul_fuse_pass,修复 ResNet50 性能下降的问题。 (#43750)

GPU 性能优化

  • 添加 bilinear_interp_v2 TensorRT convert 支持。 (#43618)
  • 添加 matmul_scale_fuse_passmultihead_matmul_fuse_pass_v3到 GPU pass,并添加单测。(#43765)
  • 添加 GPU handle 延迟初始化支持。 (#43661)

(3)问题修复

框架及API修复

  • 修复联编 Paddle-Lite XPU 时的编译报错问题。(#43178)
  • 修复 ERNIE 3.0 pass误触发的问题。(#43948)
  • 修复 multihead op 中 int8 量化属性读不到的问题。(#43020)

后端能力修复

  • 修复 MKLDNN 中 elementwise_mul 和 matmul 两个 op 在运行量化推理过程中崩溃的问题。 (#43725)
  • 修复同一模型在推理时 TensorRT 子图序列化文件反复生成的问题。(#42945, #42633)
  • 修复 ONNX Runtime 后端与外部使用的 protobuf 冲突问题。(#43159, #43742)
  • 修复 python 预测库 ONNX Runtime 后端在多输入情况下推理报错问题。 (#43621)

4. 环境适配

编译安装

  • 完成对 CUDA 11.6 的验证和适配,并在官网发布 CUDA 11.6 的安装包。(#43935, #44005)
  • 修复在 Windows 上使用 CUDA 11.6 编译时的 cub 报错问题。(#43935, #44005)
  • 修复 elementwise、reduce op 编译时间较长的问题。(#43202, #42779, #43205)

新硬件适配

  • 寒武纪 MLU 支持飞桨 Profiler。(#42115)
  • GraphCore IPU 支持显示编译进度。(#42078)

2.3.1 Release Note

1. Important Updates

  • V2.3.1 is built on V2.3 by fixing known issues and releasing precompiled binary that supports CUDA 11.6.

2. Training Framework (distributed included)

(1) Function Optimization

API

  • Modify two initialization modes of paddle.nn.initializer.KaimingUniform and paddle.nn.initializer.KaimingNormal, to support multiple types of activation functions. (#43721, #43827)
  • Optimize the data pre-fetching function of paddle.io.DataLoader, so that it can support the setting of the prefetch_factor to set the cache size of pre-fetched data. This can avoid IO blocking when reading large blocks of data. (#43674)

New dynamic graph execution mechanism

  • Modify the initialization method of optional type Tensor in the new dynamic graph API logic to prevent data exceptions caused by early destruction. (#42561)

New static graph executor

  • Defer initialization of the thread pools in the executor, to avoid creating thread pools for programs that execute only once (e.g.,save, load, startup_program, etc.). (#43768)

Mixed precision training

  • Disabling state_dict hook in set_state_dict in paddle.nn.Layer. (#43407)

Distributed training

  • Enabling tensor parallelism in paddle.incubate.nn.functional.fused_attention and paddle.incubate.nn.functional.fused_feedforward. (#43505)

Others

  • Adjust print format of the framework operator kernels to facilitate automated splitting and parsing. (#42931)
  • Update the model quantization API to support the round-off in rounding to nearest ties to even, and support quantization in the range [-128, 127]. (#43829)
  • Support AMP mixed precision training in quantization-aware training. (#43689)
  • Add the progress bar at the beginning of quantization-aware training, so that it is easy to check the progress of quantization initialization. Skip the scale op when counting out_threshold to speed up the initialization process. (#43454)
  • Support conv and bn fusion in the dynamic graph quantization training. Support the settings of skip_tensor_list in the static graph offline quantization, to skip some layers without quantization. (#43301)

(2) Performance Optimization

  • Optimizepaddle.incubate.nn.functional.fused_attention and paddle.incubate.nn.functional.fused_feedforwardoperators. Add add_residual property to control whether to perform add-residual operation in the last step. The performance of CAE model is improved by 7.7%. (#43719)
  • Optimize linspace operator. Initialize...
Read more

PaddlePaddle 2.3.0 Release Note

13 May 08:03
590b4db
Compare
Choose a tag to compare

我们很高兴地发布飞桨框架 2.3.0 版本,本版本包含如下重要更新。

API

  • 新增 100 多个 API,覆盖自动微分、线性代数、概率分布、稀疏张量、框架性能分析、硬件设备管理、视觉领域等方面。

  • 新增 4 个自动微分 API,11 个线性代数 API,21 个概率分布类 API,更好地支持科学计算、强化学习等场景。

  • 新增 11 个 稀疏张量计算 API,支持创建 COO、CRS 格式的 Sparse Tensor 以及与 Tensor 互相转换等基础功能。

  • 新增 9 个框架性能分析 API,以paddle.profiler.Profiler为核心,提供对训练、推理过程中性能数据的收集、导出和统计的功能。

  • 新增 7 个硬件设备管理 API,更好支持硬件相关信息获取。

  • 新增多个视觉、文本领域 API,方便复用 MobileNetV3, ResNeXt等骨干网络,实现快速组网。

飞桨高可复用算子库 PHI

  • 发布飞桨高可复用算子库 PHI (Paddle HIgh reusability operator library),支持组合式算子功能复用、Primitive算子内核复用、插件式硬件加速库复用。针对飞桨框架原算子库存在的算子接口不清晰、算子复用成本较高、调用性能不够快的问题,我们重构了飞桨框架的算子库,设计了灵活、高效的函数式算子库 Phi,可以通过对函数式算子接口组合调用的方式实现新算子。新算子库提供了 200 余个跟 python 开发接口保持一致的 C++ 运算类 API,以及近500个可供组合调用的前、反向函数式算子内核 Kernel,可大幅降低框架原生算子和自定义算子的开发成本。新算子库支持Primitive API方式开发算子内核,可支持不同硬件(比如GPU和XPU)的算子内核复用。新算子库支持以插件方式接入硬件(比如NPU)的加速库,实现低成本复用硬件加速库。

分布式训练

  • 全面升级自适应分布式训练架构,含弹性扩缩容、异步流水执行器、异构通信、自动并行等多个模块,支持了多种异构硬件下自动感知的分布式训练及分布式推理。

  • 动态图混合并行下新增MoE并行策略、GroupSharded 并行策略、Pure FP16 等,进一步支持了动态图下大模型的高效并行训练。

  • 全面升级优化了通用异构参数服务器架构,进行各模块的抽象简化,如通信、存储等,提升了参数服务器的二次开发体验;GPU 参数服务器在千亿参数百亿数据分钟级流式训练下性能提升2.38倍。

编译安装

  • 从 2.3.0-rc0 版本开始,飞桨对框架支持的 GPU 架构种类进行了调整和升级。

推理部署

  • 新增 Java API 和 ONNX Runtime CPU 后端。

  • 支持 TensorRT 8.0 / 8.2 和结构化稀疏,针对 ERNIE 类结构模型性能深度优化。

硬件适配

  • 新增自定义新硬件接入:提供一种插件式扩展 PaddlePaddle 硬件后端的方式。

  • 新增对华为昇腾910 / GraphCore IPU / 寒武纪MLU / 昆仑芯2代多种异构芯片的训练/推理支持。

框架架构

Thanks to our Contributors

This release contains contributions from the project core team as well as :

Adam Osewski, Allen Guo, arlesniak, chenenquan, chenyanlann, fengkuangxiaxia, fuqianya, fwenguang, guguguzi, helen88, houj04, Jacek Czaja, jakpiase, jianghaicheng, joanna.wozna.intel, joeqiao12, Leo Chen, Leo Guo, Li-fAngyU, lidanqing, Liyulingyue, Matsumoto GAO, maxhuiy, Ming-Xu Huang, Nyakku Shigure, piotrekobi, piotrekobiIntel, QingshuChen, qipengh, Skr Bang, Sylwester Fraczek, Sławomir Siwek, taixiurong, tanzhipeng, Tomasz Socha, TTerror, Webbley, yaozhixin, ykkk2333, yujun, Zhangjingyu06, zhangxiaoci, zhangyikun02, zhangyk0314, zlsh80826, zn, Zuza

PaddlePaddle 2.3.0-rc0 Release Note

30 Apr 12:12
5d4980c
Compare
Choose a tag to compare

我们很高兴地发布飞桨框架 2.3.0-rc0 版本,本版本包含如下重要更新。

API

  • 新增 100 多个 API,覆盖自动微分、线性代数、概率分布、稀疏张量、框架性能分析、硬件设备管理、视觉领域等方面。

  • 新增 4 个自动微分 API,11 个线性代数 API,21 个概率分布类 API,更好地支持科学计算、强化学习等场景。

  • 新增 11 个 稀疏张量计算 API,支持创建 COO、CRS 格式的 Sparse Tensor 以及与 Tensor 互相转换等基础功能。

  • 新增 9 个框架性能分析 API,以paddle.profiler.Profiler为核心,提供对训练、推理过程中性能数据的收集、导出和统计的功能。

  • 新增 7 个硬件设备管理 API,更好支持硬件相关信息获取。

  • 新增多个视觉、文本领域 API,方便复用 MobileNetV3, ResNeXt等骨干网络,实现快速组网。

飞桨高可复用算子库 PHI

  • 发布飞桨高可复用算子库 PHI (Paddle HIgh reusability operator library),支持组合式算子功能复用、Primitive算子内核复用、插件式硬件加速库复用。针对飞桨框架原算子库存在的算子接口不清晰、算子复用成本较高、调用性能不够快的问题,我们重构了飞桨框架的算子库,设计了灵活、高效的函数式算子库 Phi,可以通过对函数式算子接口组合调用的方式实现新算子。新算子库提供了 200 余个跟 python 开发接口保持一致的 C++ 运算类 API,以及近500个可供组合调用的前、反向函数式算子内核 Kernel,可大幅降低框架原生算子和自定义算子的开发成本。新算子库支持Primitive API方式开发算子内核,可支持不同硬件(比如GPU和XPU)的算子内核复用。新算子库支持以插件方式接入硬件(比如NPU)的加速库,实现低成本复用硬件加速库。

分布式训练

  • 全面升级自适应分布式训练架构,含弹性扩缩容、异步流水执行器、异构通信、自动并行等多个模块,支持了多种异构硬件下自动感知的分布式训练及分布式推理。

  • 动态图混合并行下新增MoE并行策略、GroupSharded 并行策略、Pure FP16 等,进一步支持了动态图下大模型的高效并行训练。

  • 全面升级优化了通用异构参数服务器架构,进行各模块的抽象简化,如通信、存储等,提升了参数服务器的二次开发体验;GPU 参数服务器在千亿参数百亿数据分钟级流式训练下性能提升2.38倍。

编译安装

  • 从 2.3.0-rc0 版本开始,飞桨对框架支持的 GPU 架构种类进行了调整和升级。

推理部署

  • 新增 Java API 和 ONNX Runtime CPU 后端。

  • 支持 TensorRT 8.0 / 8.2 和结构化稀疏,针对 ERNIE 类结构模型性能深度优化。

硬件适配

  • 新增自定义新硬件接入:提供一种插件式扩展 PaddlePaddle 硬件后端的方式。

  • 新增对华为昇腾910 / GraphCore IPU / 寒武纪MLU / 昆仑芯2代多种异构芯片的训练/推理支持。

框架架构

Thanks to our Contributors

This release contains contributions from the project core team as well as :

Adam Osewski, Allen Guo, arlesniak, chenenquan, chenyanlann, fengkuangxiaxia, fuqianya, fwenguang, guguguzi, helen88, houj04, Jacek Czaja, jakpiase, jianghaicheng, joanna.wozna.intel, joeqiao12, Leo Chen, Leo Guo, Li-fAngyU, lidanqing, Liyulingyue, Matsumoto GAO, maxhuiy, Ming-Xu Huang, Nyakku Shigure, piotrekobi, piotrekobiIntel, QingshuChen, qipengh, Skr Bang, Sylwester Fraczek, Sławomir Siwek, taixiurong, tanzhipeng, Tomasz Socha, TTerror, Webbley, yaozhixin, ykkk2333, yujun, Zhangjingyu06, zhangxiaoci, zhangyikun02, zhangyk0314, zlsh80826, zn, Zuza

PaddlePaddle 2.2.2 Release Note

26 Jan 02:13
b031c38
Compare
Choose a tag to compare

2.2.2 Release Note

1. 重要更新

我们很高兴的发布飞桨框架2.2.2版本,主要是对2.2.1中一些功能和性能问题的修复,并对部分功能点做了增强。

2. 训练框架(含分布式)

(1)新功能

API

  • 新增paddle.nn.Mishpaddle.nn.functional.mish,支持逐元素计算mish激活函数。 (#38803)

其他

  • paddle.nn.PReLUpaddle.nn.functional.prelupaddle.nn.static.prelu 新增支持 data_format 参数,可以设置输入的数据类型。 (#38495)
  • paddle.index_select 新增支持 float16 数据类型。(#38751)
  • 优化 paddle.multiplexinputs中张量 size 为 0 时的报错信息。(#38757)
  • paddle.fluid.contrib.slim.quantization.PostTrainingQuantization 新增初始化参数data_loader,支持传入 paddle.io.DataLoader 对象或者Python Generator 。(#38729)

(2)问题修复

API

  • 修复paddle.max在输入x.ndim > 6 and axis < 0时运行出错的问题。(#38070)
  • 修复paddle.maxpaddle.min的bug:在CPU设备上,当参数axis是list类型且len(axis) == x.ndim and axis[i] < 0时,结果出错。(#38478)
  • 修复paddle.nn.functional.unfold在InferShape计算时不区分compile time和runtime的问题。(#38925)
  • 修复paddle.nn.functional.cross_entropy在对labels进行检查时,存在不必要的GPU与CPU同步的问题。(#38849
  • 修复paddle.distributed.split在沿列切分FC时,反向计算时得到的输入梯度结果异常的问题。(#38724)
  • 修复 paddle.nn.Layer.to 不支持 paddle.dtype 类型的问题。(#38108)
  • 修复静态图下 paddle.linalg.svdfull_matrics=True 时,输出tensor的shape在动态图和静态图下不同的问题。(#37744)
  • 修复Tensor切片索引使用多个None类型索引时结果维度异常的问题。(#37400)
  • 修复Tensor索引赋值在部分场景下显存泄露的问题。(#38098)
  • 修复模型使用 save_inference_model 导出后,添加反向 pass 做训练,conv2d 缺失属性报错的问题。 (#38832)

IR(Intermediate Representation)

  • 动态图转静态图

    • 修复了部分初始化相关 API 动静行为不统一的问题。(#37827)
    • 修复动转静代码转写时会将 paddle 作为变量的问题。(#37999)
    • 修复动转静代码转写时,突出的代码注释导致转写报错的问题。(#38003)
    • 修复 for ... zip... 语句在动转静中死循环的问题。(#37846)
  • 模型量化

    • 修复动态图量化训练导出模型多余节点问题。(#38122) (#38025)
    • 针对量化模型在Paddle Lite上无法预测的问题,去除量化导出模型的 clip_extra 设置。 (#38343)
    • 针对 flatten_contiguous_range 算子在量化中输出配置错误的问题,修复 flatten_contiguous_range 量化设置。 (#37741)

其他

  • 自定义OP

    • 修复了自定义算子在多进程下加载Python API 时,可能因文件不完整导致报错的问题。(#38128)
    • 修复了在CentOS平台上编译时,D_GLIBCXX_USE_CXX11_ABI未按预期生效导致的编译失败问题。(#37878)
  • 动态图Inplace策略

    • 修复了多个inplace op连续执行时,accumulator 报错的问题。(#38406)
    • 修复了 Tensorsetitem 方法,对叶子节点进行inplace操作时,导致反向图构建错误的bug。(#38014)
  • NHWC 策略

    • 修复 batchnorm_op 中,当数据类型为 FP32 ,且数据维度 dims = 2,data_layout = NHWC 时,反向 Op 内中间变量未定义问题。 (#37020)

3. 部署方向(Paddle Inference)

(1)功能优化

框架及API更新

  • C API支持对c++ std::string的处理。(#38667)

后端能力增强

  • GPU 及 TensorRT 子图引擎相关更新
    • 支持 relu、relu6、tanh、sigmoid、pool2d、concat、batch_norm、split、gelu、scale、swish、prelu、clip、reduce_sum、reduce_mean 算子在静态 shape 且2维输入情况下调用 TensorRT 推理。(#37773)
    • 支持mish激活函数调用 TensorRT 推理。 (#38866)

(2)问题修复

框架及API修复

  • 算子修复

    • 修复roi_align算子在使用 TRT 时不兼容的问题。(#38788)
    • 增加elementwise在维度相同时广播的功能。(#37908)
  • 框架功能修复

    • 修复动态图转静态图时的模型剪裁逻辑,使得包含 subblock 的算子在动态图转静态图时可以正确剪裁。(#37579)
    • 修复多线程下 CreatePredictor 接口的报错问题,当前的 CreatePredictor 接口允许在多线程中调用而不会导致推理异常。(#37894)
    • 配置config时,对于没有权重的模型,支持 params file 传空字符串。(#38579)
    • 修复Paddle-TRT engine直接输入cpu tensor没有进行gpu数据拷贝的问题。(#37427)

后端能力修复

  • TensorRT 子图引擎修复

    • 修复pool2d在某些参数组合的情况下运行TensorRT出错的问题。(#37929)
  • MKLDNN引擎修复

    • 修复 matmul_v2 的 mkldnn kernel 不支持两个输入的shape长度不同的问题。 (#38733)

其他修复

  • 修复ERNIE模型在TRT8下可能出现的hang死问题。(#37839)

2.2.2 Release Note

1. Important Updates

This version fixed some function and performance issues of PaddlePaddle 2.2.1 and optimized some functions.

2. Training Framework (distributed included)

(1)New functions

API

  • Add the paddle.nn.Mish and paddle.nn.functional.mish which support the element-by-element calculation of the mish activation function. (#38803)

Others

  • The paddle.nn.PReLU, paddle.nn.functional.prelu, and paddle.nn.static.prelu newly support the data_format parameter. You can set input data type. (#38495)
  • The paddle.index_select supports float16 data type. (#38751)
  • Optimize error message of paddle.multiplex when tensor size in inputs is 0. (#38757)
  • Add initialization parameter data_loader for paddle.fluid.contrib.slim.quantization.PostTrainingQuantization, and support input of the paddle.io.DataLoader object or Python Generator. (#38729)

(2)Bug Fixes

API

  • Fix operation error of paddle.max in input of x.ndim > 6 and axis < 0. (#38070)
  • Fix bug of paddle.max and paddle.min: Result is incorrect on the CPU device when the parameter axis is the list type and len(axis) == x.ndim and axis[i] < 0. (#38478)
  • Fix bug that paddle.nn.functional.unfold does not distinguish between compile time and runtime in InferShape calculation. (#38925) (#38834)
  • Fix bug where GPU unnecessarily synchronizes with the CPU when paddle.nn.functional.cross_entropy checks labels. (#38849
  • Fix bug of input gradient result error in backward computing when paddle.distributed.split slices the FC along columns. (#38724)
  • Fix bug where paddle.nn.Layer.to does not support paddle.dtype type. (#38108)
  • Fix bug that output tensor's shape is different between dynamic and static graphs when full_matrics=True in paddle.linalg.svd under static graphs. (#37744)
  • Fix bug of the result dimension exception when the Tensor slice index uses multiple None type indexes. (#37400)
  • Fix memory leak bug of Tensor index assignment in some scenarios. (#38098)
  • Fix bug of conv2d reporting an error with missing attributes after model is exported using save_inference_model and backward pass is added for training. (#38832)

IR(Intermediate Representation)

  • Dynamic Graph to Static Graph

    • Fix bug of inconsistency between dynamic and static behaviors of some initialization-related APIs. (#37827)
    • Fix bug where paddle will be used as a variable when dynamic to static code is transcribed. (#37999)
    • Fix bug that highlighted code comments lead to an error report when dynamic to static code is transcribed. (#38003)
    • Fix endless loop of for … zip … statement in dynamic to static graph. (#37846)
  • Model quantization

    • Fix problem of redundant nodes in model derived from quantitative training of dynamic graph. (#38122) (#38025)
    • To solve the problem that the quantitative model cannot be predicted on Paddle Lite, remove clip_extra settings of quantitative export models. (#38343)
    • Fix flatten_contiguous_range quantization settings for flatten_contiguous_range operator output configuration error in quantization. (#37741)

Others

  • Custom OP
    • Fix bug that user-define...
Read more

PaddlePaddle 2.2.1 Release Note

08 Dec 05:04
a5cf2e3
Compare
Choose a tag to compare

2.2.1 Release Note

1. 重要更新

我们很高兴的发布飞桨框架2.2.1版本,主要是对2.2.0中一些功能和性能问题的修复,并对部分功能点做了增强,重点如下:

  • 新增 paddle.linalg.triangular_solve,用于计算带有三角系数矩阵的线性方程组。
  • 新增 paddle.device.cuda.graphs.CUDAGraph API,支持NVIDIA的CUDA Graph功能,注意目前该API还处于实验阶段,尚未稳定。
  • 修复了基础API、Tensor 索引中的已知问题。

2. 训练框架(含分布式)

(1)新功能

API

  • 新增paddle.linalg.triangular_solve API,用于计算带有三角系数矩阵的线性方程组。(#36714)
  • 新增paddle.device.cuda.graphs.CUDAGraph API,支持NVIDIA的CUDA Graph功能,可以将GPU计算全部捕捉到一张CUDA Graph中,往后多次调用,可以去除框架的额外开销,提升运行性能。注意目前该API还处于实验阶段,尚未稳定。(#37109)
  • 新增paddle.incubate.graph_send_recv API,主要应用于图学习领域,目的是为了减少在消息传递过程中带来的中间变量显存或内存的损耗,包含 SUM、MEAN、MIN、MAX 共四种更新模式。(#37205)
  • 新增paddle.incubate.operators.ResNetUnit API,用于 ResNet 网络里的卷积、批归一化、shortcut/bottleneck操作融合。(#37109)

(2)功能优化

API

  • paddle.incubate.FusedTransformerEncoderLayer,添加 src_mask=None 的支持,添加pure fp16的支持。 (#37229)

IR(Intermediate Representation)

  • 动态图转静态图
    • 使用@paddle.jit.to_static装饰单独的 function 时,提供 train()、eval() 函数支持切换到 train、eval 模式。(#37383)

分布式训练

  • 异构参数服务器完善任意次切图能力,增加流水线训练功能,提升训练吞吐。(#37446)

其他

  • 针对 paddle.scatterindex 越界导致 core dump 的问题,加强了越界检查,并完善对应的报错信息。(#37431)

(3)性能优化

  • 优化 paddle.top_k,根据 k 的大小和 input_width 大小进行选择不同的实现方案,当 k>=75% input_width 时选择 cub 实现,否则选择手写 kernel 实现。(#37325)
  • 优化paddle.fluid.optimizer.LarsMomentumOptimizer,通过 optimizer 算子融合 + CUDA Cooperative Groups的方式提高OP性能。(#37109)

(4)问题修复

API

  • 修复paddle.nn.ELUpaddle.nn.functional.elu 的计算公式,解决 alpha<0 时结果错误的问题;paddle.nn.functional.elu_不支持 alpha<0 的场景,在 alpha<0 时会报错。(#37437)
  • 修复paddle.slice反向执行时出现 out_of_range 的问题。(#37584)
  • paddle.shape 没有反向,显式设置 stop_gradientTrue。(#37412)
  • paddle.arange 没有反向,显式设置 stop_gradientTrue。(#37486)
  • paddle.shard_index 在输入数据的最后一维不为1时进行报错提示。(#37421)
  • 修复 paddle.matmul 使用int8量化,反量化时维度错误的问题。(#36982)
  • 修复 paddle.nn.Dropouteval 模式下不计算梯度的问题。(#37305)
  • 修复 paddle.nn.functional.dropout 在静态图下输入 Tenor 形状中有 -1 并指定 drop 该维时报错的问题。(#37223)
  • 修复RNN类API paddle.nn.LSTM,paddle.nn.GRU, paddle.nn.SimpleRNN在CPU训练时多层RNN(dropout设置为0)反向计算出错的问题。(#37086)
  • 修复 paddle.incubate.FusedTransformerEncoderLayer 反向计算梯度错误、pre_layer_norm 处理不正确、参数处理不正确,漏传参数、 add_bias 计算错误等问题。 (#37229)
  • 修复 paddle.incubate.fused_multi_head_attention 不支持 biasNone 的问题。(#37411, #37566)
  • 修复paddle.vision.datasets.Cifar10, paddle.vision.datasets.Cifar100加载数据没有顺序的问题。 (#37528)
  • 修复一维Tensor在使用省略号(...)索引时维度检测异常报错的问题。(#37192)
  • 修复Tensor索引赋值(setitem)梯度属性无法传播的问题,详见issue。(#37028)

IR(Intermediate Representation)

  • 动态图转静态图
    • 动转静后的模型调用 paddle.flops 能够正确统计模型参数。(#36852)
    • 动转静模块能够正确转换for i in [1, 2, 3]循环语句。(#37259)

分布式训练

  • fleet.load_model: 修复参数服务器模式下模型加载API不可用问题。(#37461)
  • fleet.save_inference_model: 修复参数服务器模式下模型保存 dense 参数前,未从 server 端拉取参数的问题。(#37461)

其他

  • 修复动态图 inplace 操作的问题:对一个非叶子节点进行 inplace 操作后,立即执行 backward,该节点及更前的节点的梯度计算错误。(#37420)

3. 部署方向(Paddle Inference)

(1)问题修复

  • 在明确关闭日志的情况下,进一步去除冗余的调试日志。(#37212)
  • 修复内存/显存优化策略,避免因不当的内存/显存优化导致预测结果有误或崩溃。(#37324, #37123)
  • 修复 Transformer 模型的 MultiHead 结构中融合后 QkvToContextPluginDynamicscale 的 scale 计算错误问题,这是由于 cuda 函数的 block 和 thread 设置错误引起的。(#37096)
  • 将所有的推理OP在int8量化的功能中注册:解决因历史原因有些推理OP没有在int8量化中注册的问题。(#37266)

2.2.1 Release Note

1. Important Updates

This version fixed some function and performance issues of PaddlePaddle 2.2.0, and optimized some functions. The highlights are as follows:

  • Add paddle.linalg.triangular_solve to calculate linear equations with triangular coefficient matrices.
  • Add paddle.device.cuda.graphs.CUDAGraph API that supports the CUDA Graph function of NVIDIA. Note that this API is still experimental and not yet stable.
  • Fix known issues of basic API and Tensor index.

2. Training Framework(Distributed Included)

(1)New Functions

API

  • Add paddle.linalg.triangular_solve API to calculate linear equations with triangular coefficient matrices. (#36714)
  • Add paddle.device.cuda.graphs.CUDAGraph API that supports the CUDA Graph function of NVIDIA by capturing all GPU calculations into a single CUDA Graph and calling them for later use, which not only cuts the extra overhead but also improves the runtime performance. Note that the API is still experimental and not yet stable. (#37109)
  • Addpaddle.incubate.graph_send_recv API for graph learning to reduce the loss of intermediate variables in memory or video memory during message passing. It contains four update modes, namely, SUM, MEAN, MIN, and MAX. (#37205)
  • Add paddle.incubate.operators.ResNetUnit API to integrate the convolution, batch normalization, and shortcut/bottleneck operation in the ResNet network. (#37109)

(2)Function Optimization

API

  • paddle.incubate.FusedTransformerEncoderLayer adds src_mask=None and supports pure fp16.(#37229)

IR(Intermediate Representation)

  • Dynamic Graph to Static Graph
    • When adopting@paddle.jit.to_static to decorate single function, train()、eval() functions are provided to support the switch to train、eval mode. (#37383)

Distributed Training

  • Optimize the ability of arbitrary cutting and add pipeline training in the heterogeneous parameter server, which enhance training throughput.(#37446)

Others

  • Enhance the out-of-bounds check for the index of ``paddle.scatter` that causes core dump, and improve the corresponding error reporting message. (#37431)

(3)Performance Optimization

  • Optimize paddle.top_k by enabling it to choose different implementations according to the size of k and input_width: cub implementation when k>=75% input_width, otherwise the handwritten kernel implementation.(#37325)
  • Optimize paddle.fluid.optimizer.LarsMomentumOptimizer to improve OP performance by integrating optimizer operator and CUDA Cooperative Groups. (#37109)

(4)Bug Fixes

API

  • Fix the calculation error of paddle.nn.ELU and paddle.nn.functional.elu when alpha<0;please note the inplace version:paddle.nn.functional.elu_ will raise error when alpha<0. ([#37437]
  • (#37437))
  • Fix the problem of out_of_range when the paddle.slice is reversely executed. (#37584)
  • paddle.shape doesn't support backward, explicitly set stop_gradient to True. (#37412)
  • paddle.arange doesn't support backward, explicitly set stop_gradient to True.(#37486)
  • paddle.shard_index reports an error if the last dimension of the input data is not 1. (#37421)
  • Fix the wrong dimension of inverse quantization when paddle.matmul adopts int8 quantization. (#36982)
  • Fix the issue that paddle.nn.Dropout, under eval, does not calculate the gradient. (#37305)
  • Fix the issue that `paddl...
Read more

PaddlePaddle 2.2.0 Release Note

10 Nov 09:45
ab2004b
Compare
Choose a tag to compare

English Version

1. 重要更新

我们很高兴的发布飞桨框架2.2.0版本,本版本包含如下重要更新。

API

  • 新增100+个API,包含24个傅里叶变换API、17个线性代数计算 API 等,更好地支持科学计算类、信号处理类模型。
  • 新增多种索引类型的支持,新增的索引类型包括:省略号(…)、维度扩增(None)、布尔类型数组(Bool Mask)、整数数组((list),以及张量(Tensor) ),可以更加方便的对张量(Tensor)进行操作。
  • 新增 paddle.einsum API,可以以更加简洁的方式来表达多维张量(Tensor)的计算。
  • 动态图混合精度功能增强,新增整个任务使用半精度(float16)训练的方式,主要任务下的计算效率提升20%左右。
  • 新增FasterTokenizer文本预处理功能,可以提升BERT/ERNIE等预训练模型的推理速度,并节省94%的C++部署代码。

IR(Intermediate Representation)

  • 动态图转静态图:进一步扩充了动静转换支持的语法和场景,现在使用混合精度训练的动态图模型也可以通过 to_static 接口一键转换为静态图进行训练或推理部署;另外,对转换后训练的性能进行了优化,通过引入缓存和开启 Pass 等策略,转换后的训练性能相对动态图方式有明显提升。
  • Pass 开发:新增 Python 端对静态图IR的改写接口,针对 OP fusion 等子图替换场景可以在 python 中快速完成开发。
  • 对算子 Kernel 实现中的底层代码进行了抽象与功能封装,提供高性能的 Block 级 IO 运算和 Compute 运算(Kernel Primitive API)。使用 Kernel Primitive API 进行 Kernel 开发可以更加专注计算逻辑的实现,在保证性能的同时大幅减少代码量,同时实现了算子计算与硬件解耦。

分布式

  • 混合并行:在静态图已有 4D 混合并行的基础上,进行了流水线执行器等性能优化,千亿模型下训练算力利用达到GPU理论性能峰值的51%;动态图支持了 4D 混合并行能力,千亿模型下功能和性能与静态图持平;增加了自动补全、自动切分等基础功能,具备了基于用户标记的半自动并行能力。
  • GPU 参数服务器:千亿模型下,优化数据读取、GPU-PS 构建、SSD 性能,完善流水线等功能,使得整体性能提升一倍,内存占用减少一倍,一台 GPU 机器可替代百台 CPU 机器训练千亿模型。

推理部署

  • 推理加速:支持最新的 TensorRT 8.x,适配 Nvidia 的硬件新特性进行加速。
  • 推理易用性:增加 TensorRT 子图中的动态 Shape 配置的自动推导功能,可选从数据推导出 Shape 的范围,无需琐碎的手动配置,简化了动态 Shape 的使用。

2. 不兼容升级

  • 针对 grad 在路径(paddle.autograd,grad, paddle.grad) 公开暴露的问题,推荐使用 paddle.grad,移除了 from paddle.autograd import * ,然后直接调用 grad 的方式。(#35579)
2.1 2.2
>>> import paddle
>>> from paddle.autograd import *
>>> x = paddle.ones(shape=[1], dtype='float32')
>>> x.stop_gradient = False
>>> y = x*x
>>> grad(outputs=[y], inputs=[x])
[Tensor(shape=[1], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
        [2.])]
>>> import paddle
>>> from paddle.autograd import *
>>> x = paddle.ones(shape=[1], dtype='float32')
>>> x.stop_gradient = False
>>> y = x*x
>>> grad(outputs=[y], inputs=[x])
NameError: name 'grad' is not defined
>>> paddle.grad(outputs=[y], inputs=[x]) # 改用paddle.grad API
[Tensor(shape=[1], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
       [2.])]
  • Tensor.__setitem__ 不再支持非 int 类型的 slice 索引( x[start:stop:step] = value )。由于 float类型在作为索引时不具有数学意义( 如 start 为 0.5 时如何确定具体索引的位置)且容易导致一些未知行为,所以本次更新中我们把 slice 索引的数据类型限定为 int,使用 float 的 slice 索引将报错。(#35701)
2.1 2.2
>>> import paddle
>>> x = paddle.to_tensor([1, 2, 3, 4])
>>> start = paddle.zeros([1])
>>> stop = paddle.zeros([1]) + 2
>>> step = paddle.ones([1])
>>> x[start:stop:step] = 0 # start,stop,step 支持float类型Tensor
>>> x 
>>> import paddle
>>> x = paddle.to_tensor([1, 2, 3, 4])
>>> start = paddle.zeros([1])
>>> stop = paddle.zeros([1]) + 2
>>> step = paddle.ones([1])
>>> x[start:stop:step] = 0
ValueError: (InvalidArgument) Currently, the type of tensor in slice indices only allows int32 and int64, please check the type of index tensor.

>>> # 须改为如下代码:
>>> start = paddle.zeros([1], dtype='int32')
>>> stop = paddle.zeros([1], dtype='int32') + 2
>>> step = paddle.ones([1], dtype='int32')
>>> x[start:stop:step] = 0 # start,stop,step 必须为integer类型Tensor
>>> x
Tensor(shape=[4], dtype=int64, place=CUDAPlace(0), stop_gradient=True,
       [0, 0, 3, 4])
  • 为动态图Tensor.__setitem__ 中加入 inplace 调用合法性检测,不满足检测的赋值代码会报错(检测逻辑:当 Tensor 为叶节点并且stop_gradientFalse 时,Tensor 赋值操作将被拦截并报错)。由于 tensor[index]=value的执行会覆盖 Tensor 中原来的值,是 Tensor 的 inplace 操作,如果 Tensor 是计算图中的一个叶节点并且需要计算梯度时,进行 Tensor 的赋值操作会使该 Tensor 反向梯度的计算出现问题,属于非法的 inplace 操作。所以本次更新加入了对这种操作的检测与拦截,当前使用 tensor[index]=value 方式赋值的代码都会检测是否满足 inplace 操作的要求,不满足将会报错。 (#35701)
    • 示例:使用weight[index]=value方式的参数初始化代码调整,self.weight属于叶节点且需要计算梯度,不能使用inplace操作(会影响反向梯度值计算),但初始化赋值本身不需要反向计算过程,所以在明确不需要反向计算时,可以使用no_grad关闭梯度计算后再进行赋值。
2.1 2.2
>>> import paddle
>>> class MyLayer(paddle.nn.Layer):
...     def __init__(self):
...         super(MyLayer, self).__init__()
...         self.weight = self.create_parameter(...)
...         self.weight[index] = 1.0
...
>>> import paddle
class MyLayer(paddle.nn.Layer):
...     def __init__(self):
...         super(MyLayer, self).__init__()
...         self.weight = self.create_parameter(...)
...         with paddle.no_grad(): # 关闭梯度计算后可进行赋值
...             self.weight[index] = 1.0
  • 针对paddle.sum 输入类型为 bool 时,输出类型也为bool,行为与numpy.sum 不一致问题,进行了不兼容升级,升级后输出类型为int64,与 numpy.sum 保持一致。(#34313)
2.1 2.2
>>> import paddle
>>> import numpy as np
>>> np_arr = np.ones((2, 3), dtype='bool')
>>> pd_arr = paddle.to_tensor(np_arr)
>>> pd_sum = pd_arr.sum(0)
>>> pd_sum.dtype
paddle.bool
>>> import paddle
>>> import numpy as np
>>> np_arr = np.ones((2, 3), dtype='bool')
>>> pd_arr = paddle.to_tensor(np_arr)
>>> pd_sum = pd_arr.sum(0)
>>> pd_sum.dtype
paddle.int64
  • 针对paddle.to_tensor在输入 dataTensor 时不拷贝 Tensor 导致 stop_gradient 属性可能被错误修改的问题,优化了该情况下的 Tensor 拷贝行为。原实现中,当 dataTensordtypeplace 不改变时,会直接返回 data(即不发生拷贝)并修改 data.stop_gradient 属性。该行为会导致原来的计算图 data 的反向传播出现问题。新实现中,上述情况下,paddle.to_tensor 会拷贝一个新的 Tensor 且返回,不会修改原 datastop_gradient 属性。(#33335)
2.1 2.2
>>> import paddle
>>> x = paddle.rand([2,3])
>>> x.stop_gradient = False
>>> y = paddle.to_tensor(x)
>>> print(id(x) == id(y)) # True
>>> print(x.stop_gradient, y.stop_gradient) # True True
>>> import paddle
>>> x = paddle.rand([2,3])
>>> x.stop_gradient = False
>>> y = paddle.to_tensor(x)
>>> print(id(x) == id(y)) # False
>>> print(x.stop_gradient, y.stop_gradient) # False True

3. 训练框架(含分布式)

(1)新功能

API

  • 新增线性代数计算APIpaddle.linalg.*

  • 新增 paddle.linalg.svd,支持对多维 Tensor 进行奇异值分解。(#34953)

    • 新增 paddle.linalg.cond,支持根据范数种类 p 计算一个或一批矩阵的条件数。(#35140)
    • 新增 paddle.linalg.matrix_rank,支持计算多维矩阵 Tensor的秩。 (#34823)
    • 新增 paddle.linalg.eigvals,支持计算一般方阵的特征值。 (#35720, #35909)
    • 新增 paddle.linalg.eigh,支持计算复数厄米特矩阵或者实数对称矩阵的特征值和特征向量。(#34990, #35916, #35812, #36091,#35919)
    • 新增 paddle.linalg.det, 支持计算多维矩阵的行列式值。(#34992)
    • 新增 paddle.linalg.slogdet,支持计算多维矩阵行列式值的符号值与自然对数值。(#34992)
    • 新增 paddle.linalg.pinv,支持计算多维矩阵 Tensor 的伪逆矩阵。(#35804)
    • 新增 paddle.linalg.multi_dot,支持多个矩阵连乘的计算。(#35224)
    • 新增 paddle.linalg.solve,支持计算线性方程组的解。(#35715)
    • 新增paddle.linalg.matrix_power,支持矩阵的幂运算操作。(#34667)
    • 新增paddle.linalg.eigvalsh,用于计算厄米特矩阵或者实数对称矩阵的特征值。(#36680)
    • 新增paddle.linalg.eig,用于计算一般方阵的特征值和特征向量。(#35674)
    • 新增paddle.linalg.qr,用于计算矩阵的QR分解(暂不支持反向)。(#36627)
  • 新增傅里叶变换相关API (#35665)

    • 新增快速傅立叶变换系列函数

      • 可微分的 1d 到 nd 复数到复数快速傅里叶变换。(paddle.fft.fft, paddle.fft.fft2, paddle.fft.fftn, paddle.fft.ifft, paddle.fft.ifft2, paddle.fft.ifftn)
      • 可微分的 1d 到 nd 实数到复数快速傅里叶变换。(paddle.fft.rfft, paddle.fft.rfft2, paddle.fft.rfftn, paddle.fft.ihfft, paddle.fft.ihfft2, paddle.fft.ihfftn)
      • 可微分的 1d 到 nd 复数到实数快速傅里叶变换。 (paddle.fft.hfft, paddle.fft.hfft2, paddle.fft.hfftn, paddle.fft.irfft, paddle.fft.irfft2, paddle.fft.irfftn)
      • fft 相关的辅助函数。(paddle.fft.fftfreq, paddle.fft.rfftfreq, paddle.fft.fftshift, paddle.fft.ifftshift)
    • 新增短时傅里叶变换相关函数

      • 短时傅里叶变换。(paddle.signal.stft)
      • 短时傅里叶逆变换。(paddle.signal.istft)
  • 新增高层API
    - 新增 paddle.vision.ops.roi_poolpaddle.vision.ops.RoIPool,支持检测任务中 RoI 区域池化操作。 (#36154)
    - 新增 paddle.vision.ops.roi_alignpaddle.vision.ops.RoIAlign,支持检测任务中 RoI 区域 Align 操作。(#36207)
    - 新增 paddle.vision.ops.psroi_pool 和 ``paddle.vi...

Read more

PaddlePaddle 2.2.0-rc0 Release Note

21 Oct 10:49
c576169
Compare
Choose a tag to compare

English Version

1. 重要更新

我们很高兴的发布飞桨框架2.2.0-rc0版本,本版本包含如下重要更新。

API

  • 新增100+个API,包含24个傅里叶变换API、14个线性代数计算 API 等,更好地支持科学计算类、信号处理类模型。
  • 新增多种索引类型的支持,新增的索引类型包括:省略号(…)、维度扩增(None)、布尔类型数组(Bool Mask)、整数数组((list),以及张量(Tensor) ),可以更加方便的对张量(Tensor)进行操作。
  • 新增 paddle.einsum API,可以以更加简洁的方式来表达多维张量(Tensor)的计算。
  • 动态图混合精度功能增强,新增整个任务使用半精度(float16)训练的方式,主要任务下的计算效率提升20%左右。

IR(Intermediate Representation)

  • 动态图转静态图:进一步扩充了动静转换支持的语法和场景,现在使用混合精度训练的动态图模型也可以通过 to_static 接口一键转换为静态图进行训练或推理部署;另外,对转换后训练的性能进行了优化,通过引入缓存和开启 Pass 等策略,转换后的训练性能相对动态图方式有明显提升。
  • Pass 开发:新增 Python 端对静态图IR的改写接口,针对 OP fusion 等子图替换场景可以在 python 中快速完成开发。
  • 对算子 Kernel 实现中的底层代码进行了抽象与功能封装,提供高性能的 Block 级 IO 运算和 Compute 运算(Kernel Primitive API)。使用 Kernel Primitive API 进行 Kernel 开发可以更加专注计算逻辑的实现,在保证性能的同时大幅减少代码量,同时实现了算子计算与硬件解耦。

分布式

  • 混合并行:在静态图已有 4D 混合并行的基础上,进行了流水线执行器等性能优化,千亿模型下训练算力利用达到GPU理论性能峰值的51%;动态图支持了 4D 混合并行能力,千亿模型下功能和性能与静态图持平;增加了自动补全、自动切分等基础功能,具备了基于用户标记的半自动并行能力。
  • GPU 参数服务器:千亿模型下,优化数据读取、GPU-PS 构建、SSD 性能,完善流水线等功能,使得整体性能提升一倍,内存占用减少一倍,一台 GPU 机器可替代百台 CPU 机器训练千亿模型。

推理部署

  • 推理加速:支持最新的 TensorRT 8.x,适配 Nvidia 的硬件新特性进行加速。
  • 推理易用性:增加 TensorRT 子图中的动态 Shape 配置的自动推导功能,可选从数据推导出 Shape 的范围,无需琐碎的手动配置,简化了动态 Shape 的使用。

2. 不兼容升级

  • 针对 grad 在路径(paddle.autograd,grad, paddle.grad) 公开暴露的问题,推荐使用 paddle.grad,移除了 from paddle.autograd import * ,然后直接调用 grad 的方式。(#35579)
2.1 2.2
>>> import paddle
>>> from paddle.autograd import *
>>> x = paddle.ones(shape=[1], dtype='float32')
>>> x.stop_gradient = False
>>> y = x*x
>>> grad(outputs=[y], inputs=[x])
[Tensor(shape=[1], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
        [2.])]
>>> import paddle
>>> from paddle.autograd import *
>>> x = paddle.ones(shape=[1], dtype='float32')
>>> x.stop_gradient = False
>>> y = x*x
>>> grad(outputs=[y], inputs=[x])
NameError: name 'grad' is not defined
>>> paddle.grad(outputs=[y], inputs=[x]) # 改用paddle.grad API
[Tensor(shape=[1], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
       [2.])]
  • Tensor.__setitem__ 不再支持非 int 类型的 slice 索引( x[start:stop:step] = value )。由于 float类型在作为索引时不具有数学意义( 如 start 为 0.5 时如何确定具体索引的位置)且容易导致一些未知行为,所以本次更新中我们把 slice 索引的数据类型限定为 int,使用 float 的 slice 索引将报错。(#35701)
2.1 2.2
>>> import paddle
>>> x = paddle.to_tensor([1, 2, 3, 4])
>>> start = paddle.zeros([1])
>>> stop = paddle.zeros([1]) + 2
>>> step = paddle.ones([1])
>>> x[start:stop:step] = 0 # start,stop,step 支持float类型Tensor
>>> x 
>>> import paddle
>>> x = paddle.to_tensor([1, 2, 3, 4])
>>> start = paddle.zeros([1])
>>> stop = paddle.zeros([1]) + 2
>>> step = paddle.ones([1])
>>> x[start:stop:step] = 0
ValueError: (InvalidArgument) Currently, the type of tensor in slice indices only allows int32 and int64, please check the type of index tensor.

>>> # 须改为如下代码:
>>> start = paddle.zeros([1], dtype='int32')
>>> stop = paddle.zeros([1], dtype='int32') + 2
>>> step = paddle.ones([1], dtype='int32')
>>> x[start:stop:step] = 0 # start,stop,step 必须为integer类型Tensor
>>> x
Tensor(shape=[4], dtype=int64, place=CUDAPlace(0), stop_gradient=True,
       [0, 0, 3, 4])
  • 为动态图Tensor.__setitem__ 中加入 inplace 调用合法性检测,不满足检测的赋值代码会报错(检测逻辑:当 Tensor 为叶节点并且stop_gradientFalse 时,Tensor 赋值操作将被拦截并报错)。由于 tensor[index]=value的执行会覆盖 Tensor 中原来的值,是 Tensor 的 inplace 操作,如果 Tensor 是计算图中的一个叶节点并且需要计算梯度时,进行 Tensor 的赋值操作会使该 Tensor 反向梯度的计算出现问题,属于非法的 inplace 操作。所以本次更新加入了对这种操作的检测与拦截,当前使用 tensor[index]=value 方式赋值的代码都会检测是否满足 inplace 操作的要求,不满足将会报错。 (#35701)
    • 示例:使用weight[index]=value方式的参数初始化代码调整,self.weight属于叶节点且需要计算梯度,不能使用inplace操作(会影响反向梯度值计算),但初始化赋值本身不需要反向计算过程,所以在明确不需要反向计算时,可以使用no_grad关闭梯度计算后再进行赋值。
2.1 2.2
>>> import paddle
>>> class MyLayer(paddle.nn.Layer):
...     def __init__(self):
...         super(MyLayer, self).__init__()
...         self.weight = self.create_parameter(...)
...         self.weight[index] = 1.0
...
>>> import paddle
class MyLayer(paddle.nn.Layer):
...     def __init__(self):
...         super(MyLayer, self).__init__()
...         self.weight = self.create_parameter(...)
...         with paddle.no_grad(): # 关闭梯度计算后可进行赋值
...             self.weight[index] = 1.0
  • 针对paddle.sum 输入类型为 bool 时,输出类型也为bool,行为与numpy.sum 不一致问题,进行了不兼容升级,升级后输出类型为int64,与 numpy.sum 保持一致。(#34313)
2.1 2.2
>>> import paddle
>>> import numpy as np
>>> np_arr = np.ones((2, 3), dtype='bool')
>>> pd_arr = paddle.to_tensor(np_arr)
>>> pd_sum = pd_arr.sum(0)
>>> pd_sum.dtype
paddle.bool
>>> import paddle
>>> import numpy as np
>>> np_arr = np.ones((2, 3), dtype='bool')
>>> pd_arr = paddle.to_tensor(np_arr)
>>> pd_sum = pd_arr.sum(0)
>>> pd_sum.dtype
paddle.int64
  • 针对paddle.to_tensor在输入 dataTensor 时不拷贝 Tensor 导致 stop_gradient 属性可能被错误修改的问题,优化了该情况下的 Tensor 拷贝行为。原实现中,当 dataTensordtypeplace 不改变时,会直接返回 data(即不发生拷贝)并修改 data.stop_gradient 属性。该行为会导致原来的计算图 data 的反向传播出现问题。新实现中,上述情况下,paddle.to_tensor 会拷贝一个新的 Tensor 且返回,不会修改原 datastop_gradient 属性。(#33335)
2.1 2.2
>>> import paddle
>>> x = paddle.rand([2,3])
>>> x.stop_gradient = False
>>> y = paddle.to_tensor(x)
>>> print(id(x) == id(y)) # True
>>> print(x.stop_gradient, y.stop_gradient) # True True
>>> import paddle
>>> x = paddle.rand([2,3])
>>> x.stop_gradient = False
>>> y = paddle.to_tensor(x)
>>> print(id(x) == id(y)) # False
>>> print(x.stop_gradient, y.stop_gradient) # False True

3. 训练框架(含分布式)

(1)新功能

API

  • 新增线性代数计算APIpaddle.linalg.*

  • 新增 paddle.linalg.svd,支持对多维 Tensor 进行奇异值分解。(#34953)

    • 新增 paddle.linalg.cond,支持根据范数种类 p 计算一个或一批矩阵的条件数。(#35140)
    • 新增 paddle.linalg.matrix_rank,支持计算多维矩阵 Tensor的秩。 (#34823)
    • 新增 paddle.linalg.eigvals,支持计算一般方阵的特征值。 (#35720, #35909)
    • 新增 paddle.linalg.eigh,支持计算复数厄米特矩阵或者实数对称矩阵的特征值和特征向量。(#34990, #35916, #35812, #36091,#35919)
    • 新增 paddle.linalg.det, 支持计算多维矩阵的行列式值。(#34992)
    • 新增 paddle.linalg.slogdet,支持计算多维矩阵行列式值的符号值与自然对数值。(#34992)
    • 新增 paddle.linalg.pinv,支持计算多维矩阵 Tensor 的伪逆矩阵。(#35804)
    • 新增 paddle.linalg.multi_dot,支持多个矩阵连乘的计算。(#35224)
    • 新增 paddle.linalg.solve,支持计算线性方程组的解。(#35715)
    • 新增paddle.linalg.matrix_power,支持矩阵的幂运算操作。(#34667)
  • 新增傅里叶变换相关API (#35665)

    • 新增快速傅立叶变换系列函数

      • 可微分的 1d 到 nd 复数到复数快速傅里叶变换。(paddle.fft.fft, paddle.fft.fft2, paddle.fft.fftn, paddle.fft.ifft, paddle.fft.ifft2, paddle.fft.ifftn)
      • 可微分的 1d 到 nd 实数到复数快速傅里叶变换。(paddle.fft.rfft, paddle.fft.rfft2, paddle.fft.rfftn, paddle.fft.ihfft, paddle.fft.ihfft2, paddle.fft.ihfftn)
      • 可微分的 1d 到 nd 复数到实数快速傅里叶变换。 (paddle.fft.hfft, paddle.fft.hfft2, paddle.fft.hfftn, paddle.fft.irfft, paddle.fft.irfft2, paddle.fft.irfftn)
      • fft 相关的辅助函数。(paddle.fft.fftfreq, paddle.fft.rfftfreq, paddle.fft.fftshift, paddle.fft.ifftshift)
    • 新增短时傅里叶变换相关函数

      • 短时傅里叶变换。(paddle.signal.stft)
      • 短时傅里叶逆变换。(paddle.signal.istft)
  • 新增高层API
    - 新增 paddle.vision.ops.roi_poolpaddle.vision.ops.RoIPool,支持检测任务中 RoI 区域池化操作。 (#36154)
    - 新增 paddle.vision.ops.roi_alignpaddle.vision.ops.RoIAlign,支持检测任务中 RoI 区域 Align 操作。(#36207)
    - 新增 paddle.vision.ops.psroi_poolpaddle.vision.ops.PSRoIPool,支持检测任务中位置敏感的 RoI 区域池化操作。 (#36111)
    - 新增 paddle.vision.models.vgg19 预训练权重。 (#35788)
    - 新增 paddle.vision.datasets.* 中数据集 API 下载进度条。(#33302)
    - 新增 paddle.Model.predict 参数 verbose,支持是否显示日志。...

Read more

PaddlePaddle 2.1.3 Release Note

11 Oct 02:04
06d47ff
Compare
Choose a tag to compare

本版本主要是对2.1.2中的部分问题的修复,重点如下:

  • 新增 paddle.disable_signal_handler 支持关闭 Paddle 中信号捕捉机制,从而支持同时使用Paddle与TVM(#35366)。
  • 修复 paddle.flatten 在静态图使用下编译期计算维度错误的问题(#35398)。