雷锋网 AI 科技评论按:日前,百度 PaddlePaddle 更新至 Fluid v1.3 版本,一如既往地, Fluid v1.3 版本在基础框架、预测引擎、模型建设、分布式训练各个方向上都实现了多项更新,而其中比较重要的更新包括:
统一 Executor 和 ParallelExecutor 接口,用户只需通过 CompiledProgram 将单卡模型转化多卡模型,并利用 Executor 进行训练或者预测。
正式发布 AnalysisConfig 预测接口,支持计算图分析、算子融合等优化,并支持利用 Intel MKLDNN、Nvidia TensorRT 子图引擎等第三方库的加速.
模型库新增发布 PaddlePaddle 视频模型库,提供 5 个视频分类经典模型以及适合视频分类任务的通用骨架代码,用户可一键式高效配置模型完成训练和评测。
新增支持 NLP 语义表示 BERT 模型,支持多机多卡训练,支持混合精度训练,训练速度对比主流实现提升 50%+,提供完整部署示例。
发布大规模稀疏参数服务器 Benchmark,CPU 多机异步训练发布显著提升点击率预估任务 IO 吞吐的 built-in reader,多机多卡训练性能多方面提升。
最新版本在基础框架、预测引擎、模型建设、分布式训练上的具体更新情况如下:
安装
新增 Linux 和 MacOS 下的中文版本辅助安装脚本,提供交互式安装方式,协助用户在复杂环境下快速完成 PaddlePaddle 安装。
Windows 支持优化:新增 cuda8,cudnn7 的 GPU 支持,新增 AVX 指令集、MKLDNN、mnist 数据集支持。修复 Windows 加载 Linux/Mac 下同版本 paddle 训练模型的问题。
增加动态图基础功能
动态图 tracer、 autograd、python Layer/PyLayer,动态图支持 MLP、GAN、ptbRNN、Resnet 模型,动态图支持 Optimizer、GPU 训练。
Executor 和 ParallelExecutor 接口优化
对 Executor 和 ParallelExecutor 接口进行统一,用户只需通过 CompiledProgram 将单卡模型转化多卡模型,并利用 Executor 进行训练或者预测。
ParallelExecutor 优化:对 MultiDevSSAGraphBuilder 进行重构,使得 MultiDevSSAGraphBuilder 更易扩展。去除 ParallelExecutor 中的设备锁,提升 ParallelExecutor 多卡调度性能。
中间表达 IR 和 Pass 方面的优化
完善 C++ IR graph 的 python 接口以及 C++ IR pass 的 python 接口。
在 framework.py 中新增 IRGraph 类,为在 Python 层编写 IR Pass 做准备。
新增支持网络无锁更新的 Pass。
新增 QuantizationTransformPass,此为 Quantization Aware Training 量化模式训练前的图修改操作部分。
内存和显存方面的优化
新增支持在编译时加入 Jemalloc 作为动态链接库,提升内存管理的性能,降低基础框架内存管理开销。
新增 memory optimize,inplace pass, memory pool early deletion 等显存优化策略。
新增支持网络无锁更新的 Pass。
新增 QuantizationTransformPass,此为 Quantization Aware Training 量化模式训练前的图修改操作部分。
Operator 整体层面的优化
每个 op 在执行前只做一次 scope 查询,减少读写锁操作(原来需要做 1~5 次 scope 查询)。
新增 Temporary Allocator,减少 op 中的同步操作。
新增 py_func operator,支持 python op 接入,用户可以借助 py_func Operator 快速实现所需要的特有操作。
INTEL FP32 计算相关优化
优化 density_prior_box operator,单 op 四线程提速 3 倍。
优化 Stack operator,单 op 提速 16 倍。
开发 Transpose,Concat 和 Conv3d 三个基于 MKLDNN 的 kernel。
修复 lrn operator 中 MKLDNN kernel 精度 bug,同时单 op 提速 1.3 倍。
修复 MKLDNN 初始化占用 5G 内存的问题,目前初始化占用 500MB。
减少从 MKLDNN OP kernel 到非 MKLDNN OP kernel 时不必要的 reorder。
完善 CPU JitKernel
sequence pooling 的 jitkernel,纯 op 提升 2 倍。
softmax 的 jitkernel,纯 op 提升 2 倍,同时使得 Bert 模型 CPU 预测提升 26%。
常见的基本逻辑:向量的每个元素求平方 kVSquare、矩阵乘法 kMatMul、向量的最大值 kHMax、向量所有元素的和 kHSum。
其他
Fluid v1.3 版本还重构 DDim,Variable Type 等,能够降低基础框架调度开销。
服务器预测
正式发布 AnalysisConfig 预测接口,支持计算图分析、算子融合等优化,并支持利用 Intel MKLDNN、Nvidia TensorRT 子图引擎等第三方库的加速。
预发布 intel CPU 上的 预测 INT8 离线量化方案
开发 Conv2D,Pool2D,Quantize,Dequantize 四个基于 MKL-DNN 的 INT8 kernel。
预发布 Calibration 的 3 个核心 Python API(paddle.fluid.contrib.Calibrator)。
开发 Calibration 工具,保证 FP32 和 INT8 的精度在 ResNet-50 和 MobileNet-V1 在 ImageNet 验证数据集上相差在 1% 内。
支持 Intel Xeon CascadeLake Server(VNNI 指令)及 Intel Xeon SkyLake Server,性能提升约为 1.33 倍。
CPU 预测速度提升
fuse sequence pooling concatop,支持 N (<200) 个 sequence_pooling op concat 起来组成一个新 op,整体使得 seqpool 模型 CPU 预测提升 56%。
fuse 连续重复的 fc op 为一个大 op,使得 seqpool 模型 CPU 预测速度提升 15%。
fuse 逻辑为 ((X∗Y).2−(X.2∗Y.2)).∗scalar 的 op 组合 , 使得 seqpool 模型 CPU 预测速度提升 8.2%。
针对输入 tensor 元素个数为 1 的情况,优化 compare_op 的 CPU Kernel。
新增 Paddle-TRT 对 Calibration INT8 的支持,GPU 预测速度提升
模型 VGG,Resnet50 上预测速度达到了 Paddle-TRT float32 的两倍性能。
模型 VGG,Resnet50 在 imagenet 数据集上测试,精度下降 0.3% 以内。
算子融合
增加 fc 和 con 相关两个 fuse,作用于 conv_op CUDNN kernel。
新增 Conv+Affine Channel 的融合 pass,Faster RCNN 运行的性能提升 26.8%。
新增 Transpose+Flatten+Concat 融合 pass,MobilenetSSD 模型性能提升 15%。
实现 beam_search operator 的 CUDA Kernel,并且将相应的 top-k、elementwise_add、reshape、log 计算融合到 beam_search operator 中。
功能完善及易用性提升
新增 C++ IR graph 的 Python 接口。
新增预测库的 Python 接口。
服务端预测支持从内存加载模型。
其他
删除 legacy V2 代码。从 1.3 版本起,不再支持 V1&V2 老版本功能。
修复 Paddle-TRT elementwise-mul 模型运行出现问题的 bug。
修复 Paddle-TRT trt_engine stream 多个连续输入情况下模型输出结果异常的 bug。
移动端预测
效率优化,常见模型预测速度提升
int8 预测支持 dequantize 和其他 op(batch normalization/relu/elementwise add)进行自动 kernel 融合。
transpose2 operator 对于 shuffle channel 操作进行优化。
gru operator 使用 neon 指令进行优化,并针对 batch size 为 1 时进行优化。
优化和实现 pooling,支持任意的 padding。
优化和实现 batch normalization、softmax、elementwise add。
新增支持多个输入和多个输出的模型预测
新增实现 prelu6 operator、cast operator、top_k operator
修复 int8 offline 量化溢出结果不对的问题
修复 winograd 实现在输入 feature map 的 height 和 width 不相等时结果可能为 0 的 bug
PaddleCV 智能视觉
新增发布 PaddlePaddle 视频模型库,包括五个视频分类模型:Attention Cluster、NeXtVLAD、LSTM,、stNet、TSN。提供适合视频分类任务的通用骨架代码,包括数据读取和预处理、训练和预测、网络模型以及指标计算等多个模块。用户根据需要添加自己的网络模型,直接复用其他模块的代码,快速部署模型。
新增支持目标检测 Mask R-CNN 模型,效果与主流实现打平。
语义分割 DeepLabV3+模型,depthwise_conv op 融合,显存优化,显存占用对比上一版本减少 50%。
PaddleNLP 智能文本处理
新增支持 NLP 语义表示 BERT 模型,支持多机多卡训练,支持混合精度训练,训练速度对比主流实现提升 50%+,提供完整部署示例。
机器翻译 Transformer 模型优化解码计算,decoder 中加入对 encoder output 计算结果的 cache,预测速度提升一倍。
PaddleRec 智能推荐
Sequence Semantic Retrieval 新增单机多线程、单机多卡运行示例,添加预测功能、数据预处理优化,完善部署示例。
GRU4Rec 新增负采样功能,使用 bpr loss 和 cross entropy loss 的效果与原作打平。
大规模稀疏参数服务器 Benchmark 发布
测试真实业务场景下,特征规模百亿、样本平均特征数 1k 的点击率预估任务,在 batch=512 情况下,100worker 加速比 90.5,吞吐量 1.36M/s。
CPU 多机异步训练
发布面向点击率预估任务的 built-in reader,Criteo 数据集下 IO 总吞吐提升 1300%。
GPU 多机多卡水平扩展性能提升
新增并行模式:PG(ParallelGraph)、MP(Multi-Process),独立 GPU 卡之间的计算,提升性能同时,不影响模型精度。
在 ResNet50 模型,单机 8 卡 V100 下,PG, MP 模式提升训练性能 30% 以上;4 机 32 卡,PG 模式提速 46%,MP 模式提速 60%。
在 BERT 模型,8 卡 V100 下,PG, MP 模式提升训练性能 26%。
Multi-Process 模式相比 Parallel-Graph 模式对 Reader 速度敏感度不高。
GPU 多机多卡垂直扩展性能提升
新增功能:fp16 和混合精度训练
Fp16 单机单卡加速情况:ResNet50 提速约 87%,BERT 提速约 70%。
BERT 同时开启 PG 和混合精度,单机 8 卡下单位时间吞吐提升 120%。
ResNet50 同时开启混合精度训练和 MP 模式,在 V100 单机 8 卡、4 机 32 卡下,单位时间吞吐提升 100%。
典型模型收敛速度优化
新增功能:动态 Batch Size,动态 Image Resize 方法。
Resnet50 on Imagenet 数据集:训练收敛轮数下降为标准训练方法的 1/3 左右。
VisualDL graph 支持 Paddle fluid 保存的模型可视化展示。
安装参考网址:http://paddlepaddle.org/documentation/docs/zh/1.3/beginners_guide/install/index_cn.html
PaddlePaddle Fluid v1.3 版本项目开源地址:https://github.com/PaddlePaddle/Paddle/releases 雷锋网雷锋网