联邦学习框架PySyft0.6.0踩坑

PySyft0.6.0踩坑

这个框架太多不完善的地方,我劝你别用

环境安装

安装anaconda和创建环境的过程略过

安装docker

服务器环境为Centos7

https://docs.docker.com/compose/install/

Centos https://docs.docker.com/engine/install/centos/

清理yum

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装yum-utils

sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装docker Engine

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

启动docker服务,开启开机自启动

systemctl enable docker 
systemctl start docker

赋予普通用户docker权限

$ echo $USER 
$ sudo usermod -aG docker $USER

验证安装是否成功

sudo docker run hello-world

输出如下,证明安装成功

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

修改ip段,防止冲突

删除现有虚拟网卡

ifconfig docker0 down
brctl delbr docker0
# ifconfig //找到名字是br-xxxx的网卡
sudo ifconfig br-xxxx down
sudo brctl delbr br-xxxx

如果有正在运行的容器,先删除再移除网卡

docker stop $(docker ps -a -q) //stop停止所有容器
docker  rm $(docker ps -a -q) //remove删除所有容器
# su root
# vim /etc/docker/daemon.json
# 添加如下内容
{
    "bip": "192.168.100.1/24",
    "debug" : true,
    "default-address-pools" : [
        {
            "base" : "10.51.0.1/16",
            "size" : 24
        }
    ]
}

重启docker

systemctl restart  docker

建立新conda环境并激活

conda create -n syft python=3.10
conda activate syft

安装jupyter

pip install jupyter

or

conda install -c conda-forge notebook

安装PySyft和PyGrid

pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple syft hagrid

这里使用了豆瓣源加速

测试

hagrid launch

直接执行会卡在访问github这一步,需要修改dns

sudo vim /etc/hosts

加入以下解析

140.82.112.3 http://github.com
185.199.108.153 assets-cdn.github.com
199.232.69.194  github.global.ssl.fastly.net

执行后获得如下报错

$ hagrid launch        
Updating HAGrid from branch: dev
Error checking out branch dev. Cmd('git') failed due to: exit code(1)
  cmdline: git pull -v origin
  stderr: 'fatal: unable to access 'https://github.com/OpenMined/PySyft.git/': Encountered end of file'
docker: 'compose' is not a docker command.
See 'docker --help'
This may be a linux machine, either that or docker compose isn't s
Result:

You are running an old version of docker, possibly on Linux. You need to install v2.
At the time of writing this, if you are on linux you need to run the following:

DOCKER_COMPOSE_VERSION=v2.3.4
curl -sSL https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64      -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose

ALERT: you may need to run the following command to make sure you can run without sudo.

echo $USER              //(should return your username)
sudo usermod -aG docker $USER

... now LOG ALL THE WAY OUT!!!

...and then you should be good to go. You can check your installation by running:

docker compose version

是因为docker compose没有成功安装

安装docker compose v2,参考https://github.com/docker/compose/tree/v2#linux

在releases界面下载pysyft要求的docker-composev2 2.3.4版本

赋执行权限

chomd +x docker-compose-linux-x86_64

改名字

mv docker-compose-linux-x86_64 docker-compose

然后复制到相应的目录下

# 个人目录
mv docker-compose ~/.docker/cli-plugins/
# 全局目录
mv docker-compose /usr/local/lib/docker/cli-plugins OR /usr/local/libexec/docker/cli-plugins
mv docker-compose /usr/lib/docker/cli-plugins OR /usr/libexec/docker/cli-plugins

再次执行hagrid launch即可

这时由于docker默认镜像拉取地址为国外仓库,会遇到如下错误

Error response from daemon: Head "https://registry-1.docker.io/v2/openmined/grid-backend/manifests/stable": Get "https://auth.docker.io/token?scope=repository%3Aopenmined%2Fgrid-backend%3Apull&service=registry.docker.io": net/http: TLS handshake timeout

需要换源到国内仓库

vim /etc/docker/daemon.json

在打开的文件中添加如下代码

{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}

加载docker配置并重启

systemctl daemon-reload
systemctl restart docker.service

再次执行hagrid launch,这时会开始拉取docker镜像,但是即使是在换过源的情况下,也有可能拉取失败,需要多次尝试,失败是正常的

多次尝试后,所有镜像拉取完毕,成功运行服务

运行成功

通过8081端口访问管理页面

管理页面

