TF 2 5 Tensorflow 分布式訓練

2022-06-17 15:42:15 字數 3671 閱讀 1423

簡介 構建步驟

實現方式

demo演示

1) 使用單台機器或者單個gpu/cpu來進行模型訓練,訓練速度會受資源的影響,因為畢竟單個的裝置的計算能力和儲存能力具有一定的上限的,針對這個問題,tensorflow支援分布式模型運算,支援多機器、多gpu、多cpu各種模型的組合執行方案的設計。(預設情況下,tensorflow程式會將程式執行在第乙個gpu上《如果有gpu,並且安裝的tensorflow支援gpu執行》)

2)tensorflow的分布式支援單機多gpu、單機gpu+cpu、多機gpu等結構,不過所有結構的構建方式基本類似。

3) 除了tensorflow外,caffe、deeplearning4j等也支援分布式訓練,tensorflow中的集群(cluster)指的是一系列能夠對tensorflow中的圖(graph)進行分布式計算的任務(task)。每個任務是同服務(server)相關聯的。tensorflow中的服務會包含乙個用於建立session的主節點和至少乙個用於圖運算的工作節點。另外在tensorflow中,乙個集群可以被拆分為乙個或者多個作業(job),每個作業可以包含至少乙個任務。

4)cluster(集群)、job(作業)、task(任務)概念:三者可以簡單的看成是層次關係,task可以看成每台機器上的乙個程序,多個task組成job;job又有:ps、worker兩種,分別用於引數服務、計算服務,組成cluster。

tensorflow分布式集群的構建主要通過**實現,主要步驟如下:

①建立集群(cluster)

②使用tf.device api指定運算的裝置,構建計算圖,最後提交運算

備註:tensorflow負責內部作業之間的資料傳輸

詳細見最後的實驗**。

tensorflow中主要包含兩個方面

第一:對不同資料大小進行計算的任務(work作業)

第二:用於不停更新共享引數的任務(ps作業)。這樣任務都可以執行不同在機器上,在tensorflow中,主要實現方式如下:

指定整個集群由乙個客戶端來構建圖,並且這個客戶端來提交圖到集群中,worker只負責處理執行任務。in-graph模式的好處在於解耦了tensorflow集群和訓練應用之間的關係,這樣可以提前構建好引數伺服器和計算伺服器,而這些角色本身不需要額外的邏輯**,只需要使用join等待即可,真正的訓練邏輯全部位於客戶端,具有足夠高的靈活性。

備註:在小規模資料集的情況下,經常使用。在海量資料的訓練過程中,不建議使用該方式,建議使用between-graph replication模式。

每個客戶端會構建乙個相似的圖結構,該結構中的引數均通過ps作業進行宣告並使用tf.train.replica_device_setter方法將引數對映到不同的任務作業中。

在同步訓練中,每個graph的副本讀取相同的parameter值,並行的計算,然後將計算完的結果放到一起處理。在tensorflow中,如果是betweengraph replication的情況下,可以通tf.train.syncreplicasoptimizer來處理,如果是in-graph replication情況下,直接對結果進行處理即可(比如平均).

在非同步訓練中,每個任務計算完後,就會直接使用計算出的結果更新parameter值。不同的任務之間不存在協調進度。

同步訓練需要等待最慢的乙個任務執行完後,才可用更新引數;非同步訓練中,可以每執行完乙個任務,就更新一次引數。一般情況下,建議使用非同步訓練。

1 	import tensorflow as tf

2 # 1. 配置伺服器相關資訊

3 # 因為tensorflow底層**中,預設就是使用ps和work分別表示兩類不同的工作節點

5 # work: 變數/張量的計算/運算的相關節點

6 ps_hosts = ['127.0.0.1:33331', '127.0.0.1:33332']

7 work_hosts = ['127.0.0.1:33333', '127.0.0.1:33334', '127.0.0.1:33335']

8 cluster = tf.train.clusterspec()

9 # 2. 定義一些執行引數(在執行該python檔案的時候就可以指定這些引數了)

13 # 2. 啟動服務

14 def main(_):

15 print(flags.job_name)

16 server = tf.train.server(cluster, job_name=flags.job_name, task_index=flags.task_index)

17 server.join()

18 if __name__ == '__main__':

19 # 底層缺省會呼叫main方法

1 import tensorflow as tf

2 import numpy as np

3 # 1. 構建圖

4 with tf.device('/job:ps/task:0'):

5 # 2. 構造資料

6 x = tf.constant(np.random.rand(100).astype(np.float32))

7 # 3. 使用另外乙個機器

8 with tf.device('/job:work/task:1'):

9 y = x * 0.1 + 0.3

10 # 4. 執行

11 with tf.session(target='grpc:',

12 config=tf.configproto(log_device_placement=true, allow_soft_placement=true)) as sess:

13 print(sess.run(y))

執行:1、通過命令列,進入對應環境:我的是activate tensorflow-gpu,再進入對應server-demo.py所在資料夾,重複開啟5個,分別輸入(雖然最後結果只是在最後3335中顯示,但是必須要全部執行,才能運算出結果):

python server-demo.py --job_name=ps --task_index=0

python server-demo.py --job_name=ps --task_index=1

python server-demo.py --job_name=work --task_index=0

python server-demo.py --job_name=work --task_index=1

python server-demo.py --job_name=work --task_index=2

2、執行客戶端,最後結果如下:

深度學習 tensorflow入門 tf讀入資料

同步讀取資料 import tensorflow as tf 模擬一下同步先處理資料,然後才能取訓練資料 tensorflow中,執行操作有依賴性 1 首先定義佇列 q tf.fifoqueue 3,tf.float32 放入一些資料 enq many q.enqueue many 0.1,0.2,...

tf 損失函式 TensorFlow裡面損失函式

2 交叉熵 交叉熵 crossentropy 也是loss演算法的一種,一般用在分類問題上,表達的意識為 輸入樣本屬於某一類的概率 其表示式如下,其中y代表真實值分類 0或1 a代表 值。在tensorflow中常見的交叉熵函式有 sigmoid交叉熵 softmax交叉熵 sparse交叉熵 加權...

PTA 結繩 25分 25分???

給定一段一段的繩子,你需要把它們串成一條繩。每次串連的時候,是把兩段繩子對折,再如下圖所示套接在一起。這樣得到的繩子又被當成是另一段繩子,可以再次對折去跟另一段繩子串連。每次串連後,原來兩段繩子的長度就會減半。給定 n 段繩子的長度,你需要找出它們能串成的繩子的最大長度。每個輸入包含 1 個測試用例...