TensorFlow 分布式

一、簡介

使用單臺機器或者單個GPU/CPU來進行模型訓練,訓練速度會受資源的影響,因為畢竟單個的設備的計算能力和存儲能力具有一定的上限的,針對這個問題,TensorFlow支持分布式模型運算,支持多機器、多GPU、多CPU各種模型的組合運行方案的設計。(默認情況下,TensorFlow程序會將程序運行在第一個GPU上<如果有GPU,并且安裝的TensorFlow支持GPU運行>)

TensorFlow的分布式支持單機多GPU、單機GPU+CPU、多機GPU等結構,不過所有結構的構建方式基本類似。

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

cluster(集群)、job(作業)、task(任務)三者可以簡單的看成是層次關系,task可以看成每臺機器上的一個進程,多個task組成job;job又有:ps、worker兩種,分別用于參數服務、計算服務,組成cluster。

二、構建步驟

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

1、創建集群(Cluster)

  • 創建一個tf.train.ClusterSpec用于對集群中的所有任務進行描述,該描述內容對于所有內容應該是相同的。
  • 創建tf.train.Se中參數傳入構造函數,rver并將tf.train.ClusterSpec

2、使用tf.device API指定運算的設備,構建計算圖,最后提交運算

備注:TensorFlow負責內部作業之間的數據傳輸

三、實現方式

TensorFlow中主要包含兩個方面

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

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

  • 圖內的拷貝(In-Graph Replication)
  • 圖間的拷貝(Between-Graph Replication)
  • 異步訓練(Asynchronous Training)
  • 同步訓練(Synchronous Training)

3.1)在In-Graph Replication

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

備注:在小規模數據集的情況下,經常使用。在海量數據的訓練過程中,不建議使用該方式,建議使用Between-Graph Replication模式。

3.2)在Between-Graph Replication

每個客戶端會構建一個相似的圖結構,該結構中的參數均通過ps作業進行聲明并使用tf.train.replica_device_setter方法將參數映射到不同的任務作業中。

3.3)Synchronous Training

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

3.4)Asynchronous Training

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

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

四、Demo演示

server-demo.py服務器代碼:

import?tensorflow as tf
# 1. 配置服務器相關信息
# 因為tensorflow底層代碼中,默認就是使用ps和work分別表示兩類不同的工作節點
# ps:變量/張量的初始化、存儲相關節點
# work: 變量/張量的計算/運算的相關節點
ps_hosts?=?['127.0.0.1:33331',?'127.0.0.1:33332']
work_hosts?=?['127.0.0.1:33333',?'127.0.0.1:33334',?'127.0.0.1:33335']
cluster?=?tf.train.ClusterSpec({'ps': ps_hosts,?'work': work_hosts})# 2. 定義一些運行參數(在運行該python文件的時候就可以指定這些參數了)
tf.app.flags.DEFINE_string('job_name', default_value='work', docstring="One of 'ps' or 'work'")
tf.app.flags.DEFINE_integer('task_index', default_value=0, docstring="Index of task within the job")
FLAGS?=?tf.app.flags.FLAGS# 2. 啟動服務
def?main(_):print(FLAGS.job_name)server?=?tf.train.Server(cluster,job_name=FLAGS.job_name,task_index=FLAGS.task_index)server.join()
if?__name__?==?'__main__':# 底層默認會調用main方法tf.app.run()

客戶端代碼:client-demo01

