Pysyft学习笔记三:分布式模型实现(Fed_avg算法整合模型)

Posted 一只特立独行的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pysyft学习笔记三:分布式模型实现(Fed_avg算法整合模型)相关的知识,希望对你有一定的参考价值。

导入包

导入包,并初始化Hook

import torch 
import syft as sy

from torch import nn
from torch import optim

hook = sy.TorchHook(torch)

构建客户机

Bob = sy.VirtualWorker(hook,id='Bob')
Alice = sy.VirtualWorker(hook,id='Alice')

构建数据集

自己随便想了一些数据来训练

data = torch.tensor([[0,0],[0,1], [1,0], [1,1.]],requires_grad=True)
targe = torch.tensor([[0],[0],[1], [1.]],requires_grad=True)

构建模型

先建立一层全连接层,然后把数据分发出去,相当于初始化了训练环境。

#全连接模型,输入是二维,输出是一维,可以理解为读两个数,输出一个数
model = nn.Linear(2,1)

data_Bob_ptr = data[:2].send(Bob)
targe_Bob_ptr = targe[:2].send(Bob)
data_Alice_ptr = data[2:].send(Alice)
targe_Alice_ptr = data[2:].send(Alice)

定义分布式训练函数,采用平均算法合并模型

想把初始模型发送到客户端,客户端用自己所拥有的数据进行训练后,再将模型返回给服务器。服务器将两个模型进行整合,得到一个对双方数据都有较好预测效果的模型。

def train():
	#分发模型
    Bob_model = model.copy().send('Bob')
    Alice_model = model.copy().send('Alice')

    #分布式训练优化器设置,采用随机梯度下降
    Bob_opt = optim.SGD(params=Bob_model.parameters(),lr=0.1)
    Alice_opt = optim.SGD(params=Alice_model.parameters(),lr=0.1)

    for epoch in range(50):    
        #梯度清0
        Bob_opt.zero_grad()
        Alice_opt.zero_grad()     

        #在Bob上进行训练
        Bob_pred = Bob_model(data_Bob_ptr)
        Bob_loss = ((Bob_pred - targe_Bob_ptr)**2).sum()
        Bob_loss.backward()
        Bob_opt.step()

        #在Alice上面训练
        Alice_pred = Alice_model(data_Alice_ptr)
        Alice_loss = ((Alice_pred - targe_Alice_ptr)**2).sum()
        Alice_loss.backward()
        Alice_opt.step()

        # print(Bob_loss.get().data.item())
        print("第次epoch,avg_loss为:".format(epoch,
                                                (Bob_loss.get().data.item()+Alice_loss.get().data.item())/2))

    with torch.no_grad():
        #回收模型
        Bob_model.get()
        Alice_model.get()
        #进行模型平均后合并
        model.weight.set_((Bob_model.weight.data+Alice_model.weight.data))/2
        model.bias.set_((Bob_model.bias.data+Alice_model.bias.data))/2

	#对Bob的模型进行评估
    pred = Bob_model(torch.tensor([[0,1],[0,1], [1,0], [1,1.]]))
    print(pred.data)

	#对Alice的模型进行评估
    pred = Alice_model(torch.tensor([[0,1],[0,1], [1,0], [1,1.]]))
    print(pred.data)

训练并评估

对整合后的模型进行评估。

train()

pred = model(torch.tensor([[0,1],[0,1], [1,0], [1,1.]]))
print(pred.data)

这里采用一次分发与回收的方案,但是这样我觉得很难整合,如果客户机迭代一次后立刻对模型进行整合,然后再次分发,这算作一个总的迭代过程,是否对模型的整体效果更优?但是这样通信量会增加,训练开销肯定会变大。

以上是关于Pysyft学习笔记三:分布式模型实现(Fed_avg算法整合模型)的主要内容,如果未能解决你的问题,请参考以下文章

Pysyft学习笔记二:伪分布式模型训练的实现

Pysyft学习笔记二:伪分布式模型训练的实现

Pysyft学习笔记四:MINIST数据集下的联邦学习(并行训练与非并行训练)

Pysyft学习笔记四:MINIST数据集下的联邦学习(并行训练与非并行训练)

Pysyft学习笔记一:dome思路

Pysyft学习笔记一:dome思路