alibaba / euler

A distributed graph deep learning framework.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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_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的问题?能够提供解决思路呢?

不好意思,问题找到了,查看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

@Je-vie 好的,谢谢

那方便把这个文件借我参考下吗?我的分布式也有类似的问题

你可以参考 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个数据文件,但是还有一些问题请教下:

  1. 用什么办法实现每个机器读5个文件 (是自己手动分到两台服务器吗)
  2. 你的代码上的 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个数据文件,但是还有一些问题请教下:

  1. 用什么办法实现每个机器读5个文件 (是自己手动分到两台服务器吗)
    用hdfs,或者把10个文件分别都放到两台机器上
  2. 你的代码上的 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报错,所以写自动启动的脚本的时候要注意这点