Facebook CrypTen多方计算环境搭建
这里主要参考了crypten/scripts/aws_launcher.py代码以及pytorch文档,使用两台虚拟机搭建了多机器参与的多方计算环境.(当然单台机器可以不用任何配置,直接跑CrypTen中的代码.CrypTen会利用单机器的多个内核去模拟多方环境进行计算).
CrypTen 简单介绍
CrypTen是Facebook在2019年10月开源的,用于多方安全计算(MPC)的框架.官网说明见https://ai.facebook.com/blog/crypten-a-new-research-tool-for-secure-machine-learning-with-pytorch/.
虚拟机安装
- 虚拟机工具: VirtualBox
- 虚拟机系统: ubuntu (server版. 版本:18.04.4)
CrypTen环境
参考官网文档进行配置即可(https://github.com/facebookresearch/CrypTen).
两台机器上要有同样的环境和代码.
pip install crypten
git clone https://github.com/facebookresearch/CrypTen.git
cd CrypTen
pip install -r requirements.examples.txt
老版本CrypTen文档需要安装anaconda,然后自行安装pytorch.部分虚拟机安装anaconda失败,主要是安装卡在0%不动了.可以下载其他版本进行安装(https://repo.anaconda.com/archive/)
Pytorch 环境变量
由于CrypTen分布式计算(DistributedCommunicator类)底层通信依赖pytorch的distributed,所以需要设置pytorch分布式计算相关环境变量. 具体使用方式参考官网(https://pytorch.org/tutorials/intermediate/dist_tuto.html).
如下是我使用CrypTen时的配置方法.
export WORLD_SIZE=2
export RENDEZVOUS=env://
export MASTER_ADDR=192.168.1.114
export MASTER_PORT=29500
export RANK=0
export GLOO_SOCKET_IFNAME=enp0s3
说明:
MASTER_PORT
: A free port on the machine that will host the process with rank 0.MASTER_ADDR
: IP address of the machine that will host the process with rank 0.WORLD_SIZE
: The total number of processes, so that the master knows how many workers to wait for.RANK
: Rank of each process, so they will know whether it is the master of a worker. master节点配置rank为0.副节点rank为1.GLOO_SOCKET_IFNAME
: 因为默认pytorch使用的bankend是gloo.我的网卡名是enp0s3
。 如果没有设置网卡名称,会报错pytpair.cc:761] connect [127.0.1.1]:40363: Connection refused
解决方法参考(https://github.com/pytorch/pytorch/issues/15592)
export GLOO_SOCKET_IFNAME=WHATEVER IN IFCONFIG (like eth0 or something)
RENDEZVOUS
: 看源码似乎没必要设置,有默认值,这个我这边是加上的.
多方计算
2台机器的环境设置好以后,分别在主节点
和副节点
运行代码.
python examples/mpc_linear_svm/launcher.py