tensorflow的分散式計算
阿新 • • 發佈:2021-01-13
gRPC(google remote producer call)框架,一種通訊方式,遠端過程呼叫,對於底層協議的一個封裝,解決一些傳輸錯誤的問題,同步的問題。
七層網路及對應協議:
應用層(Http),表示層,會話層,傳輸層(tcp/udp),網路層(ip),資料鏈路層(ppp),物理層(rj45)
TensorFlow怎麼進行分散式計算?
兩類伺服器:
引數伺服器(parameter server,ps),
工作伺服器(worker):主要功能就是去計算
Tensorflow中,裝置命名的規則:
引數伺服器:可以有多臺,/job:ps/task: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
分散式程式碼:
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()