在深度學習前沿技術與工業應用公開課分論壇,百度的專家講師團圍繞 PaddlePaddle 從深度學習的語義計算技術、百度視覺技術、OCR 遷移至 Paddle-Fluid 版本的工程例項,到 PaddlePaddle 的新特性、大規模稀疏資料分散式模型訓練等,為參會者進行了詳細講解。本文節選了 PaddlePaddle 的新特性與大規模稀疏資料分散式模型訓練兩部分部分內容。
百度自主研發的深度學習框架PaddlePaddle
深度學習框架PaddlePaddle的新特性與煉成之路
PaddlePaddle 能全面支撐 Modeling、Training 和 Serving 下的各種 AI 場景。
Paddle Modeling
Paddle Modeling 涵蓋數百種計算 operator 和 layer 組網;支援序列變長,動態 batch size;Pre-trained 模型開放。
Paddle Training
Paddle Training 支援同步,非同步分散式;多執行緒,多 GPU,多 stream 異構平行計算;ring,trainer-pserver 拓撲。
Paddle Serving
Paddle Serving 能實現伺服器端快速部署;彙編層高度效能最佳化;移動端 Linux-ARM/iOS/Android/DuerOS 多終端支援。
PaddlePaddle Serving 靈活適配多種預測引擎:
靈活融合原生計算 operator 與第三方預測引擎;
預設引擎,快速可用;
相容業內流行預測引擎 TensorRT;
Anakin,百度開源預測引擎,效能優異。
PaddlePaddle Serving 的預設引擎:
統一的 training 與 serving 的基礎架構和實現,訓後模型快速部署。
多 pass 進行圖最佳化。
CPU MKLDNN 高效能加速。
GPU 可以混合排程 TensorRT。
PaddlePaddle 核心框架
PaddlePaddle Fluid 版本主要包含四大組成部分:Python API;模型改寫與最佳化;訓練 Runtime;CPU/GPU 支援。
Python API 支援影像模型、NLP 模型、語音模型、推薦模型等各類模型。Python API 大致可分為組網類底層 API 以及執行類底層 API 兩大類別。組網類底層 API 包含通用、控制、計算、最佳化、IO 等型別的 API。執行類底層 API 包含訓練、預測、分散式等 API。
組網類 API
Variables:Paddle 中的變數,可以是 Tensor,可以是 Parameter,也可以是 RPCClient。概念類似高階語言中的變數,可以有不同型別。
Layers:Paddle 中,使用者配置模型的基礎模組,Layer 表示一個或者一組緊密關聯的計算,Layers 可以透過輸入輸出連線起來。
Block:Block 表示一組連續的計算邏輯,通常是一個或多個順序 Layer 組成。通常主模型是一個 block0,另外在 control flow 中,比如 while, iflese,也會單獨形成一個子 block。
Control Flow:Paddle 支援 if-else, while, switch 等程式語言中常見的 control flow。以確保模型的靈活表達。control flow 通常以 block 的形式存在。
Program:包含了 1 個或者多個 block,表示一個完整的模型執行單元。執行器需要完整的執行 Program,並保證讀寫關係符合使用者的預期。
執行類 API
執行類 API
執行類 API
示例
訓練 Runtime
訓練 Runtime
視訊記憶體最佳化
InPlace Activation
反向不需要 input,並且輸出和輸入的 tensor 一致,可以直接 overwrite input,節省視訊記憶體開銷。
Memory Optimizer
Live variable analysis:分析每個 Op 的 live-in 和 live-out,找到可以將來被複用的 candidate。在將來的 op output 中,如果有 match candidate 的,複用 candidate,節省視訊記憶體分配。
多卡並行-SSA Graph
將模型 program 轉換成一個可併發執行的 Intermediate Representation (IR);利用 Static Single Assignment 為 variable 加 version,得到一個正確的依賴關係;Build Pass 中插入通訊節點和額外的依賴關係。
基於圖依賴的執行:Input ready 的所有 operator 可以併發執行;Operators 在多個 GPU 上資料並行執行;多卡 gradient 聚合,確保資料並行中引數一致。
多卡並行-Profile
多機分散式
多機分散式支援 ring、pserver 兩種模式。ring:自動插入多機 communicator,多機同步訓練,支援高效能 RDMA 通訊。pserver:拆分成 trainer program 和 pserver program。支援同步和非同步的分散式訓練。Trainer 端多執行緒非同步傳送 gradient;Pserver 端多執行緒非同步 apply optimization。
使用者 Focus Modeling, 框架自動多機化部署:
發現 optimizer operators,parameters, gradients。
split 和 assign 他們到 parameter server 上。
在 trainer 和 parameter server 上插入傳送和接收的通訊節點。
生成在 trainer 執行的 program。
生成在 parameter server 執行的 program。
多機分散式的通訊和叢集:
支援 MPI, RPC 等通訊方式。
RPC 將來會換成 brpc,並提供原生的 RPC+RDMA 支援,極大提高通訊效率。
支援 Kubernetes 叢集部署。
多機分散式下的容錯:
trainer 或者 pserver failure 後可以重啟恢復訓練。
即將支援 pserver 端的分散式 checkpoint 和恢復,支援大規模 embedding。
大規模稀疏資料分散式模型訓練。
在網際網路場景中,億級的使用者每天產生著百億級的使用者資料,百度的搜尋和推薦系統是大規模稀疏資料分散式模型訓練的主要應用場景。
如何利用這些資料訓練出更好的模型來給使用者提供服務,對機器器學習框架提出了很高的要求。主要包括:
樣本數量大,單週 20T+。
特徵維度多達千億甚至萬億。
T 級別,引數大。
小時級更新,時效要求高。
主要問題包括三個方面:
1. 在千億 feature 的時候,一個寬度 8 的 embedding table 的引數量 2980.23GB。
2. Feature ID 使用 hash 演算法計算,分佈在 int64 範圍內,難以預先確定。
3. 輸入特徵非常稀疏。(數百/千億)
分散式查詢表(Distribute Lookup Table):
1. 引數量大:針對資料特點的資料結構 SelectedRows(key-value);分散式儲存;Pserver 端 save/load。
2. Feature ID 不確定:Auto Growth。
3. 輸入特徵稀疏:引數 Prefetch。
系統整體架構一
系統整體架構二
應用最佳化
Model Average Optimizer:訓練中透過窗⼝累計歷史 parameter,在預測時使用 average 後的 parameter,整體提高預測的精度。
序列變長:Batch 中序列長度不一,計算時無需填充。
動態 Batch:訓練中,每個 iteration 的 batch size 可變。
最後,為了更好的幫助開發者學習深度學習,PaddlePaddle建立了覆蓋線上、線下的全套課程及培訓。PaddlePaddle公開課擁有10大系列、400節課程、累計學習時間3000分鐘的線上課程體系,可以覆蓋開發者的學習全階段。