Giter Site home page Giter Site logo

Comments (19)

zhouaihui avatar zhouaihui commented on June 14, 2024 2

看上去你的网络环境已经跑起来了。

SPU需要单独分配ip和端口,sf.utils.testing.cluster_def是给单机测试用的,里面默认ip是127.0.0.1,你需要自己提供实际的ip,cluster_def的构造可以参考SPU init

from secretflow.

zhouaihui avatar zhouaihui commented on June 14, 2024 1

另外还想咨询下:
1、我如何证明运算是B处理的?(例如能否看到一些log)
2、如何保证最终结果只有C能看到?

  1. 你可以看ray的日志,默认最新的ray日志通常在/tmp/ray/session_latest/logs/raylet.out。比如在bob的机器上,日志里应该可以看到计算任务被调度到bob执行。
  2. 你的问题是想让B执行,然后只有C能使用计算结果?
    • 首先,B、C都是python明文设备,本身结果对计算方是不加密的,所以B肯定能看到计算结果(就存储在B本地)
    • 其次,data只是对B计算结果的一个引用,在不执行reveal的情况下,无论alice/carol都无法看到计算结果。所以非必要的情况下不建议使用reveal。
    • 最后,如果想让C拿到结果进行后续计算,举一个例子:
     c = sf.PYU('carol')
     # 将data transfer到c
     data_c = data.to(c)
     # 示例:c对data执行计算
     c(lambda x: x + 1)(data_c)

from secretflow.

zhouaihui avatar zhouaihui commented on June 14, 2024

ray集群是需要网络双向互通,从ray.status来看,bob/carol节点无法被alice访问。如果网络都是通的,应该可以看到类似下面的信息:

...
0.0/8.0 alice
0.0/8.0 bob
0.0/8.0 carol
...

建议检查下三个节点的网络互通情况。另外,启动bob/carol节点时,如果没有指定--node-ip-address,则ray会默认选择汇报一个ip(猜测大概率是127.0.0.1或者某个内部ip)给alice,alice是无法访通的,可以在启动bob/carol的时候添加参数--node-ip-address=bob/carol的对外ip

from secretflow.

zhouaihui avatar zhouaihui commented on June 14, 2024

提醒一下,测试时,如果重新启动ray,请记得先执行ray stop命令停止已有的ray集群/节点,避免出现残留的ray进程。

from secretflow.

mingo0117 avatar mingo0117 commented on June 14, 2024

ray集群是需要网络双向互通,从ray.status来看,bob/carol节点无法被alice访问。如果网络都是通的,应该可以看到类似下面的信息:

...
0.0/8.0 alice
0.0/8.0 bob
0.0/8.0 carol
...

建议检查下三个节点的网络互通情况。另外,启动bob/carol节点时,如果没有指定--node-ip-address,则ray会默认选择汇报一个ip(猜测大概率是127.0.0.1或者某个内部ip)给alice,alice是无法访通的,可以在启动bob/carol的时候添加参数--node-ip-address=bob/carol的对外ip

添加了参数--node-ip-address=bob/carol,但依然是同样的问题(bob/carol上ray start能连接成功,但ray status看不到),bob/carol公网ip都是通的,是需要开通某个端口么?

from secretflow.

mingo0117 avatar mingo0117 commented on June 14, 2024

另外还想咨询下:
1、我如何证明运算是B处理的?(例如能否看到一些log)
2、如何保证最终结果只有C能看到?

  1. 你可以看ray的日志,默认最新的ray日志通常在/tmp/ray/session_latest/logs/raylet.out。比如在bob的机器上,日志里应该可以看到计算任务被调度到bob执行。

  2. 你的问题是想让B执行,然后只有C能使用计算结果?

    • 首先,B、C都是python明文设备,本身结果对计算方是不加密的,所以B肯定能看到计算结果(就存储在B本地)
    • 其次,data只是对B计算结果的一个引用,在不执行reveal的情况下,无论alice/carol都无法看到计算结果。所以非必要的情况下不建议使用reveal。
    • 最后,如果想让C拿到结果进行后续计算,举一个例子:
     c = sf.PYU('carol')
     # 将data transfer到c
     data_c = data.to(c)
     # 示例:c对data执行计算
     c(lambda x: x + 1)(data_c)

感谢,这个data.to学习了

from secretflow.

zhouaihui avatar zhouaihui commented on June 14, 2024

ray集群是需要网络双向互通,从ray.status来看,bob/carol节点无法被alice访问。如果网络都是通的,应该可以看到类似下面的信息:

...
0.0/8.0 alice
0.0/8.0 bob
0.0/8.0 carol
...

建议检查下三个节点的网络互通情况。另外,启动bob/carol节点时,如果没有指定--node-ip-address,则ray会默认选择汇报一个ip(猜测大概率是127.0.0.1或者某个内部ip)给alice,alice是无法访通的,可以在启动bob/carol的时候添加参数--node-ip-address=bob/carol的对外ip

