分布式接口

创建集群的方法是为每一个任务启动一个服务,这些任务可以分布在不同的机器上,也可以同一台机器上启动多个任务,使用不同的GPU等来运行。每个任务都会创建完成一下工作

  • 1、创建一个tf.train.ClusterSpec,用于对集群中的所有任务进行描述,该描述内容对所有任务应该是相同的

  • 2、创建一个tf.train.Server,用于创建一个任务,并运行相应作业上的计算任务。

Tensorflow的分布式API使用如下:

  • tf.train.ClusterSpec()

创建ClusterSpec,表示参与分布式TensorFlow计算的一组进程

cluster = tf.train.ClusterSpec({"worker": ["worker0.example.com:2222",      /job:worker/task:0
                                           "worker1.example.com:2222",      /job:worker/task:1
                                           "worker2.example.com:2222"],     /job:worker/task:2
                                "ps": ["ps0.example.com:2222",       /job:ps/task:0
                                       "ps1.example.com:2222"]})        /job:ps/task:1

创建Tensorflow的集群描述信息,其中ps和worker为作业名称,通过指定ip地址加端口创建,

  • tf.train.Server(server_or_cluster_def, job_name=None, task_index=None, protocol=None, config=None, start=True)
    • server_or_cluster_def: 集群描述
    • job_name: 任务类型名称
    • task_index: 任务数

创建一个服务(主节点或者工作节点服务),用于运行相应作业上的计算任务,运行的任务在task_index指定的机器上启动,例如在不同的ip+端口上启动两个工作任务

# 第一个任务
cluster = tf.train.ClusterSpec({"worker": ["localhost:2222","localhost:2223"]})
server = tf.train.Server(cluster, job_name="worker", task_index=0)

# 第二个任务
cluster = tf.train.ClusterSpec({"worker": ["localhost:2222","localhost:2223"]})
server = tf.train.Server(cluster, job_name="worker", task_index=1)
  • 属性:target
    • 返回tf.Session连接到此服务器的目标
  • 方法:join()
    • 参数服务器端等待接受参数任务,直到服务器关闭
  • tf.device(device_name_or_function)

工作人任务端的代码在指定的设备上执行张量运算,指定代码运行在CPU或者GPU上

with tf.device("/job:ps/task:0"):
  weights = tf.Variable(...)