動態 | 百度發布 Paddle Fluid v1.3 版本,帶來多項重要更新

  • 2019 年 11 月 1 日
  • 筆記

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

  • 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/blob/develop/README.md