tensorflow并行計算原理?
TensorFlow 是一個為數值計算(最常見的是訓練神經網絡)設計的流行開源庫。在這個框架中,計算流程通過數據流程圖(data flow graph)設計,這為更改操作結構與安置提供了很大靈活性。TensorFlow 允許多個 worker 并行計算,這對必須通過處理的大量訓練數據訓練的神經網絡是有益的。此外,如果模型足夠大,這種并行化有時可能是必須的。
當在多個計算節點間分配神經網絡訓練時,通常采用兩種策略:數據并行和模型并行。在前者中,在每個節點上單獨創建模型的實例,并饋送不同的訓練樣本;這種架構允許更高的訓練吞吐量。相反,在模型并行中,模型的單一實例在多個節點間分配,這種架構允許訓練更大的模型(可能不一定適合單節點的存儲器)。如果需要,也可以組合這兩種策略,使給定模型擁有多個實例,每個實例跨越多個節點。
當使用 TensorFlow 時,數據并行主要表現為兩種形式:圖內復制(in-graph replication)和圖間復制(between-graph replication)。兩種策略之間最顯著的區別在于流程圖的結構與其結果。
圖內復制
圖內復制通常被認為是兩種方法中更簡單和更直接(但更不可擴展的)的方法。當采用這種策略時,需要在分布式的主機上創建一個包含所有 worker 設備中副本的流程圖??梢韵胂?,隨著 worker 數量的增長,這樣的流程圖可能會大幅擴展,這可能會對模型性能產生不利影響。然而,對于小系統(例如,雙 GPU 臺式計算機),由于其簡單性,圖內復制可能是最優的。
圖間復制
認識到圖內復制在擴展上的局限性,圖間復制的優勢在于運用大量節點時保證模型性能。這是通過在每個 worker 上創建計算圖的副本來實現的,并且不需要主機保存每個 worker 的圖副本。通過一些 TensorFlow 技巧來協調這些 worker 的圖——如果兩個單獨的節點在同一個 TensorFlow 設備上分配一個具有相同名稱的變量,則這些分配將被合并,變量將共享相同的后端存儲,從而這兩個 worker 將合并在一起。
但是,必須確保設備的正確配置。如果兩個 worker 在不同的設備上分配變量,則不會發生合并。對此,TensorFlow 提供了 replica_device_setter 函數。只要每個 worker 以相同的順序創建計算圖,replica_device_setter 為變量分配提供了確定的方法,確保變量在同一設備上。這將在下面的代碼中演示。
由于圖間復制在很大程度上重復了原始圖,因此多數相關的修改實際上都在集群中節點的配置上。因此,下面的代碼段將只針對這一點進行改動。重要的是要注意,這個腳本通常會在集群中的每臺機器上執行,但具體的命令行參數不同。
運行分布式 TensorFlow 的第一步是使用 tf.train.ClusterSpec 來指定集群的架構。節點通常分為兩個角色(或「job」):含有變量的參數服務器(「ps」)和執行大量計算的「worker」。下面提供每個節點的 IP 地址和端口。接下來,腳本必須確定其 job 類型和在網絡中的索引;這通常是通過將命令行參數傳遞給腳本并解析來實現的。job_type 指定節點是運行 ps 還是 worker 任務,而 task_idx 指定節點在 ps 或 worker 列表中的索引。使用以上變量創建 TensorFlow 服務器,用于連接各設備。
接下來,如果節點是參數服務器,它只連接它們的線程并等待它們終止。雖然似乎沒有特定的 ps 代碼,但圖元素實際上是由 worker 推送到 ps 的。
相反,如果設備是 worker,則使用 replica_device_setter 構建我們的模型,以便在前面討論的這些 ps 服務器上連續分配參數。這些副本將在很大程度上與單機的流程圖相同。最后,我們創建一個 tf.Session 并訓練我們的模型。