資料流模型將運算任務描述成一個"有向無環圖",節點表示資料運算和儲存,節點之間的連線表示資料流向以及節點的依賴關係。
TensorFlow
名字由多維度資料集 - "張量(Tensor)"與"資料流(Flow)"組成,使用拓撲圖代表資料流關聯,具備痊域優化能力。
- 設計原則
- 資料流:支持各種類型的數值計算任務。
- 拓撲圖:避免運行階段的重複建構以提升運行效能。
- 異質性:支援CPU、GPU、TPU等運算單元以及TCP、gRPC、RDMA等通訊。
- 系統架構
- 應用層:提供多種程式語言撰寫環境。
- API介面層:提供多種程式語言介面。
- 圖計算層:負責單機或分散式的計算環境。
- 資料操作層:負責於實體運算單元上"張量"的操作與運算。
- 網路層(Network Layer):透過 gRPC 和 RDMA 實現程序(Process)間的通訊。
- 裝置管理層(Device Layer):負責實際的網路及運算單元管理。
- 交談(Session)
管理資料流的運行狀態。
- 角色
- Client
序列化、傳輸以及啟動程式撰寫時所定義的 GraphDef 任務。
- Master
進行模型剪枝(Pruning)將任務組成"最小生成樹",將任務切割成分區圖(Graph Partition),之後通知 Worker 執行分配的任務分區圖。
- Worker
將任務切割成子分區圖(Sub Graph Partition)給運算單元執行。
- 參數
- Cluster:運行叢集及透過 ClusterSpec 設定 Job 及 Task 的組態資訊。
- Job:使用 job_id 來識別 Worker。
- Task:使用 job_id:task_index 來識別任務。
- 模型複製
- In-Graph
將輸入資料、拓撲圖(tf.Graph)和參數(tf.Variables)分配到不同的節點上執行,如果任務(Task)失敗則整個任務失敗,容錯能力較低。
- Between-Graph:
參數會透過 Cheif Worker 存取,以共享方式儲存在"參數伺服器(PS)"上,包含參數初始化、Checkpoint、Tensorboard Summary。
- 分散式策略
- ParameterServerStrategy
參數伺服器架構:定義 PS 與 Worker 實體數量、執行節點、通訊組態。
- MultiWorkerMirroredStrategy
Ring-AllReduce架構。
PyTorch
採取組態檔案以及指令(CLI)參數方式組成程式,採用動態圖(Dynamic Graph)以及 Autograd 實作梯度運算,目前缺乏像 TensorFlow 一樣支援多種伺服器以及移動端等架構運行環境。
- 分散式架構
- 參數
- Group:程序集合
- World_size:全域的程序數量
- Rank:表示程序的識別碼及優先序(Rank0為主節點)
- local_rank:程序內的編號
- 運行架構
- 點對點通訊(Point-to-Point Communication):程序間的資料傳輸
- 集合通訊(Collective Communication):支援 AllReduce以及Boardcast等集合通訊
- 程式介面
- DataParallel
使用 Optimizer 來合併及廣播梯度及參數,容易遭遇附載平衡問題,造成單點瓶頸。
- DistributedDataParallel
採用 Ring-AllReduce 最佳頻寬解決方案。
- 通訊引擎
- Gloo:常用於 CPU 叢集
- NCCL:常用於 GPU 叢集