this is version v2.2.0
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
支持二阶导数。#35428 -
paddle.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
项目简介
PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
源项目地址