-
Notifications
You must be signed in to change notification settings - Fork 558
集群使用
Siran Yang edited this page Jan 16, 2019
·
1 revision
本节详细描述如何在分布式的环境下使用Euler。
Euler在运行时使用全内存存储图数据 ,当单台机器内存无法存储下所有数据,或者需要进行分布式训练时,需要以分布式的方式使用图引擎。
在tf_euler
中,TensorFlow worker可以使用以下的接口来初始化分布式的图。
tf_euler.initialize_shared_graph(
directory, # 图数据路径,目前shared模式仅支持HDFS
zk_addr, # Zookeeper地址,ip:port
zk_path, # Zookeeper根节点,用于协调各个shard
shard_idx, # shard编号
shard_num, # shard总数
global_sampler_type, # 全局采样类型,all / node / edge / none,默认node
graph_type, # graph类型,compact / fast,默认compact
server_thread_num # euler service 线程数,默认4
) # 返回bool,表示图是否初始化成功
执行上面的代码会在每个TensorFlow worker中启用一个图引擎实例,每个实例包含一部分的图。当需要的图数据不在当前进程中时,Euler会使用RPC获取其他实例中的图数据。其中,使用分布式图引擎有以下几点相关的配置:
- 需要将数据进行分片,并将图数据放置在HDFS上;
- 图引擎实例之间使用Zookeeper进行元信息的同步,zk_addr填写统一的Zookeeper服务地址,zk_path填写统一的Zookeeper节点;
- Euler集群将图切分到多个shard中,从0到num_shards - 1编号。每个shard中可以有多个图引擎实例(replica)。
例如,当使用4个TensorFlow worker进行训练,并将数据切分到两个shard中时,可以这样初始化图引擎:
# Worker 0
tf_euler.initialize_shared_graph(
'hdfs://namenode.example.com:9000/euler_data',
'zk.example.com:2181', '/path/for/euler',
0, 2)
# Worker 1
tf_euler.initialize_shared_graph(
'hdfs://namenode.example.com:9000/euler_data',
'zk.example.com:2181', '/path/for/euler',
1, 2)
# Worker 2
tf_euler.initialize_shared_graph(
'hdfs://namenode.example.com:9000/euler_data',
'zk.example.com:2181', '/path/for/euler',
0, 2)
# Worker 3
tf_euler.initialize_shared_graph(
'hdfs://namenode.example.com:9000/euler_data',
'zk.example.com:2181', '/path/for/euler',
1, 2)
最后,由于每个TensorFlow worker中都包含了其他worker可能会访问到的图数据,worker之间需要同步地退出。可以使用以下的Hook来达到这一目的:
tf_euler.utils.hooks.SyncExitHook(num_workers)
上面的部署方案将图引擎部署在和TensorFlow worker相同的一系列进程中,与TensorFlow共享计算资源。为了更好的利用计算资源,用户也可以选择将图引擎部署在一系列独立的进程中:
import euler
euler.start_and_wait(directory, # 图数据目录
loader_type, # 加载类型
hdfs_addr, # HDFS地址
hdfs_port, # HDFS端口
shard_idx, # shard编号
shard_num, # shard总数
zk_addr, # Zookeeper地址,ip:port
zk_path, # Zookeeper根节点,用于协调各个shard
global_sampler_type, # 全局采样类型,all / node / edge / none,默认node
graph_type, # graph类型,compact / fast,默认compact
server_thread_num # euler service 线程数,默认4
)
特别地,当独立的部署图引擎时,可以使用以下的方式在TensorFlow worker中初始化访问接口:
tf_euler.initialize_graph({'mode': 'Remote',
'zk_server': 'zk.example.com:2181',
'zk_path': '/path/for/euler'})