安装pysyft联邦框架和pysyft代码案例

1、新建虚拟环境

由于pysyftpytorch之间有版本制约,在已有pytorch环境直接安装pysyft,可能会导致原有的pytorch异常,所以建议新建虚拟环境。

conda create -n pysyft python=3.9

激活环境

conda activate pysyft

在这里插入图片描述

2、安装pysyft

在安装pysyft时,会自动将依赖的环境安装好,所以直接安装pysyft就行,不需要提前安装 pytorch!!!

目前pysyft的版本有:

versions: 0.1.0a1, 0.1.1a2, 0.1.2a1, 0.1.3a1, 0.1.4a1, 0.1.4a2, 
0.1.5a1, 0.1.6a1, 0.1.7a1, 0.1.8a1, 0.1.9a1, 0.1.10a1, 
0.1.10a2, 0.1.10a4, 0.1.11a1, 0.1.12a1, 0.1.13a1, 0.1.14a1, 
0.1.15a1, 0.1.16a1, 0.1.19a1, 0.1.20a1, 0.1.21a1, 0.1.22a1, 
0.1.23a1, 0.1.24a1, 0.1.25a1, 0.1.26a1, 0.1.27a1, 0.1.28a1, 
0.1.29a1, 0.2.0a1, 0.2.0a2, 0.2.1a1, 0.2.2a1, 0.2.3a1, 
0.2.3a2, 0.2.3a3, 0.2.3, 0.2.4, 0.2.5, 0.2.6, 0.2.7, 0.2.8, 
0.2.9, 0.3.0, 0.5.0rc1, 0.5.0rc2, 0.5.0rc3, 0.5.0, 0.5.1, 
0.6.0a0, 0.6.0a1, 0.6.0a2, 0.6.0a3, 0.6.0a4, 0.6.0a5, 0.6.0, 
0.7.0b1, 0.7.0b2, 0.7.0b3, 0.7.0b4, 0.7.0b5, 0.7.0b6, 
0.7.0b7, 0.7.0b8, 0.7.0b9, 0.7.0b10, 0.7.0b11, 0.7.0b12, 
0.7.0b13, 0.7.0b14, 0.7.0b15, 0.7.0b16, 0.7.0b17, 0.7.0b18, 
0.7.0b19, 0.7.0b20, 0.7.0b21, 0.7.0b22, 0.7.0b23, 0.7.0b24, 
0.7.0b25, 0.7.0b26, 0.7.0b27, 0.7.0b28, 0.7.0b29, 0.7.0b30, 
0.7.0b31, 0.7.0b32, 0.7.0b33, 0.7.0b34, 0.7.0b35, 0.7.0b36, 
0.7.0b37, 0.7.0b38, 0.7.0b39, 0.7.0b40, 0.7.0b41, 0.7.0b42, 
0.7.0b44, 0.7.0b45, 0.7.0b46, 0.7.0b47, 0.7.0b48, 0.7.0b49, 
0.7.0b50, 0.7.0b51, 0.7.0b52, 0.7.0b53, 0.7.0b54, 0.7.0b55, 
0.7.0b56, 0.7.0b57, 0.7.0b58, 0.7.0b59, 0.7.0b60, 0.7.0b61, 
0.7.0b62, 0.7.0, 0.8.0b1, 0.8.0b2, 0.8.0b3, 0.8.0b4, 0.8.0b5, 
0.8.0b6, 0.8.0b7, 0.8.0b8, 0.8.0b9, 0.8.0b10

在这里插入图片描述

本文以安装syft 0.7.0版本为例

pip install syft==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

3、安装jaxlib

在上面的安装的过程中出现报错:

ERROR: Could not find a version that satisfies the requirement jaxlib==0.3.14 (from syft) (from versions: none)
ERROR: No matching distribution found for jaxlib==0.3.14

在这里插入图片描述

这表明,没有jaxlib==0.3.14文件,需要我们手动安装

通过安装whl文件解决:

点击:下载地址,或者访问 https://whls.blob.core.windows.net/unstable/index.html

在这里插入图片描述

在网页中找到jaxlib==0.3.14文件:

在这里插入图片描述

下载到桌面

在这里插入图片描述
继续在虚拟环境中输入(假设你的文件放在D:\desktop下):

