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 |
---|---|
|
|
Tensor.__setitem__
不再支持非int
类型的 slice 索引(x[start:stop:step] = value
)。由于float
类型在作为索引时不具有数学意义( 如start
为 0.5 时如何确定具体索引的位置)且容易导致一些未知行为,所以本次更新中我们把 slice 索引的数据类型限定为int
,使用float
的 slice 索引将报错。(#35701)
2.1 | 2.2 |
---|---|
|
|
- 为动态图
Tensor.__setitem__
中加入 inplace 调用合法性检测,不满足检测的赋值代码会报错(检测逻辑:当Tensor
为叶节点并且stop_gradient
为False
时,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 |
---|---|
|
|
- 针对
paddle.sum
输入类型为bool
时,输出类型也为bool
,行为与numpy.sum
不一致问题,进行了不兼容升级,升级后输出类型为int64
,与numpy.sum
保持一致。(#34313)
2.1 | 2.2 |
---|---|
|
|
- 针对
paddle.to_tensor
在输入data
为Tensor
时不拷贝Tensor
导致stop_gradient
属性可能被错误修改的问题,优化了该情况下的Tensor
拷贝行为。原实现中,当data
为Tensor
且dtype
和place
不改变时,会直接返回data
(即不发生拷贝)并修改data.stop_gradient
属性。该行为会导致原来的计算图data
的反向传播出现问题。新实现中,上述情况下,paddle.to_tensor
会拷贝一个新的Tensor
且返回,不会修改原data
的stop_gradient
属性。(#33335)
2.1 | 2.2 |
---|---|
|
|
3. 训练框架(含分布式)
(1)新功能
API
-
新增线性代数计算API
paddle.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
)
- 可微分的 1d 到 nd 复数到复数快速傅里叶变换。(
-
新增短时傅里叶变换相关函数
- 短时傅里叶变换。(
paddle.signal.stft
) - 短时傅里叶逆变换。(
paddle.signal.istft
)
- 短时傅里叶变换。(
-
-
新增高层API
- 新增paddle.vision.ops.roi_pool
和paddle.vision.ops.RoIPool
,支持检测任务中 RoI 区域池化操作。 (#36154)
- 新增paddle.vision.ops.roi_align
和paddle.vision.ops.RoIAlign
,支持检测任务中 RoI 区域 Align 操作。(#36207)
- 新增paddle.vision.ops.psroi_pool
和paddle.vision.ops.PSRoIPool
,支持检测任务中位置敏感的 RoI 区域池化操作。 (#36111)
- 新增paddle.vision.models.vgg19
预训练权重。 (#35788)
- 新增paddle.vision.datasets.*
中数据集 API 下载进度条。(#33302)
- 新增paddle.Model.predict
参数verbose
,支持是否显示日志。(#33405)
- 新增paddle.hub
下载选项wget
方式。(#33379)
- 新增paddle.Model
动态图模式下梯度累加功能。(#32702)
- 新增paddle.Model.fit
和paddle.Model.evaluate
动态图模式下num_iters
参数,控制训练迭代轮数。(#33986)
- 新增paddle.vision.ops.yolo_box
参数iou_aware
和iou_aware_factor
,支持 YoloBox 使用预测的 IOU 作为置信度的因子。(#33400)
- 新增paddle.summary
参数input
,支持给定输入。(#34165)
- 新增paddle.text.viterbi_decode
,支持动态图下CPU、GPU的Viterbi解码功能。(#35778) -
新增组网类 API
- 新增
paddle.nn.functional.sparse_attention
,用于计算稀疏的Transformer Attention模块。(#35757) - 新增
paddle.nn.MaxUnPool2D
和paddle.nn.functional.max_unpool2d
,支持根据输入的input和最大值位置计算出池化的逆结果。(#35056) - 新增
paddle.nn.functional.gumbel_softmax
,支持gumbel softmax
采样。(#35506, #36065, #36094) - 新增
paddle.nn.functional.class_center_sample
,支持 PartialFC 类中心采样功能。(#34106) - 新增
paddle.nn.functional.margin_cross_entropy
,支持 ArcFace,CosFace,SphereFace 等 MarginLoss 功能。(#34247) paddle.nn.AvgPool2D
支持二阶导数。(#35388)paddle.nn.Linear、paddle.matmul、paddle.mm
支持二阶导数。#35428paddle.nn.GroupNorm
支持 (N, C, *) 形式的输入。(#34773)- 新增
paddle.nn.BatchNorm1D/2D/3D
在x.stop_gradient=True
的条件下计算反向。(#34102) - 新增
paddle.nn.Dropout, paddle,nn.Dropout2D/3D
在model.eval
模式下计算反向 。(#35122)
- 新增
-
新增硬件相关API
- 新增
paddle.device.cuda.Stream
,paddle.device.cuda.Event
,paddle.device.cuda.current_stream
,paddle.device.cuda.synchronize
, 支持在Python端对CUDA的event和 stream进行同步操作。(#32460) - 新增
paddle.device.cuda.device_count
,支持返回当前可用GPU数量。(#34811) - 新增
paddle.device.cuda.empty_cache
,支持清理空闲的显存。(#35427) - 新增
paddle.device.cuda.get_device_properties
,支持返回给定的设备属性。(#35875) - 新增
paddle.device.cuda.stream_guard
,用于动态图下 CUDA Stream的灵活切换。(#35623) - 新增
paddle.device.cuda.get_device_name
,支持返回给定设备的名称。(#36172) - 新增
paddle.device.cuda.get_device_capability
,支持返回给定设备计算能力的版本号。(#36172) - 新增
paddle.framework.core.async_read
和paddle.framework.core.async_write
,可支持非默认 CUDAStream
下CUDAPinnedPlace
和CUDAPlace
的Tensor
数据异步读写。(#36501)
- 新增
-
新增Tensor操作API
-
新增
paddle.tensordot
,支持对高维张量做缩并(Tensor Contraction)运算。(#36454) -
新增
paddle.bincount
,支持对一维张量内元素进行计数。(#36709) -
新增
paddle.broadcast_tensors
,支持对一组Tensor
进行广播操作。(#33294, #34874) -
新增
paddle.einsum
。(#33821) -
增强
paddle.tensor.gradient
接口,支持sigmoid_op的二阶求导算子。(#32971) -
新增
paddle.searchsorted
,支持在有序Tensor
中查找给定值的索引。(#35159) -
新增
paddle.unique_consecutive
,支持将Tensor
中连续重复的元素进行去重,返回连续不重复的Tensor
。(#34334) -
新增
paddle.diagflat
,支持返回以输入Tensor
的元素为对角线的对角矩阵。(#33334) -
新增
paddle.lgamma
,支持逐元素计算Tensor
的lgamma
函数值。(#33913) -
新增
paddle.digamma
,支持逐元素计算Tensor
的digamma
函数值。(#33278) -
新增
paddle.neg
,支持逐元素计算Tensor
的相反数值。(#33248) -
新增
paddle.cumprod
,支持根据给定维度计算Tensor
累乘。(#35185) -
新增
paddle.atan2
,支持逐元素的arctangent
运算,通过符号确定象限。(#33067) -
新增
paddle.expm1
,支持逐元素进行以exp(x)-1
运算。 (#33066) -
新增
paddle.trunc
,支持对输入的Tensor
进行截断整数值。(#33371) -
新增
paddle.diagonal
,支持提取输入的Tensor
的对角线元素。 (#33586) -
新增
paddle.utils.dlpack
,包含:paddle.utils.dlpack.to_dlpack
和paddle.utils.dlpack.from_dlpack
,利用DLPack
支持不同框架间的Tensor
传输。(#35067) -
新增
paddle.Tensor.uniform_
, 支持使用服从均匀分布的随机数原地填充一个Tensor
。(#33394) -
新增
paddle.Tensor.T
,对 N-D Tensor 会进行转置,返回一个与原 Tensor 的shape相反的Tensor。(#35379) -
新增
paddle.Tensor
魔法操作符:&(按位与)、| (按位或)、^ (按位异或)、~(按位取反)。 (#33524) -
新增
paddle.Tensor.fill_
、paddle.Tensor.zero_
,原地修改Tensor中的值,分别使用固定值填充、使用全零填充。(#33829) -
新增
paddle.Tensor.fill_diagonal
、paddle.Tensor.fill_diagonal
,修改Tensor对角线元素值。(#34460) -
新增
paddle.Tensor.fill_diagonal_tensor_
,对Tensor两个指定坐标轴的对角线与其他坐标轴形成的子Tensor进行整体修改。(#34515) -
动静态图
Tensor
新增多种索引类型的支持,包括:省略号(...)、维度扩增(None)、布尔类型数组(Bool Mask)、整数数组(list)以及张量(Tensor)。 -
新增分布式相关API
- 新增
paddle.distributed.utils.global_scatter
和paddle.distributed.utils.global_gather
,支持 MOE 有条件分发数据,global_scatter
会根据条件将数据分发到所有卡上,然后global_gather
则会将数据根据条件从所有 GPU 卡上收集数据。(#35546)
- 新增
-
新增其他的API
- 新增
paddle.disable_signal_handler
,支持关闭PaddlePaddle中信号捕捉机制,从而使得用户可以同时使用Paddle与TVM。(#34577) - 新增
paddle.incubate.softmax_mask_fuse
,支持加速 Transformer 架构的 softmax 与 mask 的运算速度。(#33841) - 新增
paddle.incubate.softmax_mask_fuse_upper_triangle
,支持加速 GPT 版本的 Transformer 架构的 softmax 与 mask 的运算速度。(#33981) - 新增
paddle.static.ExponentialMovingAverage
,支持用指数衰减计算参数的滑动平均值。(#35673) - 新增
paddle::Tensor::slice
C++ API, 支持 slice 操作,允许用户对外部 Tensor 切片操作。(#34227) - 新增
paddle.incubate.segment_*
系列API,包含paddle.incubate.segment_sum, paddle.incubate.segment_mean, paddle.incubate.segment_max, paddle.incubate.segment_min
。支持对Tensor
按照分段求和、求均值、求最大值、求最小值。 (#35759) - 新增
paddle.version.cuda
和paddle.version.cudnn
,用于获取 paddle 安装包所使用的CUDA
和cuDNN
的版本号。(#36556)
- 新增
IR(Intermediate Representation)
-
动态图转静态图
-
Program和Graph互转 :
Program
和Graph
是 飞桨框架底层用来表达计算的中间表示,对于飞桨的开发者而言,有时需要将Program
和Graph
互相转化来进行计算处理。本功能添加了Program
和Graph
互转相关能力。- 开发完善
Program
和Graph
相互转换功能。 (#33949) - 为了支持
while
等控制流节点,飞桨框架的Program
中除了主block
外,还可能包含多个子block
。之前Program
转Graph
的过程中,只将主block
转化为Graph
,这里改进Graph
,支持表达子block
,实现完整的Program
转Graph
。(#33320) - 提供分析
Program
中控制流需要的依赖辅助函数。 (#33439) Program
和Graph
相互转换后保留训练所需要的stop_gradient
,persistable
属性值。(#33771)- 原
Pass
只处理主Graph
,忽略子图,现Pass
支持处理主Graph
及其所有子图。 (#34158) - 处理了在预测情况下
Program
和Graph
互转的一些拓扑排序问题。(#34121, #34521)
- 开发完善
-
Pass开发
-
Kernel Primitive API
- 对算子 Kernel 实现中的底层代码进行了抽象与功能封装,提供高性能的 Block 级 IO 运算和 Compute 运算。使用 Kernel Primitive API 进行 Kernel 开发可以更加专注计算逻辑的实现,在保证性能的同时大幅减少代码量,同时实现了算子计算与硬件解耦。(#34672, #35075, #34456, #35282, #35743, #34208)
- 在 Kernel Primitive API中添加一元和二元计算Functor共13个。 (#36418)
- 修改 Kernel Primitive API 中 ReadData 实现方式,修复
NX !=1
访存越界的问题。 (#36373)
混合精度训练
- 动态图混合精度功能增强,新增整个任务使用半精度(float16)训练的方式,主要任务下的计算效率提升20%左右。 (#35521)
- 动态图混合精度
paddle.amp.GradScaler
新增get
和set
方法,方便用户设置。(#33835) - 动态图混合精度
paddle.amp.GradScaler
新增state_dict
和load_state_dict
方法。 (#34300) - 动态图混合精度拆分
minimize
为step
+update
;并新增unscale
方法。 (#35927) - 动态图混合精度训练支持 param group。(#34899)
- 静态图混合精度训练支持梯度裁剪。 (#33565)
分布式训练
-
分布式训练基础功能
- 新增
paddle.DataParallel.no_sync
,实现动态图数据并行下暂停多卡通信和梯度同步。(#34740) - 新增
paddle.distributed.launch
启动方式对容错的支持,实现collective
模式下的节点容错功能。 (#33369, #34572) - 分布式训练API
paddle.static.Executor.train_from_dataset, paddle.static.Executor.infer_from_dataset
新增dump功能训练过程中模型的参数和中间变量的功能。#34457 - 混合并行支持模型并行与数据并行的组合。(#34377)
- 新增分布式策略
gradient scale
选项,用户可以指定gradient scale
的方式:avg
、sum
或者自定义。(#33862) - 新增
paddle.distributed.parallel_with_gloo
,支持 CPU barrier 操作。(#34671) - GPU 参数服务器新增训练 profiler 功能。(#32640)
- GPU 参数服务器新增流水线功能,训练性能提升可40%。#33159
- 静态图混合并行添加
dp_as_optimizer_sharding
实验性功能,可将数据并行作为优化器参数分片并行,节约优化器状态显存占用。(#35593) - 静态图流水线并行执行器支持
LRScheduler
。(#34402) - 新增
paddle.fluid.core.GraphPyClient.set_node_feat
,支持用户在图引擎客户端设置图节点特征,支持多种类型特征存储。(#34994) - 提升图引擎图节点邻居采样算法的性能,优化图游走算法的执行。(#34088)
- 模型并行接口
paddle.distributed.fleet.meta_parallel.ColumnParallelLinear
、paddle.distributed.fleet.meta_parallel.RowParallelLinear
、paddle.distributed.fleet.meta_parallel.VocabParallelEmbedding
、paddle.distributed.fleet.meta_parallel.ParallelCrossEntropy
实现动静统一。(#33700, #33411) - 新增分布式模型并行cpu
c_embedding
op。(#35467) - 已修改为新增分布式通信初始化阶段gen_comm_id时得到 gethostbyname 的重试机制。(#34855)
- 新增
fleet
梯度更新时的开关配置scale_sparse_gradient_with_batch_size
,决定梯度是否乘以batch_size
。 (#34893)
- 新增
-
动态图混合并行
- 在动态图分布式数据并行场景下,新增
paddle.distributed.fleet.dygraph_optimizer.DygraphShardingOptimizer
接口,通过在不同卡间切分优化器状态优化显存占用,支持更大的模型或batch size。 (#33633) - 动态图 Sharding 支持 MP-PP-DP, 实现动态图 4D 混合并行。(#35580)
- 动态图 Recompute 支持混合精度计算。(#33251)
- 流水线并行支持 1f1b 调度策略,用于节约运行期显存。(#34483)
- 动态图3D混合并行支持 recompute 策略,支持offload功能。 (#34607 #35588)
- 动态图3D混合并行支持模型保存和加载。 (#34768)
- 针对模型并行+流水线并行场景,新增scatter-gather方案,优化跨机通信性能。 (#34130)
- 流水线并行支持根据 Layer 数量的切分方式,保证切分更加均衡。 (#34207)
- 流水线并行支持自动混合精度。(#33951)
- 流水线并行添加
paddle.distributed.fleet.meta_parallel.SharedLayerDesc
的组网描述, 用于支持参数共享的组网方式。(#33578) - 张量并行添加
paddle.distributed.fleet.meta_parallel.ParallelCrossEntropy
,支持交叉熵Loss的张量并行计算方式。(#33401) paddle.DataParallel
添加find_unused_parameters
接口,用于数据并行模式下,支持模型中使用控制流的情况。(#32826)- 数据并行模式添加端口等待功能,解决端口冲突问题。(#34207)
- 在动态图分布式数据并行场景下,新增
-
静态图混合并行
-
自动并行
其他
-
模型量化
-
自定义OP
- 新增自定义算子 DCU 后端支持。(#34050)
-
Cost Model
- 新增 Paddle CostModel,实现通过 Profiler 获取 op 时间 cost 的方法。 (#35774)
-
模型保存与载入
- 新增通过
paddle.jit.save
接口直接将 Layer 的非 forward 成员方法及相关参数保存为推理模型的功能。 (#34070)
- 新增通过
-
ONNX Exporter
- 新增8个算子适配:
softplus
、elementwise_mod
、elementwise_floordiv
、p_norm
、depthwise_transpose
、group_norm
、pixel_shuffle
、top_k
。(Paddle2ONNX#252, Paddle2ONNX#261, Paddle2ONNX#293) - 新增8个检测模型导出:PPYOLO、PPYOLOv2、PPYOLO-Tiny、TTFNet、PAFNet、FCOS、SSD。 (Paddle2ONNX#252)
- 新增8个算子适配:
(2)功能优化
API
paddle.slice
增加对bool
类型Tensor的支持以及优化了报错信息。(#35586, #35179)paddle.strided_slice
新增对TensorArray
类型输入的支持,调整了step<0
时的输出结果,调整后的结果与numpy
保持一致。(#34205, #34172)paddle.multiply
支持bool
数据类型的运算。(#35551)- 逻辑运算(
paddle.logical_not, paddle.logical_and, paddle.logical_or, paddle.logical_xor
)支持非bool
数据类型(int8, int16, int32, int64, float, double
)。(#34141) paddle.transpose
支持bool
类型运算。(#35886)paddle.strided_slice
支持bool
类型运算。(#33373)paddle.set_printoptions
支持设置linewidth
来打印Tensor
。(#35175)paddle.to_tensor
支持LoDTensor
。(#33027)paddle.linalg.det
和paddle.linalg.slogdet
支持反向运算。(#36013)paddle.nn.functional.pad
支持全维度pad时,tuple类型pad参数的输入。 (35985)- 优化
paddle.nn.functional.pad
输入异常时的报错信息。 (34979) - 静态图支持对部分
program
,生成相应的反向program
。(#34395) - oneDNN 功能优化
- Ampere 架构的GPU上支持
bfloat16
数据类型。(#31232, #32221, #32542) - Ampere 架构的GPU上
Conv
算子设置使用 Tensor Core 。(#34409) - 支持
paddle.device.cuda.current_stream().cuda_stream
获取裸指针。(#35813) - 新增
paddle.optimizer.AdamW
GPU fuse kernel 实现,并支持 layerwise learning rate 功能。(#35020, #35569) - 支持在 paddle 中使用Nvidia的cusparse库函数。(#35675)
- 新增
paddle.full
对int16
类型的支持。(#35619) - 优化
paddle.nn.ClipGradByGlobalNorm
的显存占用。(#34586) reduce_sum
算子支持float16类型(#32966)paddle.nn.CTCLoss
新增两种 grad norm 方法norm_by_total_logits_len
和norm_by_batchsize
。(#34729)- 新增各路径下公开API推荐使用路径。(#33313, #33308, #32759, #32695, #32643, #31912, #32650, #32034, #33897)
- 恢复
paddle.vision
路径下原API可访问性。(#34432) paddle.vision.ops.deform_conv2d, paddle.vision.ops.DeformConv2D
新增 double 输入类型支持。 (#35330)paddle.fluid.contrib.layers.shuffle_batch
新增 GPU Kernel实现。#33938- 已有API新增公开调用路径
paddle.linalg.cholesky
,paddle.linalg.norm
,paddle.linalg.inv
。(#33420) paddle.reshape
支持将空Tensor
形变成另一个形状的空Tensor
。(#36087)paddle.equal
第二个输入新增int
、float
和bool
类型的支持。(#35695)paddle.io.DataLoader
新增支持persistent_worker模式。(#34017)- 优化
l2_normalize
,p_norm
,elementwise_max
,prelu
,clip_by_norm
,lars optimizer
算子支持float16计算。 (#35576, #35888, #35888, 35532, #35446, #33280) - 优化flowers数据集的读取速度,从每批次数分钟优化至1~3秒。(#31408)
- 支持
paddle.distributed.fleet.DistributedStrategy
中without_graph_optimize
开关打开后的fuse allreduce sum功能。FP32下性能提升3%,AMP下性能提升8%。(#34446) paddle.matmul
将底层Op算子由matmul op 切换到 matmul_v2 op。 (#36374)paddle.fft
模块添加了 mkl_cdft 和 hipfft 两个计算后端。 (#36537)paddle.roll
的参数shifts
支持Tensor
作为输入。 (#36537)paddle.shape
支持复数类型的输入。(#36835)- matmul_v2 支持量化。(#36469)
- 新增
clip_op
对float16
的支持。 (#36672) paddle.fft
模块为 cufft 后端添加了缓存 plan 的功能,优化性能。(#36537)
IR(Intermediate Representation)
- 动态图转静态图
- 优化动转静报错格式,隐藏框架层不必要的报错栈,添加用户代码报错行定位标识和上下文。(#35365, #35320)
- 优化控制流中
list.append
语法的转换逻辑。(#35212) - 优化了动转静训练代码逻辑,升级内部
Program
缓存机制,新增输入Tensor
的提前 copy 策略,提升训练性能。 (#34181, #33796) - 优化动转静内部执行器显存回收策略,减少训练时显存占用量。 (#34177)
- 集成了
Gast
三方依赖库的源码,解耦了版本依赖。 (#34556) - 动转静报错时显示部分框架层报错信息,使得定位问题更加容易。(#36765)
- 移除动转静报错模块中重复的临时文件删除函数
remove_static_file()
。(#36375) - 优化对RegisterPass中
input_specs
参数处理,支持图优化时作为匹配子图条件。(#36453)
分布式训练
-
分布式训练基础功能
- 增强静态图流水线并行 stage 以及 persist var 的检查。(#34193, #34870, #35453)
- 优化静态图流水线并行,1F1B 调度使显存不随 global batch size 增大而增大。(#34230)
- GPU 参数服务器优化构建阶段 hashmap,构建阶段性能在某些任务上提升可达7倍。(#34175)
- GPU 参数服务器 pull/push 阶段新增多流并行。(#34276)
- GPU 参数服务器支持多机训练模式下,机器间远程拉取参数。(#35396)
- CPU 参数服务器支持 SSD存储。 (#33031)
paddle.io.Dataset
支持动态库解析数据。 (#33969)- 新增
paddle.distributed.fleet.dataset.DatasetBase
中对use_var_list
和pipe_command
生成数据的一致性检查函数。 (#34463) - 新增
paddle.fluid.layers.embedding
的emd
维度与fleet
中sparse table
的emb
维度的一致性检查。 (#34249) - 动态图混合并行支持Pure FP16训练。(#36707)
- 静态图混合并行支持dropout使用固定随机种子生成器,以确保模型并行中全局变量的一致性与局部变量的随机性。(#36682)
‘ - 实现了CPU并行,并支持调用 spawn 或 launch 时可以添加自定义的backend参数。可用的backend选择为 "gloo", "nccl", "bkcl", "auto" ,分别表示CPU并行,GPU并行,XPU并行和按照Paddle版本自动选择。(#35745)
- 优化动态图混合并行 HybridParallelClipGrad 策略,支持4D混合并行+Pure FP16训练。(#36707)
- 添加 SlotRecordDataset 类支持GPU参数服务器训练。(#36710)
- GPU参数服务器构建阶段支持使用SlotRecordDataset。(#36723)
-
静态图混合并行
其他
-
报错调试优化
- 统一第三方库报错信息机制,优化
CURAND、CUDNN、CUBLAS、CUSOLVER、NCCL
五种 CUDA API 的报错信息,使报错内容更加详细与规范。 (#33003, #33743) - 优化 avx 与 no_avx 相关的安装报错信息,简化冗余复杂内容。 (#33818)
- 优化
paddle.nn.functional.gather_tree
,paddle.nn.Transformer
,paddle.nn.TransformerDecoderLayer
,paddle.nn.TransformerEncoderLayer
,paddle.nn.MultiHeadAttention
报错信息。 (#34322, #33859) - 支持在动态图下配置
FLAGS_check_nan_inf
环境变量, 用于模型nan
和inf
的运行时检查与定位。 (#32635) - 移除 Signal 类报错信息中由于捕获 Signal 引入的栈信息,避免误导用户。(#34842 )
- 修复
elementwise
类算子在输入x或y为空 Tensor 时的报错信息。 (#33928)
- 统一第三方库报错信息机制,优化
-
模型保存与载入
-
自定义OP
- 移除
paddle::Tensor
的copy
方法中不必要的cudaStreamSynchronize
操作,以提升性能。(#35802)
- 移除
-
新增C++对GeneratePass开发注册的支持,开发方式与Python侧对齐。(#36302)
-
自动稀疏化训练(Automic SParsity)
- 新增
paddle.static.sparsity
,支持生成n:m
稀疏模式的稀疏参数,目前只支持静态图ASP训练。A100上FP32、FP16分别设置1:2
、2:4
的稀疏模式,训练保存的稀疏模型,可通过调用TensorRT 8利用Ampere架构的稀疏Tensor Core加速推理任务。当前版本共提供了5个API:(#32995、#33132、#33558、#36525) paddle.static.sparsity.calculate_density
,计算输入Tensor的密度。paddle.static.sparsity.decorate
,将给定的优化器包装为OptimizerWithSparsityGuarantee
,在调用optimizer.minimize()
时自动为ASP工作流插入必要的操作。paddle.static.sparsity.prune_model
,依据mask_algo
指定的掩码生成函数裁剪main_program
中支持的层的参数。paddle.static.sparsity.set_excluded_layers
,设置不会被裁剪的层的参数名称。paddle.static.sparsity.reset_excluded_layers
,重置与main_program
相对应的excluded_layers
设置。
- 新增
(3)性能优化
分布式训练-静态图混合并行
- 优化模型并行 + AMP 时 AMP 的灰名单列表,支持模型并行算子,性能提升8%。(#33660)
- 优化流水线并行时反向梯度累加的
device
属性设置,性能提升1-3%。(#33946) - 优化流水线并行执行器中 debug 的部分,性能提升60-140%。 (#33948)
- 支持流水线并行下
Program
cache的功能,性能提升10-40%。(#33998, #33954) - 优化流水线并行
send
的通信等待,性能提升0.3-2%。(#34086) - 优化模型并行 + 流水线并行时
send/recv
发送数据量的大小,8机测试性能提升36%。(#34110) - 优化混合并行 + AMP时参数的 cast,通过
optimize_cast
控制,性能可提升5-7%。(#34965) - 优化流水线并行 + recompute + amp 时的性能,性能提升13%。(#34519)
- 支持流水线并行 + 数据并行时使用
float16
通信,通过distributed_strategy.fp16_allreduce
控制,性能可提升13%。(#34762)
算子优化
- 设计并实现了通用的Reduce CUDA算法,应用于7个Reduce算子,加速1.0x ~ 22.7x。(#32697, #32974, #33267, #32885, #33144, #33761, #33901, #34143, #34436)
- 设计并实现了通用的Elementwise和Broadcast CUDA算法。(#32512, #32928, #33976, #32148, #32414):应用于41个一元、激活算子。(#32348, #32622, #32823),性能提升1.1x ~ 1.4x;应用于19个二元(9个基础计算类、6个比较类、4个逻辑类)算子。(#33050, 33052, #33053, #33051, #33089),性能提升1.02x ~ 3.21x。
- 优化
roll
算子CUDA实现 ,单维度、多维度输入时,性能分别提升10%、50%以上。(#32880) - 优化
roll
算子index计算,单维度、多维度性能分别提升15%和70%。(#33909) - 优化
update_loss_scaling_op
算子CUDA实现,性能提升2.06x。(#32554) - 优化
softmax_with_cross_entropy (hard label)
GPU 算子性能,加速比1.0x ~ 10.0x。(#35660) - 优化
index_select
前、反向算子的CPU实现,加速比达到2.09x~9.34x。(#32863, #32955) - 优化
batch_norm
算子二维输入情况下的CPU实现,提升达到22.68x~30.00x。(#34585) - 优化
batch_norm
算子在初始化方式及二维输入下的GPU性能,提升1.25x~25x。(#33851, #33887) log_softmax
算子性能优化及该相关bug修复,优化后较优化前kernel性能对比4.22x~32.29x。 (#31630, #32180, #32396, #32937)- 优化
concat_and_split
算子,解决动态图在海光DCU芯片上训练BERT时计算和通信无法overlap的问题,在海光DCU芯片上BERT分布式训练性能提升约27%。(#33982) - 优化
fused_elemwise_act
算子,MB计算规模下有十余倍性能提升。(#33480)
策略优化
- 增加
build_strategy.fix_op_run_order
策略,固定op执行的次序,ResNet模型单机8卡速度提升1.8%。(#34427) - 动态图反向计算支持并自动开启部分算子inplace策略,动态图gpt模型pure float16训练性能提升4.8%。 (#35412)
- 优化动态图性能,将只在静态图执行的逻辑从动态图的执行路径中剥离。(#34024)
- IR Pass优化能力作为通用能力露出,同时支持单机和分布式优化。在GPT混合并行场景性能提升3%-5%。(#34955, #35704, #34730, #34524)
- 优化 ctc loss grad 计算速度,提速~3x,但相应增加了GPU显存占用。(#34729)
- transformer encoder 性能优化
- 优化思路:通过新增
paddle.incubate.nn.FusedMultiHeadAttention
和paddle.incubate.nn.FusedFeedForward
的方式,在实现中采用 q, k, v gemm融合及多种kernel融合优化技术,提升transformer encoder的性能。-
FusedAttention
- 新增
paddle.incubate.nn.functional.fused_multi_head_attention
,支持multi-head attention的融合计算。(#35905 35903 #36803 #36793 36185) - 新增
paddle.incubate.nn.FusedMultiHeadAttention
,用于融合multi-head attention的layer层组网。 (#36498 ) - 该模块使用q, k, v gemm融合和bias add + dropout + residual add + layer_norm kernel融合优化技术,可带来1.08x-1.45x加速。
- 新增
-
FusedFeedForward
-
新增
paddle.incubate.nn.FusedTransformerEncoderLayer
,支持使用融合multi-head attention和融合feedforward计算的layer层组网。 (#36776)
-
- 优化思路:通过新增
(4)问题修复
API
- 优化
depthwise_conv
数值稳定性。 (#35161) - 添加参数创建时的形状检查,以保证参数每个轴的
size
都大于 0 。(#33265) - 优化
paddle.nn.LayerNorm
的计算,并修复数据溢出相关bug。(#34432, #33658) - 支持Windows应用场景,将PaddlePaddle 框架能力集成到 MFC/QT/C# 等桌面端软件环境中,修复进程嵌套导致系统崩溃问题。(#34312)
- 修复Reduce 数据初始化导致NLP 模型loss有误的问题。(#34941)
- 修复
paddle.nn.LayerNorm
在batch_size=1
时候的bug问题。(#35480) - 修复
paddle.static.nn.group_norm
在空输入下不能正确捕获错误的问题。(#35613) - 修复
paddle.nn.functional.batch_norm
在is_test=True
的情况下mean/variance为空的问题。(#35328) - 修复
paddle.nn.functional.instance_norm
和paddle.nn.functional.batch_norm
输入为空时,访问越界的问题。(#35341, #34107) - 修复量化模型不统计
paddle.nn.LayerNorm
的输出的问题。(#33610) - 修复
paddle.nn.SyncBatchNorm.convert_sync_batchnorm()
不支持1D/3D的问题 。(#32989) - 修复
paddle.nn.BatchNorm1D, paddle.nn.BatchNorm2D, paddle.nn.BatchNorm3D
在is_test=True
的情况下无法添加反向的问题。(#32678) - 修复
Tensor.cuda
不支持device_id
为None
的问题。 (#34416) - 修复
paddle.to_tensor
不支持Tensor.dtype, core.Tensor
等内置类型的问题。 (#31931, #33430) - 修复
paddle.nn.functional.log_softmax
不支持输入维度为0的问题。(#34635) - 修复
paddle.nn.GroupNorm
在float32下CPU计算结果和准确值的相对误差大于1e-5的问题。(#33176) - 修复
paddle.trace
在参数offset
超出维度大小时返回结果不为0的问题,在参数axis1
和axis2
输入不合法值时的栈溢出问题。(#33922, #35419) - 修复
paddle.sum
输入参数为bool类型时,输出类型不为int的问题。输入参数类型和输出参数类型不一致且 axis 轴对应的reduce元素个数为1时,输出类型错误问题。(#34313, #36123) - 修复
paddle.nn.conv2d/conv3d/conv2d_transpose/conv3d_transpose
非法输入时除0错误和数组越界的问题。(#35337) - 修复
paddle.nn.conv2d_transpose
非法输入时堆缓冲区溢出的问题。(#35340) - 修复
paddle.bmm
写空地址导致程序运行时崩溃的问题。(#35098) - 修复
cast
算子无法支持 Tensor 从int16 转换到float32的问题。(#35156) - 修复
assign
不支持float16和uint8的问题。(#35153) - 修复
concat
在输入大shape tensor时,容易溢出的问题。(#34319) - 修复动态图
concat
不支持空tensor作为输入的问题。(#35845) - 修复
paddle.where
不支持broadcast的问题。(#35092) - 修复
paddle.reshape
空tensor 时输入合法性未检查问题。(#35642) - 修复
layernorm
算子在大shape下cuda kernel配错错误问题。 ( #33748) - 修复
random
类算子静态图下stop_gradient属性设置错误问题。( #33959) - 修复
split
算子输入为空tensor的错误行为。(#334356) - 修复 tensor 的 slice 左值赋值显存泄漏问题。(#35013)
- 修复动态图Layer无法被cloudpickle dump和load的问题。(#35538)
- 修复simple_rnn_cell, gru_cell和lstm_cell API 非法参数设置导致除零错误问题。(#34627)
- 修复
paddle.nn.functional.linear
在非法输入时空指针解引用的问题。(#34696) - 修复
paddle.strided_slice
,paddle.transpose
存在内存越界问题。(#35062, #35079) - 修复
roll
算子非法输入时除0错误的问题。(#34499) - 修复
gather
算子非法输入时的数组越界问题。(#34096, #34138, #34200) - 修复
prelu
,softlax
算子非法输入时除0错误的问题。(#34499) - 修复
split
算子未对输入参数做合法性检查问题。(#34630) - 修复
memcpy
算子无法支持海光DCU芯片的问题。(#35394) - 修复
slice
算子在batch_size=1
下训练会报错问题。(#34265) - 修复
reduce_sum
算子在 AMP 下容易溢出问题。(#33960) - 修复ANSI转义代码在windows下显示错乱问题。(#33689)
- 修复
paddle.hub
解析文件名字和下载保存文件不一致问题。(#33214) - 修复
matmul
,diag_embed
,auc
算子输入空tensor时内存泄露问题。 (#34978) - 修复
paddle.less_equal, paddle.less_than, paddle.greater_equal, paddle.greater_than
计算broadcast计算精度误差大的BUG。(#32941) - 修复
interpolate
算子在大输入shape下的崩溃问题。(#35577) - 修复
interpolate
,unfold
,spectral_norm
算子输入为空tensor的合法性检查问题。(#33941, #34943, #35005) - 修复
paddle.flops
在计算输出的FLOPs可能出现负号(整数溢出)的问题。(#33576) - 修复
paddle.summary
遇到返回值含非Tensor元素的层时报错的问题。(#34160) - 修复
pool
算子非法输入时计算输出shape错误的问题。(#35106) - 修复
unfold, dice_loss, reshape
算子输入shape的合法性检查问题。(#34673, #34757, #35016) - 修复
unique, unstack
算子输入zero tensor的问题。(#36021) - 修复stack算子的反向输入为空时的问题。(#362877)
- 修复
paddle.inverse
在输入Tensor的形状为[0, 0, 0]
时,CPU执行会出现除0错误的问题。(#34996) - 修复
paddle.nn.functional.grid_sample
在特殊输入情况下报出的CUDA错误。(#33100) - 修复
paddle.flatten
在静态图特殊输入情况下编译期计算维度错误的问题。(#35321) - 修复
paddle.nn.conv2d/conv3d/conv2d\_transpose/conv3d\_transpose
计算输出shape时编译期检查报错的问题。(#35693) - 修复
paddle.data.flowers
在多卡训练情况下容易出现数据读取错误的问题。(#33738) - 修复pact量化se模块时loss为nan的问题。(#35392)
- 修复量化
flatten_contiguous_range
报错的问题。(35410) - 修复动态图模式下pact量化的问题。(#35407)
- 修复channel-wise量化bert报错的问题。(#34948)
- 修复量化在参数全为0时的问题。(#34647)
- 修复channel-wise量化在channel数为1时的bug。(#33753)
- 修复动态图
@no_grad
线程不安全的问题。(#34649) - 修复
paddle.grad
接口在部分场景下会hang住的bug。(#34023) - 修复
paddle.masked_select
在静态图下形状推导的bug。(#33167) - 修复
paddle.slice
在部分场景下不支持numpy.ndarray
类型索引的问题,以及axes
参数为tuple
类型时出错的问题。(#35748, #35267) - 修复
set_value
反向梯度截断的问题。(#34304) - 修复
paddle.regularizer.L1Decay
在非inplace计算下的gradient重复设置问题。 (32710) - 修复
adamw
参数分组时,学习率不生效问题。(#34468) - 优化卷积类API中非法
dilate
输入检查。(#35894) - 修复
paddle.io.DataLoader
迭代中途break报错问题。(#34501) DataLoader内存泄漏问题。(#34140) DataLoader误报warning信息。 (#33712) DataLoader子进程random state一致问题。(#33310) - 修复IterableDataset中drop_last不生效问题。(#34801)
- 修复
paddle.optimizer.lr.LRScheduler
导致的 optimizer 状态恢复的问题。( #33984) - 修复
gather
算子,在使用axis
进行infershape的bug。(#33413) - 修复Executor中fetch_list类型为tuple时可能导致执行卡住的问题。(#35726)
- 修复
paddle.nn.GroupNorm
除零错误,并添加channel可以被group整除检查。(#35644) - 修复tensor formatter中引用已释放内存的问题。(#35399)
- 修复Adam优化器在
float64
精度下beta
参数精度损失的问题。(#33381) - 修复张量并行非切分参数初始化时未广播带来的精度对不齐问题。(#35326)
- 迁移
paddle.static.accuracy
API中的topk
算子到topk_v2
算子。(#35494) - 迁移
paddle.nn.dynamic_decode
中expand
算子到tile
算子,迁移paddle.nn.BeamSearchDecoder
中topk
算子到topk_v2
算子。(#35656) - 迁移
paddle.nn.functional.dice_loss
API中的one_hot
算子到one_hot_v2
算子。(#35734) - 修复
paddle.summary
静态图模式下使用 bug。(#35303) - 修复
paddle.Model.prepare
静态图模式下多卡启动的 bug。(#34311) - 修复
paddle.nn.functional.cross_entropy
给定weight
,且指定axis
为除-1外的其他合法维度时会报错的问题。(#36647) - 修复
paddle.utils.dlpack.to_dlpack
无法编码多维Tensor
的问题,修复其所生成的 DLPack 对象无法进行跨深度学习框架共享的问题。(#36177) - 修复使用
paddle.distribution.Categorical
的sample
方法报错的问题,具体原因是multinomial op的cuda kernel中数组访问越界,该bug会导致访问超出数组下标的值,引起报错。 (#36511) - 修复动态图
_BatchNormBase
基类中修改了 default_dtype,导致后续组网参数类型错误的问题,受影响的API有paddle.nn.BatchNorm1D
,paddle.nn.BatchNorm2D
,paddle.nn.BatchNorm3D
,paddle.nn.SyncBatchNorm
。具体原因是当get_default_dtype() == 'float16'
时,通过set_default_dtype('float32')
修改默认参数数据类型,动态图组网的参数类型是通过 default_dtype 来创建的,因此当默认参数类型被修改后导致后续的组网参数类型错误。 (#36376) - 修复
paddle.nn.functional.grid_sample
因特殊输入导致的异常问题。(#36625) - 修复
paddle.fft.fft
,paddle.fft.ifft
,paddle.fft.rfft
,paddle.fft.irfft
,paddle.fft.hfft
,paddle.fft.ihfft
在输入axis=0
情况下的计算错误问题。(#36537) - 修复
paddle.fft.fftshift
和paddle.fft.ifftshift
在静态图下出错的问题。(#36537) - 修复
paddle.fft.ifftshift
计算结果不正确的问题。(#36835) - 修复
paddle.nn.functional.pad
在replicate
模式下的报错信息提示。(#36531)
IR(Intermediate Representation)
- 动态图转静态图
- 修复了动转静后,在
paddle.no_grad
语义下显存异常增长的问题。(#35725) - 修复了对
paddle.no_grad
接口的错误识别和转换问题。(#34136) - 修复了部分场景下模型中间设置 stop_gradient=True 时,动转静训练报错的问题。(#36353)
- 修复了在控制流 if 的部分场景转换时,对返回结果检查会报错的问题。(#36830)
- 修复了在 ifelse 分支返回不等长结果时,动转静会额外对齐返回长度导致返回类型意外改变的问题。(#36565)
- 修复使用 jit.save/load 接口加载模型后,在 train 模式和 no_grad 上下文中,显存会一直增长的问题。(#36463)
- 修复了动转静后,在
分布式训练
-
分布式训练基础功能
- 修复图引擎潜在的栈溢出问题。 (#33055)
- 修复分布式训练可能出现的死锁问题。 (#34461)
- 修复张量并行在 transformer 类模型的多头注意力计算中切分不正确的问题,优化张量并行在混合精度计算时的速度。 (#33015)
- 修复模型并行下使用
paddle.nn.ClipGradientByGlobalNorm
时,非 distributed 的 vars 的 norm 被多次计算的问题。(#35713) - 修复模型并行
paddle.distributed.split
Parallel Linear 行切分bias加法位置出错的问题。(#35186) - 修复流水线并行初始化通信组可能 hang 的问题。 (#33476)
- 修复流水线并行中
Tensor
显存在实际使用完成前被释放的问题。 (#33996) - 修复流水线并行时反向梯度累加
op_device
为空的问题。(#33875) - 修复流水线并行运行
sub-block
报错的问题。(#32727) - 修复流水线并行时反向梯度累加
op_device
为空的问题。(#33875) - 修复 Sharding 并行通信初始化时偶尔 hang 住的问题。 (#33327)
- 修复
paddle.distributed.barrier
同步流错误。 (#33476) - 修复
paddle.distributed.alltoall
通信组设置错误的问题。(#32890) - 修复静态图张量并行参数初始换广播错误导致的精度对不齐问题。(35326)
- 修复动态图数据并行不支持
recompute
等继承PyLayer
类实现的自定义算子的问题。(#35401) - 修复混合并行下流水线并行 + 数据并行 hang 住的问题。(#34142)
- 修复开启 AMP 时,
fleet.get_loss_scaling
失败的问题。(#33935) - 修复
fleet
多机未 wait server ready 的问题。(#32889) - 修复分布式预测
infer_from_dataset
仍旧更新参数梯度的问题。(#35698) - 修复
data_feed
中 dense 特征 LOD 属性设置错误的问题。(#35000) - 修复静态图使用
gradientmerge
时gradient_merge_cond
变量的 save 问题。(#35578) - 修复
paddle.hub
下载文件名字和nt_merge_cond
变量的 save 问题。(#35578) - 修复
fleet
开启dump_slot
时报错不明显的问题。 (#34173) - 修复混合并行训练在海光 DCU 芯片上的 RCCL 的问题。(#32808)
- 修复 GPU 参数服务器退出报错问题。(#33724)
- 修复 hdfs 工具upload/download功能不可用问题。(#33903)
- 修复 GPU 参数服务器训练过程中由于样本不能整除worker数而卡住的问题。(#32640)
- 修复 GPU 参数服务器使用非0卡训练报错问题。(#33078)
- 修复 GPU 参数服务器 delta score,scale show问题。(#33492, #33492)
- 修复 GPU 参数服务器训练结束后未 merge dense,g2sum 计算有误,data norm 添加了optimize op 等问题。 (#35029)
- 修复使用 fuse all reduce ops 开关时,如果梯度出现 empty 时会报错的问题。(#36231)
- 修复 dist_transformer 文件出现未定义的变量问题。(#36211)
-
动态图混合并行
-
静态图混合并行
- 解决 TensorParallel 在 Multi-Head Attention 网络中的切分错误问题,优化 TensorParallel 与混合精度共同使用时的训练速度。(#32897)
其他
- 自定义OP
- 去除对
logging
库全局设置的修改。 (#32673) - 新增
GlooParallelContext
,适配Reducer
模块逻辑,为DataParallel
后续支持CPU并行提供底层通信组件支持。 (#35154) - 迁移
paddle.metric.accuracy
中的top_k
op 为top_k_v2
op。 (#35789) - 修复
MKLDNN
下运行找不到默认attr
的问题。(#34567) - 修复
optimizer
中没有给clear_float_status
OP添加device_key
的问题。(#34431)
4. 部署方向(Paddle Inference)
(1)新增功能
后端能力增强
-
新增 TensorRT 子图模式下动态 shape 自动配置功能
增加TensorRT离线tune动态shape设置方式,对于模型被切分成多个TensorRT子图的场景,提升易用性#34806 #35771,使用示例可参考demo。- 易用性优化的基本思想是:使用Paddle原生运行的方式针对用户输入的批量数据,统计计算图中所有临时tensor的shape范围,并将统计到的shape范围设置到TensorRT子图的输入,从而避免了用户去手动计算内部子图输入tensor的shape范围,提升易用性。
- 离线tuned动态shape使用的基本流程:用户代码完成后,通过配置config,启用shape范围收集能力c++接口
config.CollectShapeRangeInfo("shape_range.pbtxt")
或python接口config.collect_shape_range_info('shape_range.pbtxt')
,将获得的shape范围以prototxt的格式存储在本地,修改config配置,关闭shape收集,开启tensorrt和动态shape能力,c++接口config.EnableTunedTensorRtDynamicShape("shape_range.pbtxt", true)
或python接口config.enable_tuned_tensorrt_dynamic_shape('shape_range.pbtxt', True)
即可直接运行。
-
新增对昇腾(Ascend)系列硬件的原生支持
-
新增pool3d算子支持TensorRT的功能。(#36545)
(2)功能优化
框架及API更新
-
量化支持
-
API 增强
-
库体积压缩
- linux 下对预测库进行strip裁剪库体积,体积压缩30M。(#34895)
-
其他更新
后端能力增强
-
CPU 相关更新
- 升级oneDNN版本为2.3.2。( #35040)
- 新增 quant-aware LSTM oneDNN INT8 模型支持。(#35382)
- 新增 post-training LSTM oneDNN INT8 模型支持。(#35334, #33295)
- 新增 fusion_gru 和 multi_gru 融合和 post-training INT8的支持。(#33749)
- 优化oneDNN 的 cache机制。(#35664, #35331, #35132, #35030, #35002, #34830, #33515, #33048, #32922, #32499)
- 通过新增多个 op (如clip, scale等) 的oneDNN kernel 实现, ch_ppocr_mobile_v1.1_det_infer、DPN68, fastscnn, hrnet、HRNet_W18_C、 icnet、Res2Net50_26w_4s、 ssdlite_mobilenet_v3_large 等模型打开oneDNN 比关闭 oneDNN 在 Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz 单核性能提升 47.8%。(#35601, #32975)
- 优化了oneDNN LSTM INT8 模型,在Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz 单核上,INT8 LSTM 模型为 FP32 LSTM 模型性能的 1.59 倍。(#35382, #35334, #34820, #34137)
-
GPU 及 TensorRT 子图引擎相关更新
- 增加TensorRT 8.0的支持,在将来的某个版本我们会放弃对TensorRT 6.x的支持。(#34403, #34294, #34157, #33777, #33680, #33662, #33654)
- 增加TensorRT
layer_norm
plugin对动态shape的支持。(#33448) - 增加TensorRT
hard_swish
plugin对动态shape的支持。(#35214) - 增加TensoRT
reduce_sum
和gather_nd
的支持。(#33324) - 增加TensorRT
qkv_context
plugin 对int8的支持(#34917, #35504) - 增加TensorRT conv3d的支持。(#35507)
- 增加对
multihead_matmul
融合算子的输入进行广播的支持。(#35780) - Inference 支持 TensorRT8 稀疏推理,测试环境下,ERNIE 模型变长输入在不同的 batch_size 下性能提升10%-30%,ResNeXt101_32x4d模型在不同的batch_size下性能提升10%。(#36659)
-
Nvidia Jetson 原生支持能力增强
- 新增 Op 支持,针对Jetson Nano/TX2这两款算力较低的设备,我们做了针对性的优化,目前新增了
pool2d
,pool_max
,conv3d_transpose
等 17个OP的支持。(#35378) - 针对Jetson Nano,新增模型:DPN68, EfficientNetB0, ttfnet, fcn_hrnetw18, hardnet。(#35378)
- 针对Jetson TX2,新增模型:deeplabv3p_resnet50, deeplabv3_resnet50, fcn_hrnetw18, hardnet, pspnet, ttfnet, unet。(#35378)
- 新增 Op 支持,针对Jetson Nano/TX2这两款算力较低的设备,我们做了针对性的优化,目前新增了
-
昆仑XPU接口功能扩展
- 新增
set_xpu_device_id
接口,支持设置推理时的昆仑芯片的设备号(#35572)
- 新增
-
Inference python
copy_from_cpu
接口加入输入类型检查,错误类型输入下提前报错。(#36552)
(3)问题修复
框架及API修复
-
算子修复
- 修复split op当axis输入小于0时,转换TensorRT时会发生地址访问错误的情况,同时将axis等于0时静动态shape均不支持的情况进行过滤。(#35127)
- 修复transpose静态shape在axis为
[0, 1]
时错误的情况。(#35138) - 修复 gather op与原生 paddle op的功能对齐,并完善 op teller 过滤的条件。(#35784)
- 修复fc op 的 int8 分支。(#34787, #32671)
- 修复reshape 的 op teller 过滤条件。(#34787, #34583)
- 修复recurrent op多线程推理效率差问题。(#36053)
- 修复gather和scatter op中int值溢出的问题。(#35544)
- 修复 ctc op 除零错误。 (#34724)
- 修复模型输入包含bool类型时,插入scale op导致的崩溃。(#35176)
- 修复复数scaler 和Tensor 运算失败的问题。(#33699)
-
框架功能修复
-
修复 ERNIE 模型在 TRT8 下可能出现的崩溃问题。(#36769)
-
修复使用 Pool, Slice 时可能出现的崩溃及精度问题。(#36666)
-
修复 yolo_box op因为计算公式错误导致的精度问题。(#36365)
-
修复量化后的 matmul_v2 在TRT下无法正常推理的问题。(#36821)
-
修复了量化 matmul_v2 时错误地添加量化op的问题。(#36820)
-
修复算子 batch_norm 和 elementwise_add 在3D应用场景下开启 TRT 报错的问题。(#36446)
-
修复高层 linear api保存得到的预测模型无法被 Pass 融合优化的问题。(#36500)
-
修改 MatmulV2ToMul 的 Pass,重新限定 (matmul_v2 to mul) 映射的 Pass,增加 MatmulV2ToMatmul 的 Pass,限定 (matmul_v2 to matmul) 映射的 Pass条件(不支持广播),修改 (matmul, mul) 的 op_teller 映射条件。(#36652)
后端能力修复
- TensorRT 子图引擎修复
- 修复TensorRT动态shape时slice plugin的ends参数越界报错问题。(#35357)
- 修复reduce op转换TensorRT的reduce_all = 1时候不支持keepdim=false的情况。(#35145)
- 修复slice op转换TensorRT的decrease_axis参数问题。(#35100)
- 修复nearest_interp op转换TensorRT动态shape下scale为负数不支持的情况。修正scale比outh和outw有更高优先级。(#35405)
- 修复pad op的paddings参数和tensorrt不一样的问题。(#35371)
- 添加conv2d op转换TensorRT的4维padding支持,过滤conv2d op转换TensorRT时padding_algorithm 为 SAME 和 VALID 的情况。(#35627)
- 添加pool2d op转换TensorRT时对padding_algorithm 为 SAME 的处理,过滤 exclusive mode下 ksize 小于等于 padings 的情况。(#35923)
- 修复clip op转换TensorRT时不支持 Min和Max 输入的情况。(#35694)
- 修复gelu op转换TensorRT时不支持 approximate 属性的情况。(#35529)
- 修复affine_channel转换TensorRT时不支持2维输入的情况。(#35496)
- 修复TensorRT子图匹配不稳定的问题。(#35147)
- 修复预测引擎析构后,TensorRT engine没有释放的问题。(#35842, #35938)
- paddle-trt static模式下,如果reshape的shape属性 batch维度为-1,修复paddle算子错误转换为trt的问题。(#34007)
- 修复roi_align 转换TensorRT不支持RoisNum属性的情况,同时修复在动态shape时aligned 为True、Sampling_ratio = -1计算错误的情况。(#35549)
- 修复concat 转换TensorRT不支持AxisTensor属性的情况。(#35545)
- 修复scale 转换TensorRT不支持ScaleTensor属性以及静态shape 不支持1维输入的情况。(#35225)
- 修复batchnorm 转换TensorRT不支持MomentumTensor属性的情况。(#35527)
- 修复reshape 转换TensorRT不支持ShapeTensor 、Shape属性以及静态shape 不支持1维输入的情况。(#35166)
- 增加 TensorRT tile 算子支持。(#34388)
- 增加 TensorRT reduce mean 算子支持。(#34204)
- 修复使用gather op时可能出现的崩溃问题。(#33999)
- 修复 TensorRT int8 的一个错误使用 debug 的 flag(会只运行 int8的 kernel,导致性能下降)。(#34704)
- 修复gather_nd op在2维输入调用TensorRT时计算错误问题。(#35464)
- 修复hard_sigmoid op在2维输入调用TensorRT时计算错误问题。(#35908)
- 修复prelu op在2维输入调用TensorRT时计算错误问题。(#35512)
- 修复windows下 TensorRT 推理时,有用右斜杠作为路径分隔符导致的崩溃问题。(#33853)
其他修复
- 修复裁剪反向算子脚本遇到中文字符注释出错的问题。(#33937, #33919)
- 修复编译时单测模型下载不全导致单测推理时的错误,增加测试模型下载的 MD5下载验证。(#33264, #33217)
- 修复 blazeface model 中mkldnn elementwise op 不支持 broadcast 问题。(#33549)
- 修复 swin_transformer mkldnn 推理报错问题。(#35740)
- 修复 paddlex.deploy.Predictor oneDNN多线程执行 unet 报错问题。(#35231)
- 修复 oneDNN setCacheCapacity无法限制内存问题。(#33571)
环境适配
编译安装
- Windows 全新支持
Ninja编译构建方式
,编译速度、易用性、稳定性都较VS IDE方式有很好提升,Windows用户可pip install ninja
,进行本地源码编译Paddle。(#31161, #31449, #32987, #33140, #33155) - 发版镜像中只保留python3.7,删除了python3.5、python3.6、python3.8、python3.9及相应python版本的paddle包,缩小镜像大小。镜像大小缩小30%~50%。(#32688)
- TensorRT库为推理时使用,发版镜像中仅paddle训练基础功能,不需要支持TensorRT。删除了发版镜像中的TensorRT库,避免用户错误使用该镜像。(#34266)
新硬件适配
- 海光DCU芯片训练和推理支持,支持模型数量达9个分类70个模型。
- 海光DCU新增 PaddleDetection 模型支持5个。
- 海光DCU新增 PaddleGAN 模型支持6个。
- 海光DCU新增 PaddleSeg 模型支持13个。
- 海光DCU新增 PaddleNLP 模型支持3个。
- 海光DCU新增 PaddleOCR 模型支持4个。
- 海光DCU新增 PaddleVideo 模型支持3个。
- 昆仑芯第2代芯片(XPU-2)训练支持,支持ResNet50、SSD、Bert、Transformer等多个模型 ,支持静态图+动态图训练,支持混合精度训练。
Thanks to our Contributors
This release contains contributions from:
0x45f, 123malin, Adam Osewski, Aganlengzi, Aurelius84, Baibaifan, Bo Liu, CheQiXiao, Chen Long, Chen Weihang, CtfGo, Double_V, Ethanzjp, Fan Zhang, Feiyu Chan, Feng Xing, From00, GT-Zhang, Guanghua Yu, Guoxia Wang, Haipeng Wang, Hao Lin, Haohongxiang, Hui Zhang, Huihuang Zheng, HydrogenSulfate, IMMORTAL, JYChen, JZ-LIANG, Jacek Czaja, Jack Zhou, Jackwaterveg, Jeng Bai-Cheng, Jiangxinz, Jiaqi Liu, Jiawei Wang, JingZhuangzhuang, June Weng, Kaipeng Deng, Kqnonrime, LJQ❤️, Leo Chen, Li Min, LielinJiang, Lijunhui, Linjie Chen, Liu-xiandong, LiuWei, Ming-Xu Huang, MissPenguin, PaddlePM, Pei Yang, Peihan, Qi Li, QingshuChen, Ren Wei (任卫), Roc, Shang Zhizhou, ShenLiang, Shibo Tao, Siming Dai, Sing_chan, TCChenLong, TTerror, TeslaZhao, Thomas Young, Thunderbrook, Tongxin Bai, WJJ1995, WangXi, Wangzheee, Wei Shengyu, WeiXin, Weilong Wu, Wenyu, Wilber, XGZhang, XYZ, XYZ916829, XiangGao, Xiaoxu Chen, YUNSHEN XIE, Yanxing Shi, Yiqun Liu, YuanRisheng, Yuang Liu, Yulong Ao, Zeng Jinle, Zhang Ting, Zhang Zheng, Zhanlue Yang, Zhen Wang, Zhong Hui, Zhou Wei, andreazanetti, andyjpaddle, arlesniak, baoachun, cc, ceci3, chajchaj, chenenquan, chenjian, chentianyu03, crystal, cuicheng01, danleifeng, denglin-github, duanboqiang, dyning, feng626, feng_shuai, furnace, gongweibao, heliqi, hlygit66666, hong, hong19860320, houj04, huangjun12, huangxu96, huzhiqiang, iducn, jakpiase, jiangcheng, joanna.wozna.intel, jzhang533, kuizhiqing, levi131, lidanqing, lilong12, limingshu, littletomatodonkey, liu zhengxi, liutiexing, liuyuhui, liym27, lyuwenyu, lzzyzlbb, niuliling123, pangyoki, parap1uie-s, ronnywang, root, seemingwang, shangliang Xu, shiyutang, smallv0221, sunli, sunzhongkai588, taixiurong, tangwei12, tianshuo78520a, veyron95, wangguanqun, wangguanzhong, wanghuancoder, wangna11BD, wangxinxin08, wangzhen38, wangzhuang01, wawltor, wenbin, whs, will-jl944, wuhuachaocoding, wuhuanzhou, xiaoting, xiaoxiaohehe001, xiayanming, xiegegege, xiemoyuan, xiongkun, yaoxuefeng, yeliang2258, yingyibiao, zhangbo9674, zhangchunle, zhangkaihuo, zhaoyingli, zhiboniu, zhoujun, zhouzj, zhulei, zhupengyang, zlsh80826, zmx, zyfncg, 李季, 津, 王明冬, 石晓伟