分布式TensorFlow集群使用入门





该文档讲述了如何创建一个最简单的tensorflow分布式的服务,利用tensorflow的local server服务,如果运行一个最简单的分布式例子。

Local server和分布式服务的接口一样,我们将从local server入手,详细解读分布式机器学习集群的用法。





Local server的最简单用法!

TensorFlow官方文档提供了local server的最简单用法,安装TensorFlow后直接在交互式Python终端中执行即可。

注意这里server和client启动在同一个进程了,为什么这么说呢?我们都了解TensorFlow客户端可以用Python或C++编写, 本质上就是构建一个可执行的Graph,而Graph需要在Session中执行,因此代码中只要包含Session()的就是客户端, 这时通过server.target选择本地刚创建的server来执行op。大家可能会好奇server.target是什么, 我们在终端可以输出是'grpc://localhost:38612',一个字符串表示服务端的ip和端口,同时也确认它的协议是Google开源的gRPC。

下面是一个服务端和客户端跑在同一个机器上的最简单的例子

# 
$ python
>>> import tensorflow as tf
>>> c = tf.constant("Hello world!"))
>>> server = tf.train.Server.create_local_server()
>>> sess = tf.Session(server.target)  # Create a session on the server.
>>> sess.run(c)
'Hello world!'

tf.train.Server.create_local_server() 方法使用中间服务器集群创建了一个单一的进程集群。





启动local server服务

前面提到local server和client在同一个进程, 输出结果后服务端和客户端都退出了, 实际上服务端应该以daemon的形式提供服务,local server也可以的。

我们编写local_server.py文件,注意这里调用join()是为了避免进程退出,同样会暴露一个grpc的端口。

# 
$ python
>>> import tensorflow as tf
>>> c = tf.constant("Hello world!"))
>>> server = tf.train.Server.create_local_server()
>>> server.join()  
I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:206] Initialize HostPortsGrpcChannelCache for job local -> {localhost:40767}
I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:202] Started server with target: grpc://localhost:40767






启动客户端服务

启动local server后,我们可以在本地起一个客户端来调用,注意这里local server的地址是

grpc://localhost:40767

然后在另外一台机器上,编写客户端程序:

# 
$ python
>>> import tensorflow as tf
>>> c = tf.constant("Hello world!"))
>>> server_target = "grpc://localhost:40767"
>>> sess = tf.Session(server_target)
>>> print(sess.run(c))
>>> sess.close()  
'Hello world!'

我们看到constant的字符串已经正常输出,有人发现这与单机版的TensorFlow例子很像, 实际上Session的参数不同,并且这个op是在local server进程中执行并返回的,如果使用错误端口就会报RPC请求连接错误。





总结

我们总结一下,TensorFlow的local server实现了与分布式server一样的接口, 通过了解local server的使用和实现我们就更容易理解分布式TensorFlow的使用了。 其中server对象有比较重要的概念就是server.targe, 客户端通过targe找到对应的集群,还有两个函数分别是server.start()和server.join(),就是启动服务和避免进程退出的。



本文介绍了分布式TensorFlow集群中的local server,欢迎大家关注,下期将介绍完整分布式集群的部署和应用。