pip install D:\desktop\jaxlib-0.3.14-cp39-none-win_amd64.whl

在这里插入图片描述

4、安装完成

此时jaxlib==0.3.14已经安装好,同理,倘若在你安装的过程中出现类似问题,也可以通过这种思路解决,本文只出现这个问题。

那么继续在虚拟环境输入:

pip install syft==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

对于上一次输入上面代码执行的内容,即已经安装的库,不需要重新安装,上面的代码会接着之前的步骤继续执行。

在这里插入图片描述
出现这样的界面,则安装成功

5、安装结果测试

在虚拟环境中输入:

python -c "import syft,torch"

在这里插入图片描述
没有出现报错,这表示pysyft, pytorch两个框架都安装好。

6、注意事项

在上面的安装中,安装的torch2255.6 MB1.13.1+cu117

# Downloading https://download.pytorch.org/whl/cu117/torch-1.13.1%2Bcu117-cp39-cp39-win_amd64.whl (2255.6 MB)

也就是说,自动安装了适配的torch-1.13

在这里插入图片描述

除了上述方法,也可以直接通过安装pysyftwhl文件进行安装。

接下来,我们检查一下安装到本地的各种包的版本

pip list

显示:

Package             Version
------------------- ------------
absl-py             1.4.0
ascii-magic         1.6
async-timeout       4.0.2
bcrypt              4.0.1
boto3               1.26.51
botocore            1.29.122
cachetools          5.3.0
certifi             2022.12.7
cffi                1.15.1
charset-normalizer  3.1.0
chex                0.1.6
colorama            0.4.6
commonmark          0.9.1
contourpy           1.0.7
cycler              0.11.0
dm-tree             0.1.8
dnspython           2.3.0
email-validator     2.0.0.post2
etils               1.2.0
flatbuffers         2.0.7
flax                0.5.3
fonttools           4.39.3
forbiddenfruit      0.1.4
gevent              22.10.2
greenlet            2.0.2
idna                3.4
importlib-resources 5.12.0
jax                 0.3.14
jaxlib              0.3.14
jmespath            1.0.1
kiwisolver          1.4.4
loguru              0.6.0
matplotlib          3.6.3
msgpack             1.0.5
names               0.3.0
numpy               1.24.3
opt-einsum          3.3.0
optax               0.1.5
packaging           23.1
pandas              1.5.2
Pillow              9.5.0
pip                 23.0.1
protobuf            3.19.5
pyarrow             10.0.1
pycapnp             1.2.2
pycparser           2.21
pydantic            1.10.4
Pygments            2.15.1
PyJWT               2.6.0
Pympler             1.0.1
PyNaCl              1.5.0
pyparsing           3.0.9
python-dateutil     2.8.2
pytz                2023.3
PyYAML              6.0
redis               4.4.2
requests            2.28.2
requests-toolbelt   0.10.1
rich                11.2.0
s3transfer          0.6.0
scipy               1.10.1
setuptools          66.0.0
six                 1.16.0
SQLAlchemy          1.4.46
syft                0.7.0
tensorstore         0.1.36
toolz               0.12.0
torch               1.13.1+cu117
tqdm                4.64.0
typing_extensions   4.4.0
urllib3             1.26.15
wheel               0.38.4
win32-setctime      1.1.0
zipp                3.15.0
zope.event          4.6
zope.interface      6.0

7、pysyft框架联邦案例

下面是一个使用 PySyftPyTorch 框架实现的联邦学习案例,数据集使用了随机生成的数据。

导入必要的库

import torch
import syft as sy
from torch import nn, optim
import random

接下来,我们设置一些参数,比如随机种子、数据大小、批量大小和训练轮数等:

# 随机种子
random_seed = 42
# 数据大小
data_size = 1000
# 批量大小
batch_size = 32
# 训练轮数
num_epochs = 10

然后我们定义一个函数来生成随机数据。这个函数生成两个随机数作为特征,然后将它们相加并返回和作为标签。

def generate_data(n):
    X = torch.randn(n, 2)
    y = X.sum(dim=1).unsqueeze(1)
    return X, y

接下来,我们定义一个 PySyft 钩子来使 PyTorch 支持联邦学习。

# 定义本地工作节点
hook = sy.TorchHook(torch)

