本期隐语社区问答,共收集22条精选issues。其中安装部署问答13条,功能性问答6条,其他相关问答3条,供大家参考阅读。另外,小伙伴们在使用过程中遇到任何问题,都可以上github隐语主页进行提问和交流,隐语技术同学会给出相关建议和解决方法,欢迎访问👏:https://github.com/secretflow/secretflow同时欢迎小伙伴们加入隐语SecretFlow交流群,扫描下方二维码或通过微信号:SecretFlow01,添加隐语小助手好友,即可私聊申请入群。
本群主要为大家提供交流讨论隐语及隐私计算技术的平台,在这里你可以与专家互动、与同好交流,还可以获取隐语官方最新资讯。
安装部署问题
集群模式中的ip和端口的含义
- ip_1 和 port_1 初始化了 ray 的 master,然后 ip_2 加入了 ip_1 声明的这个集群。
- ip_3 以及 ip_4 是声明的两个 secretflow 的节点,与 ip_1 和 ip_2 并不是强绑定关系(虽然一般情况下都是一致的)。port_3 和 port_4 是声明的两个 secretflow 节点间的通信端口,必须与 port_1 不同,同时还需要与 ray 的通信端口 8881 不同。
- ip_5 和 port_5 指明 secretflow 去连接 ray 的集群,所以 ip_5 和 port_5 是与 ip_1 和 port_1 一致的。
一点点小的改进:同时还需要与 ray 的通信端口 8881 不同,其实本质上是使用未被占用的端口以免端口冲突。#pip install -U secretflow
...
ERROR: Could not find a version that satisfies the requirement spu==0.1.0b1 (from secretflow) (from versions: none)
ERROR: No matching distribution found for spu==0.1.0b1 (from secretflow)试试用docker镜像,镜像已经安装好了secretflowsecretflow/secretflow-anolis8:0.6.13b1https://hub.docker.com/r/secretflow/secretflow-anolis8/tags1.在本地两台虚拟机上运行了一个Ray集群:启动命令:ray start --head --node-ip-address="192.168.14.132" --port="6379" --resources='{"alice": 4}' --include-dashboard=False --disable-usage-stats (ray) [root@localhost ~]# lsof -i:6379ray start --address='192.168.14.132:6379' --resources='{"bob": 4}' --disable-usage-stats>>> import secretflow as sf>>> sf.init(address='192.168.14.132:6379')RuntimeError: b'GCS has started but no raylets have registered yet.'- 先停掉已有的集群(执行ray stop),然后执行ray start --head(注意不带其他参数),启动之后,再执行sf.init看下是否成功。-> 如果这个方式没问题,至少证明你的机器上可以运行ray。那么可能要检查下node-ip-address是否有问题,比如先换成127.0.0.1再试试。
- 尝试在/tmp/ray/session_xxx/logs/目录下,看下gcs.out、raylet.out等日志里是否有有用的信息。xxx应该和你启动ray的时间匹配。
- 另外,启动成功之后,也可以检查下raylet进程是否存活,ps -ef | grep raylet
1.您可以尝试以下方法:
切换到 secretflow 代码根目录,执行:pip install -e .
要求 Python 环境为 3.8
2.补充一下,应该还需要先自己编译 spu 和 heu
两个 repo 的 readme 里都有对应的编译方法环境:准备了两台云服务器,各自有独立的公网eip,分别作为head和work节点。ray start --head --node-ip-address="head公网ip" --port="32345" --redis-password='1234' --resources='{"alice": 8}' --include-dashboard=False --disable-usage-stats ray start --address="head节点公网ip:32345" --node-ip-address="work节点公网ip" --redis-password='1234' --resources='{"bob": 8}' --disable-usage-stats [external/yasl/yasl/link/transport/channel_brpc.cc:121] brpc server failed startimport secretflow as sf
import time
import spu
sf.shutdown()
# 初始化serectflow,集群模式,设置集群head节点地址
password='1234'
sf.init(address='head节点公网ip:32345', _redis_password=password)
# 定义两方计算集群,用于构建两方计算密文设备
cdef = {
'nodes': [
{'party': 'alice', 'id': 'local:0', 'address': 'head节点公网ip:30345'},
{'party': 'bob', 'id': 'local:1', 'address': 'work节点公网ip:30345'},
],
'runtime_config': {
'protocol': spu.spu_pb2.SEMI2K,
'field': spu.spu_pb2.FM128,
'sigmoid_mode': spu.spu_pb2.RuntimeConfig.SIGMOID_REAL,
},
}
# 两参与方,明文设备
alice, bob= sf.PYU('alice'), sf.PYU('bob')
# 构建两方计算密文设备
spu_2pc = sf.SPU(cdef)
print(spu_2pc)
from secretflow.data.horizontal import read_csv as h_read_csv
from secretflow.security.aggregation import SecureAggregator
from secretflow.security.compare import SPUComparator
# 安全聚合
comp = SPUComparator(spu_2pc)
aggr = sf.security.aggregation.SPUAggregator(spu_2pc)
print(aggr)
#定义数据集路径
h_alice_path="/root/secretflow/demo/dataset/wages1.csv"
h_bob_path="/root/secretflow/demo/dataset/wages2.csv"
# 读取两方数据为横向dataframe
t0 = time.time()
hdf = h_read_csv({alice: h_alice_path, bob: h_bob_path},
aggregator=aggr,
comparator=comp)
t0_e = time.time()
print("h_read_csv time cost:\n", float(t0_e-t0)*1000.0, "ms")
print(sf.reveal(hdf))
t1 = time.time()
print('Horizontal df:\n', hdf.mean(numeric_only=True))
t1_e = time.time()
print("hdf.mean time cost:\n", float(t1_e-t1)*1000.0, "ms")
公网EIP并不属于机器的ip,所以监听EIP地址会失败。正确方式是在配置SPU的时候,配置listen_address(比如可以是0.0.0.0:port)另外,从我们使用brpc的经验来看,brpc server failed start的几种常见可能性是m1 用 conda 装 grpcio。M1 还属于早期实验性支持,发现问题欢迎反馈。spu的clusterdef修改为多机ip时无法运行基于secretflow-beta\docs\tutorial\PSI_On_SPU.py1.首先将192.168.207.193和192.168.207.194组成ray集群2.修改testing文件,将spu传入的clusterdef的'alice'和'bob'地址分别设置为看上去似乎端口已经被占用了,所以导致spu创建失败。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)以input_path = {alice: '.data/alice.csv', bob: '.data/bob.csv'}为例,这行代码表示alice读取alice本地的data/alice.csv文件,bob读取bob本地的data/bob.csv。所以只需要集群化启动secretflow集群,读取的就是参与方各自的文件了。
集群化参考Cluster Modehttps://secretflow.readthedocs.io/en/latest/getting_started/deployment.html#cluster-mode在做PSI时,如果一方运行,另一方不运行。在尝试连接超时时会出现段错误
解答:是的,这是预期行为。如果直接使用 SPU,我们确实要求我们的用户在短时间内运行双方。你可以尝试在 Secretflow 中调用 PSI,这将有助于同时向双方发送 MPI PSI 代码。使用Cluster Mode,出现Unable to connect to GCS at 192.168.11.129:7000在本方可以通过上述地址请求到对侧服务器吗?(尝试使用ping和curl检测链路连通性) 同时在云服务器上可通过netstat查看端口监听状态。同时可检查云服务器防火墙是否禁止了上述开启的端口从外部访问。我们对ray做了一些安全上的改进,但是功能上和开源ray是一致的,这一块的工作还在持续进行中,我们会在完善之后开源出来。/heu/docs$ pip install sf-heuDefaulting to user installation because normal site-packages is not writeableERROR: Could not find a version that satisfies the requirement sf-heu (from versions: none)ERROR: No matching distribution found for sf-heuPop!_OS 22.04 LTS
Python 3.10.4
pip 22.0.2我们现在只为 Python 3.8 提供预制wheel包。centos7.6 使用bazel build 报错ERROR:/root/.cache/bazel/_bazel_root/9de4a6aef89daf40df580afb13ff9f9d/external/com_github_intel_ipp/BUILD.bazel:10:20: Foreign Cc - CMake: Building ipp failed: (Exit 1): bash failed: error executing command /bin/bash -c bazel-out/k8-opt/bin/external/com_github_intel_ipp/ipp_foreign_cc/wrapper_build_script.shgcc11是自己编译安装的,centos7.6默认是gcc 4.8.5centos 7 rh的gcc11包
yum install -y centos-release-scl
yum install -y devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils
应该就可以装上,然后
source scl_source enable devtoolset-11功能性问题
ml的前端是只能用纯jax写么?多方机器学习中,spu中的fit是否可使用sklearndecision_function_shape = 'ovo'clf = svm.SVC(C=C, kernel='linear', gamma=gamma, decision_function_shape=decision_function_shape)return clf.coef_, clf.intercept_对于纯密态计算的方案,目前原生 AI 框架对接当前推荐的是 Jax,理论上所有可以翻译到 XLA IR 的框架都可以被 SPU 对接上,因此后续会包含 TF & Torch,可以看下
https://spu.readthedocs.io/en/beta/getting_started/introduction.html。
走 XLA 的好处是未来 torch/jax/tf 自身的迭代和隐语的迭代是解耦的,可以用上最新版本的原生 AI 框架。回到 SKLearn,SKLearn 本身并不能直接翻译到 XLA,所以暂时这么做是不可以的。但是我们确实有计划提供类 SKLearn 的 API 风格的安全机器学习算法,这样可以减少用户的学习成本。不能,对于ABY3协议来说,如果两方共谋将会得到全部数据信息。按照你的假设,假设两方分别为alice和bob,alice承担了p1和p2, bob承担了p3, 那么实际上alice可以reveal所有密文,对于bob来说是不可接受的。secretflow支持多方(大于三方)PSI和机器学习建模吗(1)MPC(可证安全)的建模:目前支持了三方/多方LR,稍晚些时候会支持三方/多方XGB (2)PSI:目前主要是两方的PSI,预计在今年11月份支持多方PSI(3)联邦学习(非可证安全)的建模:目前已经支持水平多方XGB,稍晚些会发布水平LR算法,另外还有一些NN算法,部分已经支持,原则上也是可以多方参与的多方计算每次都需要sf.shutdown()+sf.init()么在一个python解释器中,其实只需要sf.init一次,后台会启动计算集群,然后可以往该集群提交运行多个task,这个没有限制,shutdown其实会在进程退出时自动调用,所以也可以不显示手动调用的。教程里的文档加上shutdown是为了避免有人在jupyter notebook打开之后,重复跑sf.init()导致报错。隐语并没有使用cheetach的demo,当前spu device支持多种密态协议,你只需要在init spu device的时候在runtime config中选择cheetah协议即可。SFXgboost目前只能train,不能evaluate/predict吗SFXgboost暂时只支持train,产出的model可以save下来,这个model可以用标准原生xgboost来进行加载预测,评估等。后续版本会增加联邦评估和预测的能力请问平台里的sql功能是基于MPC的安全版本还是执行原生的sql语句?用户输入的sql经过parser后会被拆分成多个子sql,对于只涉及单方数据的子sql会发到本地sql引擎明文执行,只有涉及到多方数据的子sql才会进入密态进行mpc计算。隐语的sql是一个典型的可证安全的明密文混合计算其他问题
目前read_csv底层是调用pandas.read_csv, pandas.read_csv并不支持hdfs,只能从csv文件加载。我想请教一个如何用编程实现的问题,我看secretflow的教程是单机模拟,就可以在单机的一个.py程序中编程实现。那如果是分布式的,一个物理节点提供标签,一个物理节点提供数据,再来一个物理节点提供模型,那么在哪个节点进行编程实现,这一个节点如何访问其他节点的变量?X, _ = ppd.device("P1")(load_dataset)()_, Y = ppd.device("P2")(load_dataset)()比如,X,Y分别在不同的节点中,如何把它们一块放如损失函数中。首先,隐语提供的是single controller编程模式,站在全局视角编写代码。隐语编程并不区分单机或集群模式,其写法是通用的。(单机模式也是通过多进程模拟的多方)具体到你的问题,Alice有特征,Bob有标签。如果你想进行计算,需要想清楚计算模型是什么(比如执行什么算法),以及如何保证安全性。
按照你的问题假设,如果你想让Bob计算loss,则可以把X发送给Bob,但是注意这是不安全的,X将会被明文发送给Bob。所以你需要设计算法模型来保证安全。alice, bob =sf.PYU('alice'), sf.PYU('bob')# x.to(bob) 表示将x传输给bob,注意是明文发送bob(loss_func)(x.to(bob), y)Logistic Regression with SPU — SecretFlow documentation。使用猎豹协议测试2方的万次比较,需要花将近7s的时间,正常吗?猎豹是一个纯两方的协议,计算过程中涉及到下层 OT/HE 的计算,速度比ABY3这类协议会慢许多。隐语官网:
https://www.secretflow.org.cn
https://github.com/secretflow
https://gitee.com/secretflow
公众号:隐语的小剧场
B站:隐语secretflow
邮箱:secretflow-contact@service.alipay.com