ian huu
ian huu
你使用的应该是仿真模式,仿真模式下各个节点使用一套 ray 集群,在 ray 调度层会有额外的通信。你想要的可能是[生产模式](https://www.secretflow.org.cn/docs/secretflow/zh_CN/getting_started/deployment.html#production),具体原理可以参考[这个文档](https://www.secretflow.org.cn/docs/secretflow/zh_CN/developer/design/programming_in_secretflow.html)
生产模式网络通信只取决于算法的设定,对水平联邦来说你这种场景完全是可以的
> > > > 有示例吗? 有仿真模式的水平联邦的示例:https://www.secretflow.org.cn/docs/secretflow/zh_CN/tutorial/Federate_Learning_for_Image_Classification.html 你可以用生产模式搭建集群后运行这个教程(但是“数据准备”的部分需要你自己切分后放到各个机器上)
需要注意: 1. 初始化 `sf.init` 时需要按照生产模式的方式 2. sf 内置的安全聚合有 client 之间的通信(参考具体算法实现),你这个场景中可以先使用明文聚合的模式:https://www.secretflow.org.cn/docs/secretflow/zh_CN/developer/algorithm/secure_aggregation.html
@dutyu 你用的聚合策略是什么,必须是[PlainAggregator](https://www.secretflow.org.cn/docs/secretflow/zh_CN/developer/algorithm/secure_aggregation.html) 如果已经是 PlainAggregator 的话,麻烦给一下代码我们复现一下
1. 是的,没有什么特别的机制,就是代码实现保证的,在 PYUObject.to(spu_device) 的底层实现中,该 PYUObject 会由所在的 PYU 负责随机分片,并发送给 spu_device 对应的各个物理机器,在这个过程中只有对应的 PYU 有所有信息,其他人拿到的都是分片后的随机数 2. 目前 secretflow 只支持 cross-silo 场景,也就是比较稳定的集群架构下(一般来说是机构之间,而不是手机这种设备之间)的隐私计算任务,1000 个 PYU 的场景在实际生产模式部署中不太可行(网络结构过于复杂,稳定性成疑)。如果只是 simulation 模式做实验的话,你可以用简单的 for 循环来定义多个 PYU: ```python import secretflow as...
分片方式依赖于目标 spu 配置的协议,不同协议会有不同的分片方式:https://www.secretflow.org.cn/zh-CN/docs/spu/0.8.0b0/reference/mpc_status
你的代码有点看不太清,我给一个简单的例子: ```py pyus = [sf.PYU(name) for name in party_names] spu = sf.SPU(...) def load_data_to_pyu(): return np.array([1,2,3]) # 各个 pyu 读取数据 pyu_objs = [] for pyu in pyus: obj = pyu(load_data_to_pyu)()...
这是个好问题,上面的代码可以分两部分来看: 一部分是 pyu_objs、spu_objs 涉及到的代码(for 循环等),这部分是 `driver` 代码; 另一部分是 load_data_to_pyu 和 process_data_in_spu 这些函数内的实际执行计算的代码,叫做 `worker` 代码。 `driver` 代码实际上是对计算逻辑的一些"编排",他把实际的`worker` 代码串联成一个计算图(dag),这个计算图中的节点只要没有依赖,都是可以并发执行的,实际上也是并发执行的。而 `driver` 代码那个 for 循环只负责生成计算图,所以执行时间可以忽略不计。 实际执行分为两种情况, [仿真模式](https://www.secretflow.org.cn/zh-CN/docs/secretflow/v1.5.0b0/getting_started/deployment#simulation): 在单 ray 集群内,利用 ray 的 task 异步执行能力实现没有依赖的节点的并发执行。...
> 根据您的回答,我的理解是只要worker代码没有依赖那么可以并发执行,其使用了os.fork()和jax来实现multithreade。但我在进 > ... > result_spus.append(temp_spu) > ` 能给一下完整一点的代码吗?不需要全部代码,但是麻烦提供关键部分的代码,比如 pyus 是什么从哪里来的。 另外代码建议使用 markdown 格式,保证格式显示正确: \`\`\`python def func(): return 1 \`\`\`