可以用openminded提供的示例账号登录

info@openmined.org

changethis

登录后

代码测试

经评论指出,教程在https://github.com/OpenMined/PySyft/tree/dev/notebooks

先了解一下Glossary

Glossary

框架中三个库的关系

PySyft:将联邦学习和隐私差分技术结合起来的开源远程数据科学实验平台。我的理解是一种标准,按照这个标准编写的代码可以用于联邦学习的训练,但是这个框架并没有通信能力。

PyGrid:一个可供数据科学家和数据拥有者使用PySyft共同训练模型的点对点网络。也是联邦学习的中心服务器,可以通过用户界面控制PyGrid。不知道能不能更改中心服务器的模型聚合算法?如何更改?

HaGrid:加速PyGrid部署的命令行工具。我没装。

用户角色

数据科学家:需要数据来进行计算的人,该用户可以查看数据集列表,并请求获取结果。(可以发起数据请求)

检查官:类似于群管理员,可以接受或者拒绝用户请求。

管理员:权限比检察官更高,不仅可以管理请求还可以修改域设置。

拥有者:每个域节点只有一个管理员账户,所有者是最高权限,是部署域节点的必要条件,转让域节点所有权需要联系Openmind(???)。

成员角色

客人:提供数据集,其数据集可以被所有用户发现

会员:提供数据集,其数据集由法律保护

配置远程jupyter以运行示例代码

示例代码

为数据添加隐私保护并上传数据

以每个国家冠状病毒数据为例,这一部分主要介绍了如何进行数据筛查以及将数据转换为PyGrid可用的格式。

PyGrid目前主要支持Numpy张量形式的数据。

利用PyGrid对数据进行隐私差分保护时,需要加入三个元数据:

min_val代表数据的取值下界,max_val代表数据的取值上界,这两个值与具体的数据无关,例如对于一张png图片,min_val取0,max_val取255。entity对应数据主体。

之所以需要数据取值的上下界,是因为需要向数据中添加噪音以达到隐私保护的目的,而噪音的取值需要与数据的取值尺度相对应,例如数据取值为100000,向其中添加0.1的噪音几乎不会取得任何保护作用。

import syft as sy

# 取出第一个国家的数据
country0_data = raw_data[0, :]

# 将数据转换为int32格式
country0_data = country0_data.astype(np.int32)

# 创造第一个国家对应的Entity
from syft.core.adp.entity import Entity
country0 = Entity(name="Country 0")

# 将数据转换为Syft Tensor
data = sy.Tensor(country0_data)

# 添加隐私保护
data = data.private(min_val=0, max_val=150000, entities=country0)

以这种方法,将所有国家的数据转换为Syft Tensor并添加保护

dataset = dict()
entities = []
for i in range(raw_data.shape[-1]):
    country_name = f"Country {i}"

    # 为每个国家建立对应的Tensor
    new_entity = Entity(name=country_name)
    entities.append(new_entity)

    # 将加入隐私保护后的数据重新组成数据集
    dataset[country_name] = sy.Tensor(raw_data[:, i].astype(np.int32)).private(min_val=0, max_val=150000, entities=new_entity)

将数据准备好后,就可以上传数据到PyGrid

# 加载域节点
domain_node = sy.login(email="info@openmined.org", password="changethis", port=8081)

# 上传数据集
domain_node.load_dataset(
    assets=dataset, 
    name="COVID19 Cases in 175 countries", 
    description="Weekly data for an entire year", 
    metadata="Any metadata you'd like to include goes here"
)

上传完毕后可以查看节点拥有的数据

domain_node.datasets

登录节点管理用户

# 登录节点, email, 密码和port按照实际情况填写
domain_node = sy.login(email="info@openmined.org", password="changethis", port=8081)
# 查看节点所有用户
domain_node.users
# 添加新用户, 新用户默认角色为数据科学家
domain_node.users.create(
    **{
        "name": "Sheldon Cooper",
        "email": "sheldon@caltech.edu",
        "password": "bazinga",
        "budget": 100
    }
)

!!!request有问题data_scientist_node.request_budget不起作用

网络节点

!!!无法找到网络节点

垃圾框架,换用flower试一下,这玩意等我有空再回来研究吧


文章作者: keevinzha
版权声明: 咳咳想白嫖文章?本文章著作权归作者所有,任何形式的转载都请注明出处。 https://www.keevinzha.com !
  目录