隐语开源社区【精选问答】第5期

简介: 隐语开源社区【精选问答】第5期


随着对隐语的深入了解,越来越多的开发者朋友加入到隐语的社区讨论中,本期精选28条问答list,供大家参考阅读。更多内容,请访问👏隐语github主页https://github.com/secretflow,同时也欢迎大家加入「隐语开源群」,和众多社区伙伴一起交流探讨!进群请私信小助手SecretFlow01易用性

问题1:生产模式下在两台机器上启动docker,容器内分别启动两个主节点ray。在两个容器中同时运行同样的代码,除了self_party和sf.init的address不同,报错brpc server failed startsf.init(parties=['alice', 'bob'], address='10.228.21.25:9446', cluster_config=cluster_config)解答:阅读部署文档:https://www.secretflow.org.cn/docs/secretflow/zh_CN/getting_started/deployment.html

  • 如果你想用仿真模型,则不需要填写cluster_config
    sf.init(parties=['alice', 'bob'], address='10.228.21.25:9446')

  • 如果你想用多ray集合模型(生产模型),则不要填写parties参数。填写parties表示仿真模型。sf.init(address='10.228.21.25:9446', cluster_config=cluster_config)
  • 两种模式不要混用。

问题2:

请问下,这个报错怎么解决呢?解答:加上address,表明要连接的ray地址。或者写成address=‘local’,会启动一个ray问题3:编写一个如下模型代码,代码中是顺序加载多方数据,然后直接执行后续PSI或者训练逻辑。




input_path = {alice: '.data/alice.csv', bob: '.data/bob.csv'}output_path = {alice: '.data/alice_psi.csv', bob: '.data/bob_psi.csv'}spu.psi_csv('uid', input_path, output_path, 'alice')

