Euler2.0分布式训练遇到问题
Je-vie opened this issue · comments
我先贴上我的分布式运行脚本:
我先跑了example/gat/run_gat.py 成功,过程中产生了 cora文件,里面 包含euler/Node euler/Edge等,各包含10个.dat 文件
我将euler文件作为data_dir
def main(_):
flags_obj = tf.flags.FLAGS
if flags_obj.local:
local_test()
if flags_obj.tfdist:
job_name = flags_obj.job_name
if job_name == "start_euler":
start_euler()
elif job_name == "worker":
start_tf()
elif job_name == "ps":
start_tf()
def start_euler():
flags_obj = tf.flags.FLAGS
# ------------- euler start ----------------
data_dir = flags_obj.data_dir # cora/euler文件
shard_idx = flags_obj.shard_idx
shard_num = flags_obj.shard_num
zk_addr = flags_obj.zk_addr
zk_path = flags_obj.zk_path
euler.start(
directory=data_dir, # 图数据路径 生成二进制的euler文件
shard_idx=shard_idx, # 当前启动的进程为k号shard
shard_num=shard_num, # 一共有N个shard
zk_addr=zk_addr, # Zookeeper address, ip:port
zk_path=zk_path, # Zookeeper path
#module=euler.Module.DEFAULT_MODULE)
module=(euler.Module.NODE | euler.Module.EDGE))
while True:
time.sleep(1)
def start_tf():
...
tf_config = {
'cluster': {'chief': chief_hosts, 'worker': worker_hosts, 'ps': ps_hosts},
'task': {'type': job_name, 'index': task_index}
}
os.environ['TF_CONFIG'] = json.dumps(tf_config)
model = ... # 省略
params = {...}
if not job_name == "ps":
print("init graph........")
tf_euler.initialize_graph({
'mode': 'remote',
'zk_server': zk_addr,
'zk_path': zk_path,
'shard_num': shard_num,
'num_retries': 1
})
# ------------init estimator---------------
print("start train...")
tf.logging.set_verbosity(tf.logging.INFO)
# Estimator的创建与训练/验证/预测
config = tf.estimator.RunConfig(log_step_count_steps=None)
base_estimator = NodeEstimator(model, params, config)
base_estimator.train_and_evaluate()
然后 在本地模拟tf的分布式
# dist 两个机器负责load数据, 一个chief 一个worker 一个ps
python gat_euler_htj.py --tfdist=True --job_name='start_euler' --shard_idx=0 --shard_name=2 --data_dir="/workspace/tony_test/htj_gat/cora_dist/euler"
python gat_euler_htj.py --tfdist=True --job_name='start_euler' --shard_idx=1 --shard_name=2 --data_dir="/workspace/tony_test/htj_gat/cora_dist/euler"
# tf 分布式 cluster
python gat_euler_htj.py --tfdist=True --job_name='worker' --task_index=0 --ps_hosts = "localhost:2222" --worker_hosts="localhost:2223, localhost:2224" # chief
python gat_euler_htj.py --tfdist=True --job_name='worker' --task_index=1 --ps_hosts = "localhost:2222" --worker_hosts="localhost:2223, localhost:2224" # worker
python gat_euler_htj.py --tfdist=True --job_name='ps' --task_index=0 --ps_hosts = "localhost:2222" --worker_hosts="localhost:2223, localhost:2224" # ps
然后挨个执行
其中: load数据的两个机器 成功: server started successfully
ps 成功: Started server with target: grpc://localhost:2222
worker 和chief的机器失败:
报错信息: E0802 12:06:26.013273386 55381 completion_queue.cc:469] assertion failed: cq_event_queue_num_items(&cqd->queue) == 0 已放弃 (core dumped)
想问一下 这是什么原因,是这个脚本代码有问题吗?还是euler的问题?能够提供解决思路呢?
你好,我想问下你的shard_idx 是怎么来的?
shard_num(s) 应该怎样确定?
你好,我想问下你的shard_idx 是怎么来的?
shard_num(s) 应该怎样确定?
我是这么理解的,shard_num = 2,是自己定的,我看有10个dat文件,那么我打算用两个机器来load这些子图,两个机器上的shard_idx 分别为 0 和1,这样,连个机器分别处理 0.dat 2.dat 4.dat 6.dat 8.dat 和 1.dat 3.dat 5.dat 7.dat 9.dat
我先贴上我的分布式运行脚本:
我先跑了example/gat/run_gat.py 成功,过程中产生了 cora文件,里面 包含euler/Node euler/Edge等,各包含10个.dat 文件
我将euler文件作为data_dirdef main(_): flags_obj = tf.flags.FLAGS if flags_obj.local: local_test() if flags_obj.tfdist: job_name = flags_obj.job_name if job_name == "start_euler": start_euler() elif job_name == "worker": start_tf() elif job_name == "ps": start_tf() def start_euler(): flags_obj = tf.flags.FLAGS # ------------- euler start ---------------- data_dir = flags_obj.data_dir # cora/euler文件 shard_idx = flags_obj.shard_idx shard_num = flags_obj.shard_num zk_addr = flags_obj.zk_addr zk_path = flags_obj.zk_path euler.start( directory=data_dir, # 图数据路径 生成二进制的euler文件 shard_idx=shard_idx, # 当前启动的进程为k号shard shard_num=shard_num, # 一共有N个shard zk_addr=zk_addr, # Zookeeper address, ip:port zk_path=zk_path, # Zookeeper path #module=euler.Module.DEFAULT_MODULE) module=(euler.Module.NODE | euler.Module.EDGE)) while True: time.sleep(1) def start_tf(): ... tf_config = { 'cluster': {'chief': chief_hosts, 'worker': worker_hosts, 'ps': ps_hosts}, 'task': {'type': job_name, 'index': task_index} } os.environ['TF_CONFIG'] = json.dumps(tf_config) model = ... # 省略 params = {...} if not job_name == "ps": print("init graph........") tf_euler.initialize_graph({ 'mode': 'remote', 'zk_server': zk_addr, 'zk_path': zk_path, 'shard_num': shard_num, 'num_retries': 1 }) # ------------init estimator--------------- print("start train...") tf.logging.set_verbosity(tf.logging.INFO) # Estimator的创建与训练/验证/预测 config = tf.estimator.RunConfig(log_step_count_steps=None) base_estimator = NodeEstimator(model, params, config) base_estimator.train_and_evaluate()
然后 在本地模拟tf的分布式
# dist 两个机器负责load数据, 一个chief 一个worker 一个ps python gat_euler_htj.py --tfdist=True --job_name='start_euler' --shard_idx=0 --shard_name=2 --data_dir="/workspace/tony_test/htj_gat/cora_dist/euler" python gat_euler_htj.py --tfdist=True --job_name='start_euler' --shard_idx=1 --shard_name=2 --data_dir="/workspace/tony_test/htj_gat/cora_dist/euler" # tf 分布式 cluster python gat_euler_htj.py --tfdist=True --job_name='worker' --task_index=0 --ps_hosts = "localhost:2222" --worker_hosts="localhost:2223, localhost:2224" # chief python gat_euler_htj.py --tfdist=True --job_name='worker' --task_index=1 --ps_hosts = "localhost:2222" --worker_hosts="localhost:2223, localhost:2224" # worker python gat_euler_htj.py --tfdist=True --job_name='ps' --task_index=0 --ps_hosts = "localhost:2222" --worker_hosts="localhost:2223, localhost:2224" # ps
然后挨个执行
其中: load数据的两个机器 成功: server started successfully
ps 成功: Started server with target: grpc://localhost:2222
worker 和chief的机器失败:
报错信息:E0802 12:06:26.013273386 55381 completion_queue.cc:469] assertion failed: cq_event_queue_num_items(&cqd->queue) == 0 已放弃 (core dumped)
想问一下 这是什么原因,是这个脚本代码有问题吗?还是euler的问题?能够提供解决思路呢?
不好意思,问题找到了,查看core 发现是grpc服务没启动成功,没成功的原因是我端口号被占用了。
gat_euler_htj.py 文件是自己写的吗?
gat_euler_htj.py 文件是你自己写的吗?
是的
gat_euler_htj.py 文件是自己写的吗?
就是我贴出来这个代码
噢噢,那上面没有导包啥的吗,上来就是main函数吗?
噢噢,那上面没有导包啥的吗,上来就是main函数吗?
只是摘了部分内容,
那方便把这个文件借我参考下吗?我的分布式也有类似的问题
那方便把这个文件借我参考下吗?我的分布式也有类似的问题
你可以参考 example/run_gat.py ,以及结合https://github.com/alibaba/euler/wiki/Euler-2.0-%E5%9C%A8%E5%A4%A7%E8%A7%84%E6%A8%A1%E5%9B%BE%E4%B8%8A%E7%9A%84%E5%BA%94%E7%94%A8
那方便把这个文件借我参考下吗?我的分布式也有类似的问题
你可以参考 example/run_gat.py ,以及结合https://github.com/alibaba/euler/wiki/Euler-2.0-%E5%9C%A8%E5%A4%A7%E8%A7%84%E6%A8%A1%E5%9B%BE%E4%B8%8A%E7%9A%84%E5%BA%94%E7%94%A8
你好,我现在也生成了10个数据文件,但是还有一些问题请教下:
- 用什么办法实现每个机器读5个文件 (是自己手动分到两台服务器吗)
- 你的代码上的 flags_obj 是怎么来的
麻烦有时间解答下。
跑这个项目需要自己手动安装Zookeeper吗?
zk_path是怎么配置的?
那方便把这个文件借我参考下吗?我的分布式也有类似的问题
你可以参考 example/run_gat.py ,以及结合https://github.com/alibaba/euler/wiki/Euler-2.0-%E5%9C%A8%E5%A4%A7%E8%A7%84%E6%A8%A1%E5%9B%BE%E4%B8%8A%E7%9A%84%E5%BA%94%E7%94%A8
你好,我现在也生成了10个数据文件,但是还有一些问题请教下:
- 用什么办法实现每个机器读5个文件 (是自己手动分到两台服务器吗)
用hdfs,或者把10个文件分别都放到两台机器上- 你的代码上的 flags_obj 是怎么来的
麻烦有时间解答下。
跑这个项目需要自己手动安装Zookeeper吗?
需要自己安装zk
zk_path是怎么配置的?
跑这个项目需要自己手动安装Zookeeper吗?
需要自己安装zk
zk_path是怎么配置的?
好的,我试试
那方便把这个文件借我参考下吗?我的分布式也有类似的问题
你可以参考 example/run_gat.py ,以及结合https://github.com/alibaba/euler/wiki/Euler-2.0-%E5%9C%A8%E5%A4%A7%E8%A7%84%E6%A8%A1%E5%9B%BE%E4%B8%8A%E7%9A%84%E5%BA%94%E7%94%A8
那方便把这个文件借我参考下吗?我的分布式也有类似的问题
你可以参考 example/run_gat.py ,以及结合https://github.com/alibaba/euler/wiki/Euler-2.0-%E5%9C%A8%E5%A4%A7%E8%A7%84%E6%A8%A1%E5%9B%BE%E4%B8%8A%E7%9A%84%E5%BA%94%E7%94%A8
在安装好zookeeper集群的基础上
调用代码:
euler.start(
directory='euler_graph_data_dir', # 图数据路径
shard_idx=k, # 当前启动的进程为k号shard
shard_num=N, # 一共有N个shard
zk_addr=zk_addr, # Zookeeper address, ip:port
zk_path=zk_path, # Zookeeper path
module=euler.Module.DEFAULT_MODULE)
while True:
time.sleep(1)
报错信息:
2020-08-16 17:09:50.725018: W /Euler-OpenSource/euler/core/graph/graph_builder.cc:156] Graph build completely!
2020-08-16 17:09:50.725038: W /Euler-OpenSource/euler/core/graph/graph.cc:111] Build graph successfully, shard Index: 2,
shard number: 3, data path: /home/cora/euler, sampler_type: node
2020-08-16 17:09:50.725307: W /Euler-OpenSource/euler/service/grpc_server.cc:166] Missing Index directory, skip loading index.
2020-08-16 17:09:50.725340: E /Euler-OpenSource/euler/core/graph/graph.cc:434] global sampler is not ok
2020-08-16 17:09:50.725355: F /Euler-OpenSource/euler/core/graph/graph_meta.cc:41] Find feature error, Unknown feature name: binary_graph_label
2020-08-16 17:10:30.745360: F /Euler-OpenSource/euler/common/zk_server_register.cc:83] ZK error when creating root node: operation timeout.
2020-08-16 17:11:10.769324: F /Euler-OpenSource/euler/common/zk_server_register.cc:106] ZK error when creating meta: operation timeout.
Segmentation fault
这是怎么产生的,怎样解决这个问题?
说个我走的弯路 如果按照
'start_euler' --shard_idx=0
'start_euler' --shard_idx=1
worker1
worker2
ps
这个顺序启动,会有一定概率 worker2 显示Variables not initialized,具体原因未知
但是如果按照
'start_euler' --shard_idx=0
'start_euler' --shard_idx=1
ps
worker1
worker2
这个顺序启动 目前看来不会有问题, 但是worker1 worker2不能几乎同时启动,worker2一定要比worker1晚个5 6秒启动, 如果worker2只比worker1 晚1秒内启动,则会有概率 worker1报错,所以写自动启动的脚本的时候要注意这点