添加了参数--node-ip-address=bob/carol,但依然是同样的问题(bob/carol上ray start能连接成功,但ray status看不到),bob/carol公网ip都是通的,是需要开通某个端口么?

如果你的网络环境是限定ip + port,则会比较麻烦。ray本身会拉起1个或多个worker进程用来执行计算任务,worker的节点监听端口默认是随机选择一个未使用的端口。比如B的某一个worker使用了端口10000,则A也会去访问这个端口号。

如果要在这种网络环境下跑起来,则需要先限定ray使用的端口号(包括worker进程的端口号),再对每一个端口号开通访问权限。

指定端口号的方法可以查看ray start --help,示例:

节点A:
下列命令将限定ray使用端口号1,2,3以及4~10。(请自行修改为实际端口)

ray start --head --node-ip-address="ip of a" --port=1  --resources='{"alice": 8}' --object-manager-port=2 --node-manager-port=3 --min-worker-port=4 --max-worker-port=10 --include-dashboard=false --disable-usage-stats

同理节点B会使用端口号2,3以及4~10。

ray start  --address="ip:port" --resources='{"bob": 8}' --node-ip-address="ip of b"  --object-manager-port=2 --node-manager-port=3 --min-worker-port=4 --max-worker-port=10 

from secretflow.

mingo0117 avatar mingo0117 commented on June 14, 2024

ray集群是需要网络双向互通,从ray.status来看,bob/carol节点无法被alice访问。如果网络都是通的,应该可以看到类似下面的信息:

...
0.0/8.0 alice
0.0/8.0 bob
0.0/8.0 carol
...

建议检查下三个节点的网络互通情况。另外,启动bob/carol节点时,如果没有指定--node-ip-address,则ray会默认选择汇报一个ip(猜测大概率是127.0.0.1或者某个内部ip)给alice,alice是无法访通的,可以在启动bob/carol的时候添加参数--node-ip-address=bob/carol的对外ip

添加了参数--node-ip-address=bob/carol,但依然是同样的问题(bob/carol上ray start能连接成功,但ray status看不到),bob/carol公网ip都是通的,是需要开通某个端口么?

如果你的网络环境是限定ip + port,则会比较麻烦。ray本身会拉起1个或多个worker进程用来执行计算任务,worker的节点监听端口默认是随机选择一个未使用的端口。比如B的某一个worker使用了端口10000,则A也会去访问这个端口号。

如果要在这种网络环境下跑起来,则需要先限定ray使用的端口号(包括worker进程的端口号),再对每一个端口号开通访问权限。

指定端口号的方法可以查看ray start --help,示例:

节点A: 下列命令将限定ray使用端口号1,2,3以及4~10。(请自行修改为实际端口)

ray start --head --node-ip-address="ip of a" --port=1  --resources='{"alice": 8}' --object-manager-port=2 --node-manager-port=3 --min-worker-port=4 --max-worker-port=10 --include-dashboard=false --disable-usage-stats

同理节点B会使用端口号2,3以及4~10。

ray start  --address="ip:port" --resources='{"bob": 8}' --node-ip-address="ip of b"  --object-manager-port=2 --node-manager-port=3 --min-worker-port=4 --max-worker-port=10 

感谢指点。我换了一套没有端口限制的环境,又出现新的报错:
image

ray集群是ok的:
image

from secretflow.

mingo0117 avatar mingo0117 commented on June 14, 2024

看上去你的网络环境已经跑起来了。

SPU需要单独分配ip和端口,sf.utils.testing.cluster_def是给单机测试用的,里面默认ip是127.0.0.1,你需要自己提供实际的ip,cluster_def的构造可以参考SPU init

明白了,已ok,多谢指教

from secretflow.

962209699 avatar 962209699 commented on June 14, 2024

看上去你的网络环境已经跑起来了。

SPU需要单独分配ip和端口,sf.utils.testing.cluster_def是给单机测试用的,里面默认ip是127.0.0.1,你需要自己提供实际的ip,cluster_def的构造可以参考SPU init

请问有为spu分配IP与端口的示例吗,SPU init
我在启动bob节点时并没有为其设置端口,在上述中需要填写bob节点的address,应该如何填写?
我目前使用的address是bob的ip和alice的端口,具体如下:
import secretflow as sf
import spu