但是有2个问题:
1、 在任意一方执行这个代码逻辑都是应该报错的,因为他只能读取自己的数据,这个怎么处理或者解释;
2、在我们执行类似PSI动作时,如果只有一方准备好数据,当前系统处于什么状态,异常退出,还是等待对方数据到位,还是超时退出?
解答:你调用的是隐语封装过的API,这些API都是global view的,不是local能直接执行的,这些 global语义API内部会进一步把任务拆成 alice/bob local可以运行的任务去继续执行。并不是直接在local evaluate这个global function.1.spu.psi_csv('uid', input_path, output_path, 'alice')这里spu device的psi_csv源码实际上内部就是让多方同时执行SPURuntime::psi_csv ( https://github.com/secretflow/secretflow/blob/main/secretflow/device/device/spu.py#L1187 ) ,这个函数进一步是进入到cpp层进行psi的工作,然后alice side读取alice自己的数据进入算法流程,bob类似。
2.这是一个工程处理的问题,我们假设目前alice数据准备好,bob数据文件不存在。实际的行为两边各自同时跑,alice会进入正常流程,直到等待bob的一阶加密密文过来,但由于bob 发现本地数据文件不存在,因此bob执行流会直接异常退出。导致alice等待bob失败/超时,因此alice也会因为这个超时/接收异常退出。

问题4:

使用SPU计算时哪些计算可能会出问题?应该避免使用那些算子?解答:SPU 在计算精度上的文档在这里https://www.secretflow.org.cn/docs/spu/en/reference/fxp.html
总体来说分两类,一种是定点数本身的值域,比如nonfinite numbers(inf/nan)或者非常小的值(1e-10),前者无解,后者可以尝试一下用 FM128 来看看结果是不是正确的。还有一种是拟合精度的问题,上面的文档里对不少的拟合算子精度范围都有过总结,这类问题通常可以计算顺序的调整来规避。
https://www.secretflow.org.cn/docs/spu/en/reference/np_op_status.html
问题5:secretFlow是否可以做到根据配置的两个不同的IP地址,如127.0.0.1:9308,127.0.0.2:9308,自动将PSI任务分发到两台机器上运行,完成一次PSI?解答:可以的,这个属于集群仿真。参见https://www.secretflow.org.cn/docs/secretflow/zh_CN/getting_started/deployment.html#cluster-mode-for-simulation问题6:使用docker安装了0.7.11b2版本,在部署的时候ray出现报错。解答:报错是防火墙阻止了链接,需取消防火墙设置。问题7:https://github.com/secretflow/spu在 centos 7 上 Build From Source理论上可行吗?解答:centos7 如果不想配置环境的话,可以用我们release的docker镜像(secretflow/release-ci)release docker的build参照ci配置https://github.com/secretflow/spu/blob/462c836ed8cd62fe48741d51b38ff256fef15528/.circleci/config.yml#L220注意一下, anolis 打的包是没法在 centos7 上用的,centos7 的 glibc 版本太低了。所以为了能让 centos7 用户可以用,我们才专门搞了一个只是用来 build 的基于 centos7 的 container。也是因为在 centos7 上捣鼓 toolchain 太费劲,所以我建议如果自己要 build from source 而且目标是 centos7 的话,就用那个 container 吧,或者照着 dockerfile 装工具,文件在这里https://github.com/secretflow/devtools/blob/main/dockerfiles/spu-ci.DockerFile

问题8:

请问HEU支持硬件加速的详细说明在哪?解答:如果是使用 HEU 的硬件加速能力:HEU 目前接入了 Intel IPCL 库,支持avx512ifma 或者 QAT 加速,性能会有所提升,但是 ipcl 当前还是实验性的,我们跟 Intel 还在持续打磨;未来更多的硬件支持也在路上。如果是自己有一些硬件加速卡想让隐语兼容:新硬件接入可参考一下这个文档:https://www.secretflow.org.cn/docs/heu/zh_CN/development/phe_dev.html

问题9:

是否有介绍两到三台服务器做demo的配置文档解答:https://github.com/secretflow/secretflow/discussions/164

问题10:

我在文档里有看到这样的描述:“DataFrame由多个参与方的数据构成”。是否可以理解为多个参与方的数据都保存在一个DataFrame中,那对于分布式的场景,三方分别处在三个集群中,DataFrame的表现形式是什么样的呢?是否通过数据对象索引到其他参与方的数据对象?解答:可以这么理解,DataFrame只是保存了数据结构(columes)和各方分片(Partition)等元信息,并不保存数据,本质上是SPUObject的一个包装器(wrapper),并提供一些和pandas DataFrame类似的统计api,这些统计api在实现上应该都是交给SPU执行的。所以你使用时,就站在全局完整的“虚拟联合表”去考虑,不要再去和底下的具体参与方数据对象打交道。

问题11:

想问下在配置好的可信执行环境中,我们自己建模的时候还需要使用加密操作吗?解答:原理上是需要加密的,用户操作上是不需要的,类似于明文,隐语 api 之下会帮忙做掉加密这个事情。
功能性

问题1:

Split nn是否支持一方全部feature另一方只有label?解答:这个目前还没办法支持。如果某一方只是提供label,没有basenet的话,对于label信息几乎就是泄露掉了

问题2:

从文档来看,cluster的部署模式指的是参与方A和B在不同的机器上部署,从而组成的一个隐私计算的集群。请问对于参与方A单方而言,是否可以集群化部署计算节点,实现分布式计算呢?解答:当前SPU只能支持单机版本,所以如果要使用spu的话,ray只能启动一个节点,多节点ray集群支持SPU还在研发中,会在后续版本发布。如果不使用SPU的话,则机构内的ray可以是多节点集群。

问题3:

在使用SPU计算时有没有什么办法可以打印中间变量的值方便debug?
解答:
SPU 暂时没有非常方便的方式打印中间值,这里有一些安全上的考虑。不过提供一个思路就是把关心的中间变量作为返回值传回来,然后显示的 reveal 出来使用SPU计算时。

问题4:

是否可以提供真实多方MPC读取本地数据和模型的应用实例?解答:SecretFlow的一大特色是集中式编程,跨机构分布式执行。
通俗一点解释,你看到的代码实际执行的时候,读取数据/加载模型仍然是发生在机构本地的,数据并没有出域。比如下面这段代码

import secretflow as sf

alice = sf.PYU('alice')

def load_data(data_of_alice):
   pass

alice(load_data)('/path/of/alice/data')

上面代码表示alice读取alice本地的文件('/path/of/alice/data')。文档中的例子,为了方便模拟,给的可能是单机模拟的例子,是用单机模拟了多个机构。
如果你想变成多机构执行,则可以按照多机构多机部署的方式部署SecretFlow,
参考 SecretFlow生产模式https://www.secretflow.org.cn/docs/secretflow/zh_CN/getting_started/deployment.html#production
你的代码几乎可以无缝迁移成生产模式。
快速仿真的代码和生产部署几乎无gap,这也是SecretFlow的特色。

问题5:

我想将Alice和Bob的“psi_join_csv”的结果发送给不是SPU参与者的Carol。我可以使用“sf.wait”实现这一点,但我不确定它是否安全,因为“sf.wait”在内部使用sf.reveal。如果我不使用“sf.wait”,Carol的rayfed将在不等待SPU计算结果的情况下关闭。我想知道使用“sf.wait”等待接收秘密信息计算结果是否安全?解答:sf.wait 会显示一个虚拟函数的结果,该函数将任何设备对象作为输入。sf.wait不会向公众透露结果,虚拟函数实际上返回 None 。所以使用 sf.wait 作为同步语义是安全的。请查看:https://github.com/secretflow/secretflow/blob/main/secretflow/device/driver.py#L171-L184

问题6:

spu中会调用ray的remote函数,意图是否是用ray进行任务分发?PSI使用ray的目的是需要ray做应用分发吗?解答:SecretFlow使用ray的remote语义进行计算任务分发。从SecretFlow调度层来看,PSI和其他计算任务并没有特殊之处,也是把计算任务调度给ray执行。

问题7:

目前spu有长时间监听一个rpc端口服务的example吗解答:就目前的设计上来说,这个全局监听一般是交给上层拉起 SPU 的框架来完成的yacl 的 link 是用于 spu instances 之前的通信如果需要多个PSI 任务并发执行的话,需要修改配置中的端口,保证多个任务的端口不冲突。目前无法在多个任务之间复用同一组端口进行通讯。隐语之后会开源调度框架和可视化平台,不需要手动管理端口,并且框架中会提供getaway统一管理跨节点通讯,提供端口复用。

问题8:

在复现的时候发现,3阶优化总是会溢出,我看到sshelr中的sigmod-minmax优化,使用的是1阶展开,而对应的KDD21那篇论文使用的是3阶多项式,为啥隐语没有采用论文那样的方案呢?解答:是个好问题。隐语其实提供了非常多的sigmoid方法,包括minimax 1阶和3阶,3阶在零点左右的拟合精度会更高,但是1阶单调性更好。在不同的数据集下面应该会有不同的结果,如果训练飞掉,可能是触发了 3阶拟合曲线中的非单调上升部分。

问题9:

请教一下,0.7.18里的哪些功能是基于rayfed的呢?解答:rayfed 是个基础层的工作,不是功能面的,你可以理解为所有的功能目前都是跑在 rayfed 上。之前直接使用 ray 的模式,会有用户顾虑 driver 发恶意代码,改为 rayfed 后,还是保持 driver 中心式编程的视角,但是底层改进为更高效的 SPMD 执行模式,公网下部分 latency 敏感的算法性能会有提升,而且因为是 SPMD 执行层,不用再有发恶意代码的顾虑了。

问题10:

请教一下隐语现在有公开的关于建模的测试数据嘛?比如和明文模型相比,在准确性以及性能方面的差异。解答:隐语使用的外部公开的 UCI 数据集对sslr和xgb做了准确性的测试,在精度上可以接近明文。性能上使用了信通院的测评方法,使用cise.ntu.edu.tw的epsilon数据集做的benchmark,psi两方都为一亿行,百兆网络单向50毫秒延时,交集5千万耗时10分钟。两方非平衡,一亿vs十万,交集5万,耗时6.5分钟。特征工程和联合建模的算法性能正在优化中,准确性和性能的数据会随着算法开源一并给出。

问题11:

请教下,split learning中保护embedding的LDP有多种方法,为什么选择Gaussian DP。它有啥独特的优势吗?解答:用Gaussian DP有很多优点呀,比方说机器学习中,噪音常常也服从高斯,且高斯分布的和还是高斯分布,对模型utility影响比较小,再比方说高斯机制在后面的composition中可以推导出一些很有用的性质,使得计算隐私损失变得比较简单。

问题12:

请问spu/binding中只看到了psi相关接口(bucket_psi)的绑定操作,pir呢?解答:psi & pir 底层都是 cpp 构建的,psi 因为是一个偏离线态的任务,pir 虽然和 psi 共享一些底层密码能力,但是pir整体使用形式是一个偏在线态的事情,目前我们的默认计划里也没有 python 透出的打算,后续的 pir 出口大概会有一个单独的 pir c++ repo,会有对应的 c++ client sdk 以及 pir server 和 数据 SPI 接口定义。当然有二次开发人力的同学们也可以考虑直接使用目前的 pir cpp core api 自行封装。

问题13:

隐语是如何知道整个计算过程中哪些步骤和内容需要加密的呢?以及用什么方式加密?对于MPC好理解一些,通过参数指定使用的协议,过程都是按照协议制定的,但是机器学习呢?解答:应用层哪些过程要密态,哪些不密态,这个就要看算法的设计流程了;机器学习的部分组件,比如 LR,XGB,也是因为保护的过程范围可大可小,也发展除了联邦学习和纯多方安全计算的不同路线,简单理解为同一种算法,可能有不同安全级别的实现;由于这种明密文边界的 trade off 是隐私计算算法设计从业者根据算法特点,安全与效率决策出来的,所以隐语并不能自动决定。隐语的话:一是在框架层提供了明密文编程的能力,给用户自由设计隐私计算算法的空间;二是在算法层也内置提供了一些常见算法的实现,这些算法的实现流程告诉隐语哪些要走密态流程,哪些可以走明文流程。

问题14:

【黑盒:跨平台算法迁移】看起来就是调度的统一,类似k8s?算法插件就是负载程序?解答:是的,黑盒互联互通就是把算法插件当做黑盒,可以跨平台调度拉起运行。黑盒除了调度层要打通,还有一些管理面的互通,比如节点、资源的互相发现;全栈互联互通是很难的,各家公司也在不断探讨,目前是一步步去打开互通的,先是管理和调度,前面先做好了,最后才可能达到算法这层,目前行业现状还在致力于在管理和调度达到一个标准;算法这层打开互通是很麻烦的,主要还是算法多,且也在不断演进,连理论方案都未必能收敛,因此只在部分算法上达到收敛的成熟度;我们说的“白盒”,也有些说法说是“灰盒”,但大概可以理解为是把算法的交互细节标准化并且打开;类似于 TLS 协议,每个步骤的细节要打开,允许 client & server 是各自实现的,大家遵循一个开放协议,比如 linux 的 tcp client 可以连上 windows 内核的 tcp server。

问题15:

一个RayFed的疑问:现有的send/recv barrier实现 与 object acl 有哪些优劣对比?感觉send/recv barrier站在数据传输角度(fed.get),相比object acl似乎像是治标的方案?解答:RayFed其实本质上只有send一种语意,把数据发送的控制权完全交给了数据拥有方,所以确实是比object acl要优的。或者某种意义上来讲,也许这也能算一种数据拥有方通过代码控制的acl。

问题16:

请问联合数据的问题采用了MPC+SQL,这类技术主要是保护各方数据库的隐私,我比较好奇的是在隐语实现中有没有保护查询条件的隐私?解答:这个要看这里要保护的是什么,实际场景是什么,一般有两个层面的保护:1. 需要保护的是一些关键数值,比如 select * from xxx where a > key;  只想保护 key 的具体数值,但是允许用户看到 SQL 的大致组成,Secret Sharing 技术可以做这个保护, HE,TEE 也可以。2. 不只是一些关键数值,SQL语句本身大体长什么样子也想保护;目前看需要 HE、TEE 来处理,SS可能不满足需求,更细化一点的话,可能部分场景只能 HE 有这种能力,TEE 也不行。

问题17:

MPC SQL保护的是各方数据库非结果信息吗?如果是的话,该方案与用户单独、依次在各方数据内查询再将结果汇总的的方案相比,更明显的优势在哪?解答:> 保护的是各方数据库非结果信息吗?看你怎么定义结果信息的保护,如果这个结果就是用户需要的,并且这个结果就是可以推导出一些信息,那除非不允许用户看这个结果,否则总是可以利用结果反推出来一些信息量;SQL由于可编程,过于灵活,导致可以直接通过 select * 获取结果,因此我们有一些形式化验证的手段加其他数据提供方确认的机制,去限制用户随意写一些恶意 SQL 语句。> 更明显的优势在哪?实际我们 MPC-SQL 也是尽量这样去拆解的,这样执行效率是最高的,但是这种完美拆解不总是成立的,比如需要的结果 z 是个 bool 值,z =  a > b, 数据 a 来自 alice, 数据 b 来自 bob,如果各自查询,要么 alice 需要把 a 明文发送给 b,要么 bob 做类似的事情,那么泄露的信息量就是数据 a / b 的明文,如果这里引入密态计算,泄露的信息量就是最后的 bool 单 bit 信息。

相关文章
|
2月前
|
Java Serverless Apache
9 个开源项目、25 个课题可选丨欢迎报名阿里云云原生开源之夏
2024 开源之夏,阿里云云原生应用平台团队开放了包括 Apache Dubbo/Apache RocketMQ/Apache Seata/Higress/iLogtail /Nacos/Sentinel/Spring Could Alibaba / Serverless Devs 在内,涉及微服务、消息、可观测、Serverless 4 大技术领域的 9 个开源项目。
|
2月前
|
关系型数据库 分布式数据库 PolarDB
电子书阅读分享《PolarDB开发者大会:拥抱开源 | 成就开源》
电子书阅读分享《PolarDB开发者大会:拥抱开源 | 成就开源》
19 1
|
12月前
|
Cloud Native 开发者
邀请函 | 云原生开源开发者沙龙「上海站」
活动地址:上海徐汇区龙耀路 8 号,阿里巴巴徐汇滨江园区 X7-301 龙门书院。2023 年 7 月 30 日(周日)09:30 开始签到。
3016 0
邀请函 | 云原生开源开发者沙龙「上海站」
|
12月前
|
机器学习/深度学习 算法 安全
隐语开源社区 首期“社区之星” 新鲜出炉!
隐语开源社区 首期“社区之星” 新鲜出炉!
209 1
|
12月前
|
机器学习/深度学习 算法 安全
隐语社区【提问解答】 第1期
隐语社区【提问解答】 第1期
303 1
|
12月前
|
Cloud Native Dubbo 安全
活动回顾丨云原生开源开发者沙龙上海站(附 PPT)
活动回顾丨云原生开源开发者沙龙上海站(附 PPT)
|
12月前
|
SQL 机器学习/深度学习 人工智能
隐语开源社区【精选问答】第三期
隐语开源社区【精选问答】第三期
357 0
|
12月前
|
机器学习/深度学习 缓存 算法
隐语开源社区【精选问答】第四期
隐语开源社区【精选问答】第四期
276 0
|
12月前
|
机器学习/深度学习 算法 安全
「隐语开源社区」Meetup答疑篇
「隐语开源社区」Meetup答疑篇
312 0
|
12月前
|
机器学习/深度学习 边缘计算 算法
隐语开源社区【提问解答】第二期
隐语开源社区【提问解答】第二期
184 0