TensorFlow™在磚
分布式計算與TensorFlow
TensorFlow支持分布式計算,允許部分圖計算在不同的流程,這可能是完全不同的服務器上!此外,這可以用於分發計算與強大的gpu,服務器和其他計算服務器上做了更多的內存,等等。接口有點複雜,讓我們從頭開始構建。
這是我們的第一個腳本中,我們將運行在一個單一的過程,然後搬到多個進程。
進口tensorflow作為特遣部隊x = tf.constant (2)日元= x +300年y2 = x -66年y = y1 + y2與tf.Session ()作為稅:結果= sess.run (y)打印(結果)
到目前為止,這個腳本不應該嚇到你太多。我們有一個常數,和三個基本方程。結果(238年)最後會被打印出來。
TensorFlow工作有點像於服務器-客戶機模式。的想法是創建一個堆的工人執行繁重。然後創建一個會話的工人,並將計算圖,可能部分分發到其他集群服務器上。
為了做到這一點,主要的工人,主,需要知道其他工人。這是通過創建ClusterSpec,你需要傳遞給所有工人。ClusterSpec是使用一個字典,關鍵是一個“工作名稱”,和每個作業包含了許多工人。
下麵是圖的樣子。
下麵的代碼創建了一個ClusterSpect工作名稱的“本地”和兩個工作進程。
注意,這些過程不是從這段代碼中,創建一個引用,它們將開始。
進口tensorflow作為特遣部隊集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})
接下來,我們開始這個過程。要做到這一點,我們圖其中一個工人,並開始:
服務器= tf.train。服務器(集群,job_name =“本地”task_index =1)
上麵的代碼開始“localhost: 2223”工人在“本地”工作。
下麵是一個腳本,您可以從命令行運行啟動兩個過程。保存代碼在您的計算機上create_worker.py
和運行python create_worker。py 0
然後python create_worker。py 1
。要做到這一點,你需要獨立終端為腳本不完成自己的(他們在等待指令)。
#從命令行得到任務數量進口systask_number =int(sys.argv [1])進口tensorflow作為特遣部隊集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})服務器= tf.train。服務器(集群,job_name =“本地”,task_index = task_number)打印(“啟動服務器# {}”。格式(task_number))server.start ()0server.join ()
這樣做之後,你會發現兩個終端上運行的服務器。我們已經準備好發布!
“分發”工作的最簡單的方法就是創建一個會話這些流程,然後執行圖。隻是改變了“會話”在上麵的行:
與tf.Session (“grpc: / / localhost: 2222”)作為稅:
現在,這並不分發一樣多發送服務器的工作。TensorFlow可能分發處理到集群中的其他資源,但它可能不是。我們可以力通過指定設備與gpu(就像我們上節課):
進口tensorflow作為特遣部隊
集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})x = tf.constant (2)
與tf.device (“/工作:本地/任務:1”):y2 = x -66年與tf.device (“/工作:本地/任務:0”):日元= x +300年y = y1 + y2
與tf.Session (“grpc: / / localhost: 2222”)作為稅:結果= sess.run (y)打印(結果)
現在我們正在分發!本作品由工人分配任務,根據名稱和數量的任務。格式是:
/工作:JOB_NAME /任務:TASK_NUMBER
與多個崗位(即識別電腦大gpu),我們可以在許多不同的方式分配處理。
Map和Reduce
MapReduce是一個流行的執行大型操作範式。它是由兩個主要步驟(盡管在實踐中有一些更多)。
被稱為第一步地圖,意思是“把這個東西的列表,並將此函數應用於每個人”。你可以做一個地圖在正常python這樣的:
defmyfunction(x):返回x +5map_result =地圖(myfunction (1,2,3])打印(列表(map_result))
第二步是一個減少,意思是“把這個東西的列表,並使用這個函數結合起來”。一個共同的和減少操作——我。e”把這個數字列表並把它們都通過添加”,這可以通過創建一個執行函數,添加了兩個數字。減少所做的是需要第一個列表的兩個值,執行功能,需要的結果,然後執行函數結果和未來價值。求和,我們把前兩個數字,結果,添加用下一個號碼,等等,直到我們達到的最後名單。再次,減少是正常的一部分python(盡管這不是分布式):
從functools進口減少def添加(a、b):返回a + b打印(減少(添加,1,2,3)))
注意,你應該從來沒有真正需要使用減少,隻是使用一個for循環。
分布式TensorFlow,執行map和reduce操作是許多重要項目的關鍵構件。例如,一個學習可能發送多個工人個人機器學習模型,然後結合分類形成最終的結果。另一個例子是一個過程
這是另一個基本的腳本,我們將分發:
進口numpy作為np進口tensorflow作為特遣部隊x = tf.placeholder (tf.float32One hundred.)
意味著= tf.reduce_mean (x)
與tf.Session ()作為稅:結果= sess.run(意思是,feed_dict = {x: np.random.random (One hundred.)})打印(結果)
進口numpy作為np進口tensorflow作為特遣部隊x = tf.placeholder (tf.float32One hundred.)
意味著= tf.reduce_mean (x)
與tf.Session ()作為稅:結果= sess.run(意思是,feed_dict = {x: np.random.random (One hundred.)})打印(結果)
轉換成一個分布式的版本隻是一個變更之前的轉換:
進口numpy作為np進口tensorflow作為特遣部隊集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})x = tf.placeholder (tf.float32One hundred.)
與tf.device (“/工作:本地/任務:1”):first_batch =特遣部隊。片(x, (0]、[50])mean1 = tf.reduce_mean (first_batch)與tf.device (“/工作:本地/任務:0”):second_batch =特遣部隊。片(x, (50]、[-1])非常刻薄的= tf.reduce_mean (second_batch)意味著= (mean1 +非常刻薄)/2
與tf.Session (“grpc: / / localhost: 2222”)作為稅:結果= sess.run(意思是,feed_dict = {x: np.random.random (One hundred.)})打印(結果)
你會發現分布計算過程更容易,如果你把它的地圖和減少。首先,“我怎麼能把這個問題分成子問題,可以獨立解決?”——有你的地圖。第二,“我怎麼能結合形成一個最終結果的答案?”——你的減少。
在機器學習中,地圖的最常見的方法就是把你的數據集。線性模型和神經網絡通常很擅長這個,因為他們可以單獨訓練,然後結合。
1)改變“當地”這個詞在ClusterSpec別的東西。你還需要改變腳本中讓它工作嗎?
2)平均腳本目前依賴的片都是一樣的尺寸。嚐試用不同的sized-slices,觀察誤差。解決這個問題通過使用tf.size
和下麵的公式結合平均片:
overall_average = ((size_slice_1 * mean_slice_1) + (size_slice_2 * mean_slice_2) +…) / total_size
3)您可以指定遠程計算機上的設備通過修改設備的字符串。作為一個例子“/工作:本地/任務:0 / gpu: 0”將針對gpu在本地工作。創建一個工作,利用遠程GPU。如果你有一個備用第二電腦方便,試圖在網絡上這樣做。