sf.shutdown()
sf.init(address='alice's ip:8881')
alice = sf.PYU('alice')
bob = sf.PYU('bob')
device = sf.SPU({
'nodes': [
{
'party': 'alice',
'id': 'local:0',
# The address for other peers.
'address': 'alice's ip:8881',
# The listen address of this node.
# Optional. Address will be used if listen_address is empty.
'listen_address': ''
},
{
'party': 'bob',
'id': 'local:1',
'address': 'bob's ip:8881',
'listen_address': ''
},
],
'runtime_config': {
'protocol': spu.spu_pb2.SEMI2K,
'field': spu.spu_pb2.FM128,
'sigmoid_mode': spu.spu_pb2.RuntimeConfig.SIGMOID_REAL,
}
})
data1 = alice(lambda x : x)(2).to(device)
data2 = bob(lambda x : x)(2).to(device)
def add(a,b):
return a+b
data = device(add)(data1,data2)
sf.reveal(data)

在reveal时报错:

RayActorError Traceback (most recent call last)
Input In [7], in <cell line: 2>()
1 data = device(add)(data1,data2)
----> 2 sf.reveal(data)

File ~/.pyenv/versions/3.8.12/envs/secretflow/lib/python3.8/site-packages/secretflow/device/driver.py:158, in reveal(func_or_object)
155 value_ref.append(value.device.sk_keeper.decrypt.remote(value.data))
156 value_idx.append(i)
--> 158 value_obj = ray.get(value_ref)
159 idx = 0
160 for i in value_idx:

File ~/.pyenv/versions/3.8.12/envs/secretflow/lib/python3.8/site-packages/ray/_private/client_mode_hook.py:105, in client_mode_hook..wrapper(*args, **kwargs)
103 if func.name != "init" or is_client_mode_enabled_by_default:
104 return getattr(ray, func.name)(*args, **kwargs)
--> 105 return func(*args, **kwargs)

File ~/.pyenv/versions/3.8.12/envs/secretflow/lib/python3.8/site-packages/ray/worker.py:1845, in get(object_refs, timeout)
1843 raise value.as_instanceof_cause()
1844 else:
-> 1845 raise value
1847 if is_individual_id:
1848 values = values[0]

RayActorError: The actor died because of an error raised in its creation task, ray::SPURuntime.init() (pid=21797, ip=172.22.56.85, repr=<secretflow.device.device.spu.SPURuntime object at 0x7fc6d3326c10>)
File "/root/.pyenv/versions/3.8.12/envs/secretflow/lib/python3.8/site-packages/secretflow/device/device/spu.py", line 125, in init
self.link = link.create_brpc(desc, rank)
RuntimeError: what:
[external/yasl/yasl/link/context.cc:140] connect to mesh failed, failed to setup connection to rank=0
stacktrace:
#0 pybind11::cpp_function::initialize<>()::{lambda()#3}::_FUN()+0x7fc728c28ed7
#1 pybind11::cpp_function::dispatcher()+0x7fc728c150cb
#2 PyCFunction_Call+0x43be5a

from secretflow.

zhouaihui avatar zhouaihui commented on June 14, 2024

看你的代码,8881是给ray使用的端口,spu请使用其他未占用的端口。

from secretflow.

962209699 avatar 962209699 commented on June 14, 2024

意思是我的两个address应该分别选两个机器上从未被使用过的端口对吗

from secretflow.

zhouaihui avatar zhouaihui commented on June 14, 2024

对的

意思是我的两个address应该分别选两个机器上从未被使用过的端口对吗

from secretflow.

962209699 avatar 962209699 commented on June 14, 2024

我按照您所说的进行了修改,现在他卡在reveal出不来结果了

from secretflow.

962209699 avatar 962209699 commented on June 14, 2024

ray status
======== Autoscaler status: 2022-07-27 15:09:37.487134 ========
Node status

Healthy:
1 node_3ea8b7c406b1f9f8184e262c920e76fafdb953f5544ac32d93b4166c
1 node_ca8f97e020bc3fc6c7833790279f8c9117d5a650f267017150c2c587
Pending:
(no pending nodes)
Recent failures:
(no failures)

Resources

Usage:
2.0/24.0 CPU
1.0/8.0 alice
1.0/8.0 bob
0.00/26.939 GiB memory
0.00/12.732 GiB object_store_memory
这是我的ray status

我两个节点address的ip填写的是各自所在服务器的ip,这是否正确呢

from secretflow.

962209699 avatar 962209699 commented on June 14, 2024

image
image
这是我两台机器上运行后的端口信息

from secretflow.

zhouaihui avatar zhouaihui commented on June 14, 2024

只要确保两个ip是互通的应该就没问题。
你的代码我们没法复现你的错误,你那边有错误日志吗?
另外可以检查下ray的日志,通常最新的ray的日志在/tmp/ray/session_latest/logs/目录下,raylet.out和gcs_server.out会可能有用。

from secretflow.

962209699 avatar 962209699 commented on June 14, 2024

这个问题我解决了 确实是启动ray的时候ip设置的有问题 多谢~

from secretflow.

wind-and-falling-maple-leaf avatar wind-and-falling-maple-leaf commented on June 14, 2024

这个问题我解决了 确实是启动ray的时候ip设置的有问题 多谢~

HI @962209699 我也遇到同样的问题,不知道您是怎么解决的 #112

from secretflow.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.