日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【深度学习】初识tensorflow之分布式训练

發布時間:2025/3/21 pytorch 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】初识tensorflow之分布式训练 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

情況一、單機單卡

單機單卡是最普通的情況,當然也是最簡單的,示例代碼如下:

#coding=utf-8 #單機單卡 #對于單機單卡,可以把參數和計算都定義再gpu上,不過如果參數模型比較大,顯存不足等情況,就得放在cpu上 import tensorflow as tfwith tf.device('/cpu:0'):#也可以放在gpu上w=tf.get_variable('w',(2,2),tf.float32,initializer=tf.constant_initializer(2))b=tf.get_variable('b',(2,2),tf.float32,initializer=tf.constant_initializer(5))with tf.device('/gpu:0'):addwb=w+bmutwb=w*bini=tf.initialize_all_variables() with tf.Session() as sess:sess.run(ini)np1,np2=sess.run([addwb,mutwb])print np1print np2

情況二、單機多卡

單機多卡,只要用device直接指定設備,就可以進行訓練,SGD采用各個卡的平均值,示例代碼如下:

#coding=utf-8 #單機多卡: #一般采用共享操作定義在cpu上,然后并行操作定義在各自的gpu上,比如對于深度學習來說,我們一把把參數定義、參數梯度更新統一放在cpu上 #各個gpu通過各自計算各自batch 數據的梯度值,然后統一傳到cpu上,由cpu計算求取平均值,cpu更新參數。 #具體的深度學習多卡訓練代碼,請參考:https://github.com/tensorflow/models/blob/master/inception/inception/inception_train.py import tensorflow as tfwith tf.device('/cpu:0'):w=tf.get_variable('w',(2,2),tf.float32,initializer=tf.constant_initializer(2))b=tf.get_variable('b',(2,2),tf.float32,initializer=tf.constant_initializer(5))with tf.device('/gpu:0'):addwb=w+b with tf.device('/gpu:1'):mutwb=w*bini=tf.initialize_all_variables() with tf.Session() as sess:sess.run(ini)while 1:print sess.run([addwb,mutwb])

?

情況三、多機多卡

一、基本概念

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

二、同步SGD與異步SGD

1、所謂的同步更新指的是:各個用于并行計算的電腦,計算完各自的batch 后,求取梯度值,把梯度值統一送到ps服務機器中,由ps服務機器求取梯度平均值,更新ps服務器上的參數。

如下圖所示,可以看成有四臺電腦,第一臺電腦用于存儲參數、共享參數、共享計算,可以簡單的理解成內存、計算共享專用的區域,也就是ps job;另外三臺電腦用于并行計算的,也就是worker task。

這種計算方法存在的缺陷是:每一輪的梯度更新,都要等到A、B、C三臺電腦都計算完畢后,才能更新參數,也就是迭代更新速度取決與A、B、C三臺中,最慢的那一臺電腦,所以采用同步更新的方法,建議A、B、C三臺的計算能力相當。

2、所謂的異步更新指的是:ps服務器收到只要收到一臺機器的梯度值,就直接進行參數更新,無需等待其它機器。這種迭代方法比較不穩定,收斂曲線震動比較厲害,因為當A機器計算完更新了ps中的參數,可能B機器還是在用上一次迭代的舊版參數值。

三、代碼編寫

1、定義集群

比如假設上面的圖所示,我們有四臺電腦,四臺電腦的名字假設為:A、B、C、D,那么集群可以定義如下:

#coding=utf-8 #多臺機器,每臺機器有一個顯卡、或者多個顯卡,這種訓練叫做分布式訓練 import tensorflow as tf #現在假設我們有A、B、C、D四臺機器,首先需要在各臺機器上寫一份代碼,并跑起來,各機器上的代碼內容大部分相同 # ,除了開始定義的時候,需要各自指定該臺機器的task之外。以機器A為例子,A機器上的代碼如下: cluster=tf.train.ClusterSpec({"worker": ["A_IP:2222",#格式 IP地址:端口號,第一臺機器A的IP地址 ,在代碼中需要用這臺機器計算的時候,就要定義:/job:worker/task:0"B_IP:1234"#第二臺機器的IP地址 /job:worker/task:1"C_IP:2222"#第三臺機器的IP地址 /job:worker/task:2],"ps": ["D_IP:2222",#第四臺機器的IP地址 對應到代碼塊:/job:ps/task:0]})

然后我們需要寫四分代碼,這四分代碼文件大部分相同,但是有幾行代碼是各不相同的。

2、在各臺機器上,定義server

比如A機器上的代碼server要定義如下:

server=tf.train.Server(cluster,job_name='worker',task_index=0)#找到‘worker’名字下的,task0,也就是機器A

3、在代碼中,指定device

with tf.device('/job:ps/task:0'):#參數定義在機器D上w=tf.get_variable('w',(2,2),tf.float32,initializer=tf.constant_initializer(2))b=tf.get_variable('b',(2,2),tf.float32,initializer=tf.constant_initializer(5))with tf.device('/job:worker/task:0/cpu:0'):#在機器A cpu上運行addwb=w+b with tf.device('/job:worker/task:1/cpu:0'):#在機器B cpu上運行mutwb=w*b with tf.device('/job:worker/task:2/cpu:0'):#在機器C cpu上運行divwb=w/b