# 定义两个远程工作节点
bob = sy.VirtualWorker(hook, id="bob")
alice = sy.VirtualWorker(hook, id="alice")

# 把数据发送给工作节点
bob_data = generate_data(data_size).send(bob)
alice_data = generate_data(data_size).send(alice)

我们接着定义一个模型,这里我们使用一个简单的线性模型:

class LinearRegression(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(2, 1)
        
    def forward(self, x):
        return self.linear(x)

接着我们在每个工作节点上定义一个本地模型:

# 在 bob 和 alice 上定义本地模型
bob_model = LinearRegression().send(bob)
alice_model = LinearRegression().send(alice)

然后我们定义一个优化器和损失函数:

# 定义优化器和损失函数
optimizer = optim.SGD(params=[bob_model.parameters(), alice_model.parameters()], lr=0.1)
criterion = nn.MSELoss()

接下来我们开始训练模型。我们将模型在每个工作节点上训练一定的轮数,然后将模型参数合并在一起并更新全局模型。我们在每个轮次之后计算一下在测试集上的损失。

# 开始训练模型
for epoch in range(num_epochs):
    # 将模型参数从全局模型分发到本地模型
    bob_model_params = bob_model.parameters()
    alice_model_params = alice_model.parameters()
    model_params = [bob_model_params, alice_model_params]
    
    for i, data in enumerate([bob_data, alice_data]):
        # 获取数据和标签
        X, y = data.get()
        
        # 在本地模型上训练
        model = model_params[i]
        for j in range(num_epochs):
            optimizer.zero_grad()
            output = model(X)
            loss = criterion(output, y)
            loss.backward()
            optimizer.step()
        
        # 将本地模型的参数更新到全局模型
        model_params[i] = model_params[i].get()
    
    # 合并模型参数并更新全局模型
    bob_model_params, alice_model_params = model_params
    with torch.no_grad():
        global_model_params = [(x + y) / 2 for x, y in zip(bob_model_params, alice_model_params)]
        bob_model.load_state_dict(global_model_params)
        alice_model.load_state_dict(global_model_params)
    
    # 计算在测试集上的损失
    test_X, test_y = generate_data(100).get()
    with torch.no_grad():
        output = bob_model(test_X).get()
        loss = criterion(output, test_y)
        print(f"Epoch {epoch+1}, Test Loss: {loss.item():.4f}")


在每个轮次中,我们将模型参数从全局模型分发到本地模型,然后在每个工作节点上训练模型。我们在本地模型上训练模型的方式和在单个机器上训练模型的方式是相同的。然后我们将本地模型的参数更新到全局模型,合并模型参数并更新全局模型。最后我们计算在测试集上的损失。

8、一些优秀教程

(1)pysyft安装过程
https://blog.csdn.net/qq_41185868/article/details/126983353
https://blog.csdn.net/weixin_42436776/article/details/116699765

(2)官网地址
https://github.com/OpenMined/PySyft/tree/syft_0.2.x
https://gitcode.net/mirrors/OpenMined/PySyft?utm_source=csdn_github_accelerator
https://whls.blob.core.windows.net/unstable/index.html

9、报错解决办法

在上面成功安装后,安装jupyter notebook导致出现问题,这里给出解决办法。

安装jupyter notebook(此步骤非必要,自行决定。安装后会导致syft出错,这里给出解决办法)

conda install jupyter notebook

执行脚本代码:

import torch
import syft as sy

或者虚拟环境执行:

python -c "import syft,torch"

出现错误提示:
在这里插入图片描述

安装jupyter notebook后, 出现版本不适配问题

报错:AttributeError: partially initialized module ‘charset_normalizer’ has no attribute ‘md__mypyc’ (most likely due to a circular import)

为解决这个问题,再次安装一便,不会重新下载没有影响的包,神之一码:

pip install syft==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

继续执行代码,报错 ‘COMMON_SAFE_ASCII_CHARACTERS‘

报错:cannot import name ‘COMMON_SAFE_ASCII_CHARACTERS‘ from ‘charset_normalizer.constant‘
解决:https://blog.csdn.net/weixin_47037450/article/details/129616415

解决:直接安装chardet,问题解决!

pip install chardet

再次执行

import torch
import syft as sy

就没有出现报错了!


在安装过程中出现问题,欢迎评论、私信等,相互学习!

  • 11
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高山莫衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值