1、新建虚拟环境
由于pysyft
和pytorch
之间有版本制约,在已有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、注意事项
在上面的安装中,安装的torch
是2255.6 MB
的 1.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
除了上述方法,也可以直接通过安装pysyft
的whl
文件进行安装。
接下来,我们检查一下安装到本地的各种包的版本
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框架联邦案例
下面是一个使用 PySyft
和 PyTorch
框架实现的联邦学习案例,数据集使用了随机生成的数据。
导入必要的库
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
就没有出现报错了!
在安装过程中出现问题,欢迎评论、私信等,相互学习!