import?tensorflow as tf
import?numpy as np
# 1. 構建圖
with tf.device('/job:ps/task:0'):# 2. 構造數據x?=?tf.constant(np.random.rand(100).astype(np.float32))# 3. 使用另外一個機器
with tf.device('/job:work/task:1'):y?=?x?*?0.1?+?0.3# 4. 運行
with tf.Session(target='grpc://127.0.0.1:33335',config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:print(sess.run(y))

執行:

1、通過命令行,進入對應環境:進入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、運行客戶端,最后結果如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454199.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454199.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454199.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第五周測試

---恢復內容開始--- 一 視頻知識 1 linux系統下如何區分內核態與用戶態 在內核態&#xff1a;cs:eip可以是任意的地址&#xff0c;4G的內存地址空間 在用戶態&#xff1a;cs:eip只能訪問0x00000000—0xbfffffff的地址空間 2 系統調用的三層皮&#xff1a;xyz、system_call和sys…

網頁制作小技巧:dl dt dd標簽用法

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 一般我們在做列表的時候通常只會用到ul和li,至于DL一般都很少用到&#xff0c;它也屬于列表類的標簽&#xff0c;下面說一下大概的用法&#xff1a; <dl>標記定義了一個定義列…

latex公式對齊_Word 寫公式最方便的方法

自從用上了word 2016之后&#xff0c;發現他的公式編輯器真香!真香!!他有了latex的優雅&#xff0c;又有了Mathtype的可視化效果&#xff0c;甚至更好哈&#xff0c;當編輯大量公式時也不會因為插件問題卡掉當前的努力。學起來也不復雜&#xff0c;反正是word. 強烈推薦。我們最…

路要怎么走?關于程序員成長的一點思考

程序員的我們&#xff0c;是否想過今后的路該怎么走、如何發展、技術怎樣提高?其實這也是我一直在思考的問題。下面就此問題&#xff0c;分享下我的看法。因為我閱歷有限&#xff0c;有什么說的不對的&#xff0c;大家見諒&#xff0c;千萬不要噴…… 一、程序員應該打好基礎 …

TensorFlow 常見API

數據類型轉換相關API Tensor Shape獲取以及設置相關API Tensor合并、分割相關API Error相關類API 常量類型的Tensor對象相關API 序列和隨機Tensor對象相關API Session相關API 邏輯運算符相關API 比較運算符相關API 調試相關API 圖像處理-編碼解碼相關API 圖像處理-調整大小相關…

python封裝繼承多態_淺談JavaScript的面向對象和它的封裝、繼承、多態

寫在前面既然是淺談&#xff0c;就不會從原理上深度分析&#xff0c;只是幫助我們更好地理解...面向對象與面向過程面向對象和面向過程是兩種不同的編程思想&#xff0c;剛開始接觸編程的時候&#xff0c;我們大都是從面向過程起步的&#xff0c;畢竟像我一樣&#xff0c;大家接…

將萬億以下的阿拉伯數字轉為中文金額

package test.practice.month3; public class Test005 { //可以不用swich case將123456789轉為一二三四五六七八九 //直接用char[] chars {一,二,三,四,五,六,七,八,九}; public static void main(String[] args) { System.out.println(getCMoney(102030405067L)); } private …

8.2 命令歷史

2019獨角獸企業重金招聘Python工程師標準>>> 命令歷史 history //查看之前的命令.bash_history //存放之前敲過的命令&#xff0c;在 /root/ 目錄下最大1000條 //默認參數值是1000條變量HISTSIZE/etc/profile中修改 //在其中可編輯HISTSIZE參數HISTTIMEFORMAT"…

使用GCC生成無格式二進制文件(plain binary files)

使用C語言生成一個二進制文件 使用自己喜歡的文本編輯器寫一個test.c&#xff1a; int main() { } 再使用如下命令編譯&#xff1a; gcc –c test.c ld –o test –Ttext 0x0 –e main test.o objcopy –R .note –R .comment –S –O binary test test.bin 最后生成的二進…

TensorFlow 實例一:線性回歸模型

代碼 # -- encoding:utf-8 -- """ Create by ibf on 2018/5/6 """import numpy as np import tensorflow as tf# 1. 構造一個數據 np.random.seed(28) N 100 x np.linspace(0, 6, N) np.random.normal(loc0.0, scale2, sizeN) y 14 * x - …

python后端數據發送到前端_Python Django 前后端數據交互 之 后端向前端發送數據...

Django 從后臺往前臺傳遞數據時有多種方法可以實現。最簡單的后臺是這樣的&#xff1a;from django.shortcuts import renderdefmain_page(request):return render(request, ‘index.html‘)這個就是返回index.html的內容&#xff0c;但是如果要帶一些數據一起傳給前臺的話&…

Dapper的基本使用

Dapper是.NET下一個micro的ORM&#xff0c;它和Entity Framework或Nhibnate不同&#xff0c;屬于輕量級的&#xff0c;并且是半自動的。也就是說實體類都要自己寫。它沒有復雜的配置文件&#xff0c;一個單文件就可以了。給出官方地址。 http://code.google.com/p/dapper-dot-n…

函數名作為參數傳遞

假如不知道signal的函數原型&#xff0c;考慮child_handler函數的參數從哪里來&#xff1f; void child_handler(int sig) { if (sig SIGINT) kill(pid_parent, SIGUSR1); } int main(void) { ...... signal(SIGINT, child_handler); ...... } 1、…

易語言神經網絡驗證碼識別_遞歸神經網絡 GRU+CTC+CNN 教會驗證碼識別

利用 NLP 技術做簡單數據可視化分析Chat 簡介&#xff1a;用遞歸神經網絡采用端到端識別圖片文字&#xff0c;遞歸神經網絡大家最早用 RNN &#xff0c;缺陷造成梯度消失問題&#xff1b;然后采用了 LSTM&#xff0c;解決 RNN 問題&#xff0c;并且大大提高準確率&#xff1b;現…

GCC 生成的符號表調試信息剖析

GCC把C語言源文件&#xff08;&#xff07;.c&#xff07;&#xff09;編譯成匯編語言文件&#xff08;&#xff07;.s&#xff07;&#xff09;&#xff0c;匯編器把匯編語言文件翻譯成目標文件&#xff08;&#xff07;.o&#xff07;&#xff09;&#xff0c;最后由鏈接器鏈…

《操作系統》OS學習(一):OS相關

清華大學操作系統OS&#xff08;向勇、陳渝&#xff09;視頻地址&#xff1a;http://www.xuetangx.com/courses/course-v1:TsinghuaX30240243Xsp/about 在ucore實驗中&#xff0c;一些基本的常用工具如下&#xff1a; 命令行shell: bash shell -- 有對文件和目錄操作的各種命令…

Android4.0藍牙使能的詳細解析

毫無疑問&#xff0c;bluetooth的打開是在Settings中進行的操作。因此&#xff0c;冤有頭&#xff0c;債有主&#xff0c;我們來到了Settings.java中&#xff0c;果然發現了相關的代碼如下&#xff1a; mBluetoothEnabler new BluetoothEnabler(context, new Switch(context));…

第一次沖刺

本人小組分工角色&#xff1a;產品負責人 本組沖刺訂單介紹&#xff1a;經過小組的成員討論&#xff0c;我們大概確立了一個沖刺的訂單是完成一個簡易的長沙學院網站項目。 最后完成情況概述&#xff1a;經過大約兩周的努力&#xff0c;我們組的編程人員運用python構建了一個簡…

移動端導出excel_連載系列【4】Excel開發移動端quot;APPquot;

前三篇文章介紹了百度地圖生成器、源代碼編輯器、GPS經緯度批量轉換工具、源代碼編輯器中添加自定義功能按鈕和地圖控件。這些寫好的Java Script代碼雖然可以實現所有期望的結果&#xff0c;但畢竟不是一個HTML文件&#xff0c;不便于傳播和使用&#xff0c;更無法變成一個類似…

《操作系統》OS學習(二):啟動、中斷、異常

Bootloader:加載OS。操作系統一開始是放在DISK&#xff08;硬盤&#xff09;中&#xff0c;并不是放在內存中。 BIOS&#xff1a;基本I/O處理系統。存放在ROMRead-Only Memory&#xff09;只讀存儲中 BIOS&#xff08;Basic Input/Output System&#xff09;基本輸入輸出系統。…