跳轉到主要內容

TensorFlow™在磚

分布式計算與TensorFlow

TensorFlow支持分布式計算,允許部分圖計算在不同的流程,這可能是完全不同的服務器上!此外,這可以用於分發計算與強大的gpu,服務器和其他計算服務器上做了更多的內存,等等。接口有點複雜,讓我們從頭開始構建。

這是我們的第一個腳本中,我們將運行在一個單一的過程,然後搬到多個進程。

進口tensorflow作為特遣部隊x = tf.constant (2)日元= x +300年y2 = x -66年y = y1 + y2tf.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。如果你有一個備用第二電腦方便,試圖在網絡上這樣做。

Baidu
map