导语: 为了不便大家理解隐语的Benchmark,本文设计了10分钟上手手册,蕴含了亮点介绍、SecretFlow集群的易用搭建、Benchmark脚本、两方和三方的Benchmark,使相干业务方做调研时不便拿到可度量的性能数据和可复现的门路。
隐语PSI亮点
隐衷汇合求交(Private Set Intersection,PSI)是一类特定的多方平安计算(Multi-Party Computation, MPC)问题,其问题能够简略了解为:Alice 输出汇合 X,Bob 输出汇合 Y,单方执行 PSI 协定能够失去 Alice 和 Bob 两者的交加,同时不在交加范畴内的局部是受爱护的,即 Alice 和 Bob 无奈学习出交加以外的任何信息。
隐衷汇合求交(PSI)协定有很多分类办法,依照底层依赖的明码技术分类次要包含:
- 基于公钥明码的PSI计划,包含:基于断定型密钥替换(Decisional Diffie-Hellman,DDH)的PSI计划和RSA盲签名的PSI计划;
- 基于不经意传输(Oblivious Transfer,OT)的PSI计划;
- 基于通用MPC的PSI计划,例如基于混同电路(Garbled Circuit,GC)的PSI计划;
- 基于同态加密(Homomorphic Encryption,HE)的PSI计划。
隐衷汇合求交(PSI)协定依照参与方的数量进行分类,可分为:
- 两方PSI:参与方为2个;
- 多方PSI:参与方>2个。
隐衷汇合求交(PSI)协定依照设定平安模型分类,可分为:
- 半诚恳模型的PSI;
- 歹意模型的PSI。
SecretFlow SPU 实现了半诚恳模型下的两方和三方PSI协定,密钥平安强度是128bit,统计平安参数是40bit。
两方PSI协定:
- 基于DDH的PSI(Private Set Intersection)协定
基于DDH的PSI协定先对简略易于了解和实现,依赖的明码技术已被宽泛论证,通信量低,但计算量较大。
隐语实现了基于椭圆曲线(Elliptic Curve)群的DDH PSI协定,反对的椭圆曲线类型包含:Curve25519,SM2,Secp256k1。本次benchmark选用的曲线是Curve25519。
- 基于OT扩大的KKRT16
KKRT16是第一个千万规模(224)求交工夫在1分钟之内的PSI计划,通信量较大;
隐语实现了KKRT16协定,并参考了进年来的性能优化和平安改良计划,例如:stash-less CuckooHash,[GKWW20]中 FixedKey AES作为 correlation-robust 哈希函数。
- 基于PCG的BC22
BC22 PSI依赖的PCG(Pseudorandom Correlation Generator)计划是近年来mpc方向的钻研热点,相比KKRT16计算量和通信两方面都有了很大改良,从老本(monetary cost)角度更能满足理论业务需要。PCG实现依赖LPN(Learning Parity with Noise)问题,因为是2022年最新的协定,协定的安全性还须要更多明码专家的剖析和论文。
隐语v0.7中实现了BC22 PSI计划,其中的PCG/VOLE应用了emp-zk中的[WYKW21]实现,欢送大家审查和进一步改良;
三方PSI(Private Set Intersection)协定
- 基于DDH的三方PSI协定
隐语实现了自研的基于 ECDH 的三方 PSI 协定,留神咱们实现的这个协定会透露两方交加大小,请自行判断是否满足应用场景的安全性,本次benchmark选用的曲线是Curve25519。
复现形式
一、测试机型环境
- Python:3.8
- pip: >= 19.3
- OS: CentOS 7
- CPU/Memory: 举荐最低配置是 8C16G
- 硬盘:500G
二、装置conda
应用conda治理python环境,如果机器没有conda须要先装置,步骤如下:
# 别离在三台机器的root目录下执行# sudo apt-get install wgetwget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh# 装置bash Miniconda3-latest-Linux-x86_64.sh# 始终按回车而后输出yesplease answer 'yes' or 'no':>>> yes# 抉择装置门路, 文件名前加点号示意暗藏文件Miniconda3 will now be installed into this location:>>> ~/.miniconda3# 增加配置信息到 ~/.bashrc文件Do you wish the installer to initialize Miniconda3 by running conda init? [yes|no][no] >>> yes# 运行配置信息文件或重启电脑source ~/.bashrc# 测试是否装置胜利conda --version
三、装置secretflow
# 别离在三台机器的root目录下执行# 创立洁净的python环境conda create -n sf-benchmark python=3.8# 进入benchmark 环境conda activate sf-benchmark# 装置secretflowpip install -U secretflow# 创立一个sf-benchmark目录mkdir sf-benchmarkcd sf-benchmark
1.验证装置是否胜利
root目录下输出python而后回车
# 顺次执行,每执行一条回车一次>>> import secretflow as sf>>> sf.init(['alice', 'bob', 'carol'], num_cpus=8, log_to_driver=True)>>> dev = sf.PYU('alice')>>> import numpy as np>>> data = dev(np.random.rand)(3, 4)>>> sf.reveal(data)
如下图所示就代表环境搭建胜利了
四、创立节点并启动集群
1.创立ray header节点
创立ray header节点,抉择一台机器为主机,在主机上执行如下命令,ip替换为主机的内网ip,命名为alice,端口抉择一个闲暇端口即可留神:192.168.0.1 ip为mock的,请替换为理论的ip地址
# alice机器执行RAY_DISABLE_REMOTE_CODE=true \ray start --head --node-ip-address="192.168.0.1" --port="9394" --resources='{"alice": 8}' --include-dashboard=False
2.创立隶属节点
创立隶属节点,在bob机器执行如下命令,ip仍然填alice机器的内网ip,命名为bob,端口不变
# bob机器执行RAY_DISABLE_REMOTE_CODE=true \ray start --address="192.168.0.1:9394" --resources='{"bob": 8}'
创立隶属节点,在carol机器执行如下命令,ip仍然填alice机器的内网ip,命名为carol,端口不变
# carol机器执行RAY_DISABLE_REMOTE_CODE=true \ray start --address="192.168.0.1:9394" --resources='{"carol": 8}'
3.验证节点是否启动
在python中测试节点是否启动胜利,任意选一台机器输出python,执行下列代码,参数中address为头节点(alice)的地址,拿alice机器来验证,每输出一行下列代码回车一次:
#alice机器输出python后再执行>>> import secretflow as sf>>> sf.init(address='192.168.0.1:9394')>>> alice = sf.PYU('alice')>>> bob = sf.PYU('bob')>>> sf.reveal(alice(lambda x : x)(2))>>> sf.reveal(bob(lambda x : x)(2))
如下图就代表节点创立胜利了
同时咱们也能够通过ray status去看节点的状态,前提是先进入sf环境(conda activate sf-benchmark)
4.生成数据
把脚本generate_psi.py:https://github.com/secretflow...
传到alice机器的root目录下
执行如下代码
# 生成三份一千万数据python3 generate_psi.py 10000000# 生成三份一亿数据python3 generate_psi.py 100000000
把生成的psi_1.csv cp到benchmark目录下,再通过scp的命令把psi_2.csv/psi_3.csv别离移到bob的benchmark目录下跟carol的benchark目录下
5.限度宽带/提早
#100Mbps 20ms
tc qdisc add dev eth0 root handle 1: tbf rate 100mbit burst 256kb latency 800ms
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 20msec limit 8000
- 革除限度
tc qdisc del dev eth0 root
- 查看已有配置
tc qdisc show dev eth0
6.Benchmark脚本
反对的PSI协定列表:
- ECDH_PSI_2PC
- KKRT_PSI_2PC
- BC22_PSI_2PC
- ECDH_PSI_3PC
import sysimport timeimport loggingfrom absl import appimport spuimport secretflow as sf# init loglogging.basicConfig(stream=sys.stdout, level=logging.INFO)# SPU settingscluster_def = {'nodes': [# <<< !!! >>> replace <192.168.0.1:12945> to alice node's local ip & free port {'party': 'alice', 'id': 'local:0', 'address': '192.168.0.1:12945', 'listen_address': '0.0.0.0:12945'},# <<< !!! >>> replace <192.168.0.2:12946> to bob node's local ip & free port {'party': 'bob', 'id': 'local:1', 'address': '192.168.0.2:12946', 'listen_address': '0.0.0.0:12946'},# <<< !!! >>> if you need 3pc test, please add node here, for example, add carol as rank 2# {'party': 'carol', 'id': 'local:2', 'address': '127.0.0.1:12347'}, ],'runtime_config': {'protocol': spu.spu_pb2.SEMI2K,'field': spu.spu_pb2.FM128, },}def main(_):# sf init# <<< !!! >>> replace <192.168.0.1:9394> to your ray head sf.init(address='192.168.0.1:9394') alice = sf.PYU('alice') bob = sf.PYU('bob') carol = sf.PYU('carol')# <<< !!! >>> replace path to real parties local file path. input_path = { alice: '/data/psi_1.csv', bob: '/data/psi_2.csv',# if run with `ECDH_PSI_3PC`, add carol# carol: '/data/psi_3.csv', } output_path = { alice: '/data/psi_output.csv', bob: '/data/psi_output.csv',# if run with `ECDH_PSI_3PC`, add carol# carol: '/data/psi_output.csv', } select_keys = { alice: ['id'], bob: ['id'],# if run with `ECDH_PSI_3PC`, add carol# carol: ['id'], } spu = sf.SPU(cluster_def)# prepare data start = time.time() reports = spu.psi_csv( key=select_keys, input_path=input_path, output_path=output_path, receiver='alice', # if `broadcast_result=False`, only receiver can get output file. protocol='KKRT_PSI_2PC', # psi protocol precheck_input=False, # will cost ext time if set True sort=False, # will cost ext time if set True broadcast_result=False, # will cost ext time if set True ) print(f"psi reports: {reports}") logging.info(f"cost time: {time.time() - start}") sf.shutdown()if __name__ == '__main__': app.run(main)
五、Benchmark报告
目前bechmark数据中,bc22 psi的性能还在进一步工程优化, 单测spu中bc22协定内核的性能比照能够参考pcg psi的介绍。
对于隐语SecretFlow
隐语官网:
www.secretflow.org.cn
隐语社区及代码拜访:
github.com/secretflow
gitee.com/secretflow
关注微信公众号:隐语的小剧场