Pysyft学习笔记一:dome思路

Pysyft是一个比较适合学习FL学习小白的开源框架,相比与FATE的高封装性,Pysyft提供了更高的自由度。虽然FATE确实加密算法等等的效果做的非常的好,但是我在Ubuntu下面捣鼓了两天,下载了Mysql,Redis等等的一堆东西,采用docker的方式来部署FATE,发现环境配置的难度实在太高了,像我这种小白,FL本来就不是很熟悉,还是Pysyft友好一些。

记录一下Pysyft学习的心得

因为Pysyft主要是用于分布式学习,所以我首先打算搞明白它是如何实现分布式的。先用syft模拟一下,syft底层使用命令链实现的。

导入必要的包

import syft as sy

import torch

扩展pytorch
熟悉pytorch的同学都知道,torch的训练核心是tensor的改变,传统集中式的训练在本地就可以处理torch,不需要考虑分发与回收。所以Pysyft提供了TorchHook()类,扩展了torch(主要是tensor),为分布式训练提供了一种思路。

hook = sy.TorchHook(torch)

这里有一个单词叫Hook,直译为钩子。在CS中指代一种技术,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
定义传输模型

x = torch.tensor([1,2,3,4,5])
y = torch.tensor([5,4,3,2,1])

tensor是传给客户端的数据,在这里为了方便演示,采用tensor的方式传给客户端,实际情况下应该传递的是XNN model。
创建客户端
可以创建多个,但是由于是dome,所以采用1客户端的方式。hook是一定要传入的参数(暂时不懂为什么),id是客户端的名称。

#创建一个客户端one
one = sy.VirtualWorker(hook, id='one')

分发模型
在tensor创建好以后,就可以下发给客户端了,但是下发的是副本。

x_ptr = x.send(one)
y_ptr = y.send(one)

但是因为要指导客户机操作,所以会保留副本的指针。但是接下来对指针的所有操作都会转化为对数据的操作。
训练模型
并没有训练实际的模型,因为只是实现一种dome的思路。这里采用dome相加的方式来实验一下。

print("1:",x_ptr)
print("2:",y_ptr)   
x_ptr = x_ptr + y_ptr
print("3:",x_ptr)

这两个指针的相加按照常理本应该出错,但是可以把这个理解为一种指导,所以实际上在客户端进行了相加的操作。

运行效果如下:
在这里插入图片描述me代表的是服务器的id(默认),one代表的是客户端的id,冒号后面的数字代表的是在客户端中的tensor的地址。这里可能会疑惑,为什么x_ptr的地址会改变,实际上,在执行x_ptr + y_ptr时,并不是在本地执行的加法,一个命令序列化后发送给了one,one执行了这个计算操作,创建了一个tensor,然后返回了一个指针到本地机器。
在这里插入图片描述

收回模型

x_value = x_ptr.get() 
print(x_value)

get方法收回模型,并且销毁x_ptr指针。
在这里插入图片描述
以上就是dome的思路,应该就是这个架构,以后再慢慢完善后续的章节,争取寒假学会Pysyft。

猜你喜欢

转载自blog.csdn.net/qq_45931661/article/details/122524776