理解和實現分布式TensorFlow集群完整教程

2021-08-10 10:13:31 字數 2781 閱讀 5430

手把手教你搭建分布式集群,進入生產環境的tensorflow

前一篇《分布式tensorflow集群local server使用詳解》我們介紹了分布式tensorflow的基本概念,現在我們可以動手搭建乙個真正的分布式tensorflow集群。

分布式tensorflow集群由多個服務端程序和客戶端程序組成,在某些場景下,服務端和客戶端可以寫到同乙個python檔案並起在同乙個程序,但為了簡化**讓大家更好理解分布式架構,我們將啟動兩個worker並使用單獨的客戶端程序。

首先我們需要安裝和確認tensorflow的版本,注意0.8版本以前的tensorflow不支援分布式,使用以前版本需要重新合patch和打包。

python -c  "import tensorflow; print(tensorflow.__version__)"
如果本地已安裝docker,通過容器使用tensorflow環境更加簡單,只需一行命令。

sudo docker run -it tensorflow/tensorflow bash
docker除了實現資源隔離,還可以管理不同版本的環境,例如可以很容易試用最新的rc版本。

sudo docker run -it tensorflow/tensorflow:r0.9rc0 bash
很多開發者讀過tensorflow官方的distributed guide,想把分布式tensorflow執行起來卻十分困難,主要原因是官方文件沒有提供完整的例子,而且提供的**片段只能在0.9中執行,因此很多人嘗試修改那段**還是跑不起來。

其實分布式tensorflow使用非常簡單,我們並不需要乙個通用的程式,只要用幾行**分別實現服務端和客戶端即可,最簡單的服務端**如下worker1.py。

import tensorflow as tf 

worker1 = "10.235.114.12:2222"
worker2 = "10.235.114.12:2223"
worker_hosts = [worker1, worker2]
cluster_spec = tf.train.clusterspec()
server = tf.train.server(cluster_spec, job_name="worker", task_index=0)
server.join()
這裡我們定義了兩個worker,其中job名都是「worker」,官方文件中還定義了名為「ps」的job,實際上有沒有都可以,而worker可以是本地不同埠的兩個程序或者多台伺服器上的程序。

為了模擬分布式環境,我們編寫worker2.py啟動第二個worker,注意**上稍有區別,因為index變了不能與前面的衝突,為了避免埠被容器隔離我們可以使用原來的docker容器。

可以看到worker1和worker2分別監聽本地的2222和2223埠,接下來可以單獨寫客戶端應用,連線這兩個targe即可。

client的**我們寫得稍微複雜些,就是構造寫線性資料,其中斜率是2、截距是10,如果梯度下降演算法正確的話最終w和b的輸出應該也接近2和10。

如我們所料,最終結果相當接近2和10,同時指定了第乙個worker的cpu來執行梯度下降的演算法,通過cluster spec我們還可以定義更靈活的集群,客戶端也可以通過"tf.device"來動態指定cpu和gpu計算資源。在生產環境下,官方推薦使用ps伺服器儲存variables,而ps其實是和我們定義的worker一樣,只是job名不同,架構可以參見官方文件的tasks圖。

希望通過這個完整的使用教程,大家都能親自實現分布式tensorflow集群,並且編寫靈活的服務端和客戶端應用。

理解和實現分布式TensorFlow集群完整教程

手把手教你搭建分布式集群,進入生產環境的tensorflow 前一篇 分布式tensorflow集群local server使用詳解 我們介紹了分布式tensorflow的基本概念,現在我們可以動手搭建乙個真正的分布式tensorflow集群。分布式tensorflow集群由多個服務端程序和客戶端程...

zookeeper實現分布式鎖和分布式佇列

圖1zookeeper實現分布式鎖的常見方式如圖一所示 每個客戶端想拿到乙個對於 lock下面的鎖就在 lock下面建立乙個零時有序節點,建立完成後判斷是不是當前第乙個節點,如果是就為獲得鎖,釋放鎖就把剛建立的節點刪掉,如果建立的鎖不是當前第乙個就監聽上乙個節點,如果上乙個節點被刪除就說明獲得鎖,同...

分布式和集群的理解

原文 分布式分布式 乙個業務拆分成多個子業務,部署在多個伺服器上。若乙個子業務節點垮了,那整個業務就不能訪問了。舉例 乙個人跑完一千公尺,變成四個人各跑250公尺 四個人都跑完250公尺用的時間會少於乙個人跑1000公尺用的時間,單個節點無法滿足業務需求的時候,採用分布式可減少負載提公升效能和併發,...