1. 程式人生 > 其它 >tensorflow的分散式計算

tensorflow的分散式計算

技術標籤:深度學習python深度學習tensorflow

gRPC(google remote producer call)框架,一種通訊方式,遠端過程呼叫,對於底層協議的一個封裝,解決一些傳輸錯誤的問題,同步的問題。

七層網路及對應協議:
應用層(Http),表示層,會話層,傳輸層(tcp/udp),網路層(ip),資料鏈路層(ppp),物理層(rj45)

TensorFlow怎麼進行分散式計算?
兩類伺服器:
引數伺服器(parameter server,ps),
工作伺服器(worker):主要功能就是去計算
Tensorflow中,裝置命名的規則
引數伺服器:可以有多臺,/job:ps/task:0

工作伺服器 :可以有多臺,/job:worker:task:0/cpu:0
其中0有幾臺就改變,比如第二臺工作伺服器,使用第二個gpu
寫為:/job:worker:task:1/gpu:1
分散式更新引數的模式:協調儲存更新引數:
(1)同步模式更新:比如:worker1得到變化值1,worker2得到變化值2,將兩個變化值傳到ps,求平均值,然後更新。同步是因為每個伺服器有時間快慢,需要等到所有伺服器都傳到變化值,一起更新
(2)非同步模式更新:比如:worker1得到變化值1,worker2得到變化值2,每個伺服器執行處理完後,及時將值傳到ps,直接計算。可以提高速度,不用顧慮單個伺服器的效能
梯度下降:w’=w-a(方向)變化量1
W’’=w’-a(方向)-變化量2
在這裡插入圖片描述
分散式程式碼:

import tensorflow as tf
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string("job_name", " ","啟動服務的型別ps or worker")
tf.app.flags.DEFINE_integer("task_index", 0,"指定ps或者worker當中的哪一臺伺服器以task:0,task:1標記")
def main(argv):
    #定義全域性計數的op,給鉤子列表當中的訓練步數使用
global_step = tf.contrib.framework.get_or_create_global_step() #指定叢集描述物件,ps,worker cluster = tf.train.ClusterSpec({"ps":["10.211.55.3"],"worker":["192.168.65.44:2222"]}) #指定建立不同的服務,ps,worker server = tf.train.Server(cluster, job_name=FLAGS.job_name, task_index=FLAGS.task_index) #根據不同的服務做不同的事情,ps更新儲存引數,worker指定裝置去執行模型計算 if FLAGS.job_name=="ps": #引數伺服器什麼都不用做,只需等待worker傳遞引數 server.join() else: worker_device="/job:worker/task:0/cpu:0/" #可以指定裝置去執行 with tf.device(tf.train.replica_device_setter( worker_device=worker_device, cluster=cluster )): #簡單做一個矩陣乘法運算 x = tf.Variable([[1,2,3,4]]) w = tf.Variable([[2],[2],[3],[4]]) mat = tf.matmul(x,w) #建立分散式會話 with tf.train.MonitoredTrainingSession( master = "grpc://192.168.65.44.2222",#指定主worker is_chief = (FLAGS.task_index==0),#判斷是否主worker config= tf.ConfigProto(log_device_placement=True),#列印裝置資訊 hooks=[tf.train.StopAtStepHook(last_step=200)] ) as mon_sess: while not mon_sess.should_stop(): print(mon_sess.run(mat)) if __name__ == "__main__": tf.app.run()