在深度學習訓練中,一般圖的計算,對于每個worker task來說,都是相同的,所以我們會把所有圖計算、變量定義等代碼,都寫到下面這個語句下:

with tf.device(tf.train.replica_device_setter(worker_device='/job:worker/task:indexi',cluster=cluster)):

函數replica_deviec_setter會自動把變量參數定義部分定義到ps服務中(如果ps有多個任務,那么自動分配)。下面舉個例子,假設現在有兩臺機器A、B,A用于計算服務,B用于參數服務,那么代碼如下:

#coding=utf-8 #上面是因為worker計算內容各不相同,不過在深度學習中,一般每個worker的計算內容是一樣的, # 以為都是計算神經網絡的每個batch 前向傳導,所以一般代碼是重用的 import tensorflow as tf #現在假設我們有A、B臺機器,首先需要在各臺機器上寫一份代碼,并跑起來,各機器上的代碼內容大部分相同 # ,除了開始定義的時候,需要各自指定該臺機器的task之外。以機器A為例子,A機器上的代碼如下: cluster=tf.train.ClusterSpec({"worker": ["192.168.11.105:1234",#格式 IP地址:端口號,第一臺機器A的IP地址 ,在代碼中需要用這臺機器計算的時候,就要定義:/job:worker/task:0],"ps": ["192.168.11.130:2223"#第四臺機器的IP地址 對應到代碼塊:/job:ps/task:0]})#不同的機器,下面這一行代碼各不相同,server可以根據job_name、task_index兩個參數,查找到集群cluster中對應的機器isps=False if isps:server=tf.train.Server(cluster,job_name='ps',task_index=0)#找到‘worker’名字下的,task0,也就是機器Aserver.join() else:server=tf.train.Server(cluster,job_name='worker',task_index=0)#找到‘worker’名字下的,task0,也就是機器Awith tf.device(tf.train.replica_device_setter(worker_device='/job:worker/task:0',cluster=cluster)):w=tf.get_variable('w',(2,2),tf.float32,initializer=tf.constant_initializer(2))b=tf.get_variable('b',(2,2),tf.float32,initializer=tf.constant_initializer(5))addwb=w+bmutwb=w*bdivwb=w/bsaver = tf.train.Saver() summary_op = tf.merge_all_summaries() init_op = tf.initialize_all_variables() sv = tf.train.Supervisor(init_op=init_op, summary_op=summary_op, saver=saver) with sv.managed_session(server.target) as sess:while 1:print sess.run([addwb,mutwb,divwb])

把該代碼在機器A上運行,你會發現,程序會進入等候狀態,等候用于ps參數服務的機器啟動,才會運行。因此接著我們在機器B上運行如下代碼:

#coding=utf-8 #上面是因為worker計算內容各不相同,不過再深度學習中,一般每個worker的計算內容是一樣的, # 以為都是計算神經網絡的每個batch 前向傳導,所以一般代碼是重用的 #coding=utf-8 #多臺機器,每臺機器有一個顯卡、或者多個顯卡,這種訓練叫做分布式訓練 import tensorflow as tf #現在假設我們有A、B、C、D四臺機器,首先需要在各臺機器上寫一份代碼,并跑起來,各機器上的代碼內容大部分相同 # ,除了開始定義的時候,需要各自指定該臺機器的task之外。以機器A為例子,A機器上的代碼如下: cluster=tf.train.ClusterSpec({"worker": ["192.168.11.105:1234",#格式 IP地址:端口號,第一臺機器A的IP地址 ,在代碼中需要用這臺機器計算的時候,就要定義:/job:worker/task:0],"ps": ["192.168.11.130:2223"#第四臺機器的IP地址 對應到代碼塊:/job:ps/task:0]})#不同的機器,下面這一行代碼各不相同,server可以根據job_name、task_index兩個參數,查找到集群cluster中對應的機器isps=True if isps:server=tf.train.Server(cluster,job_name='ps',task_index=0)#找到‘worker’名字下的,task0,也就是機器Aserver.join() else:server=tf.train.Server(cluster,job_name='worker',task_index=0)#找到‘worker’名字下的,task0,也就是機器Awith tf.device(tf.train.replica_device_setter(worker_device='/job:worker/task:0',cluster=cluster)):w=tf.get_variable('w',(2,2),tf.float32,initializer=tf.constant_initializer(2))b=tf.get_variable('b',(2,2),tf.float32,initializer=tf.constant_initializer(5))addwb=w+bmutwb=w*bdivwb=w/bsaver = tf.train.Saver() summary_op = tf.merge_all_summaries() init_op = tf.initialize_all_variables() sv = tf.train.Supervisor(init_op=init_op, summary_op=summary_op, saver=saver) with sv.managed_session(server.target) as sess:while 1:print sess.run([addwb,mutwb,divwb])

分布式訓練需要熟悉的函數:

tf.train.Server tf.train.Supervisor tf.train.SessionManager tf.train.ClusterSpec tf.train.replica_device_setter tf.train.MonitoredTrainingSession tf.train.MonitoredSession tf.train.SingularMonitoredSession tf.train.Scaffold tf.train.SessionCreator tf.train.ChiefSessionCreator tf.train.WorkerSessionCreator

轉自:https://blog.csdn.net/hjimce/article/details/61197190

總結

以上是生活随笔為你收集整理的【深度学习】初识tensorflow之分布式训练的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。