0524个人总结八

近期工作

汇总

1.完善任务等待部分

2.重构任务训练部分

3.进行登录注册测试部分的代码书写

细分

完善任务等待部分

# 进行查询
mission = Mission.objects.get(mission_id=task_id)
# 如果查询不到,说明任务已经取消
if mission is None:
	returnValue['message_state'] = False
    returnValue['message'] = '任务已取消'
    self.send(text_data=json.dumps(returnValue))
need, have, accounts = \
    mission.demand_user, mission.current_user, mission.user_accounts

在一开始写任务等待部分的时候,我只考虑了人员的新增和个人的自主退出,没有考虑到发起者的个人退出,当发起者觉得这个项目没有人参与的时候,可以进行自主退出,这个时候任务将会删除,其他人访问数据库的时候是没有这条数据的,因此我们需要考虑到这个情况。

这里我的处理是在每次循环查询数据库的时候,都对读取到的对应任务进行判断,如果读取到的任务为空,说明任务已删除,这时候需要给前端反馈信息。

重构任务训练部分

1.关于与聚合端连接的更改
# 前端提示返回值
returnValue = {
	'message': '',
    'message_state': False,
    'accuracy': 0.0,
    'judge': judge,
}

# 首先获取到聚合端的ip和端口号(如果为空,就返回提示:尚未聚合端,请耐心等待)
uniteServers = UniteServer.objects
if not uniteServers.exists():
	# 数据库为空,返回给前端提示
    returnValue['message'] = '聚合端为空,请耐心等待!'
    returnValue['message_state'] = True
    self.send(text_data=json.dumps(returnValue))
    return
uniteServer = uniteServers.first()
ip, port = uniteServer.ip, uniteServer.port
# 通过从数据库中读取的ip和port与聚合端建立连接
        clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        clientSocket.connect((ip, port))
        print("与聚合端建立连接")

在之前为了测试模型训练的方便,我们采取的措施是先获取聚合端ip和port,然后设置好在进行训练,现在我们将功能封装成系统,这样的方式就不再适合,因此我们采取的措施是当聚合端启动的时候会直接写入自己的ip和port到数据库中,在进行训练的时候会先读取数据库中的聚合端的ip和port进行连接,这样每次连接都算是自动的连接,解决了之前固定好ip和port的问题。

2.模型文件的引入和调用
# 根据任务id,从数据库中获取模型的名称、模型的py文件和初始模型,放到固定位置
text_data_json = json.loads(text_data)
print(text_data_json)
task_id = text_data_json['task_id']

# 这里需要更改任务状态
mission = Mission.objects.get(mission_id=task_id)
# 这里的文件转换先不考虑
# 文件转换保存已完成
mission_type, dataset_type, python_file, original_model = \
	mission.mission_type, mission.dataset_type, \
    mission.python_file, mission.original_model
mission.mission_state = '训练开始'
mission.save()

# 模型文件和初始模型保存在model文件夹下
with open('model/' + mission_type + '.py', 'wb') as file:
	file.write(python_file)
with open('model/' + mission_type + '.model', 'wb') as file:
    file.write(original_model)

# 动态导入module
model = importlib.import_module('model.' + mission_type)
# 动态获取module中的类实例变量
net = getattr(model, mission_type)()

# 加载初始模型
net.load_state_dict(torch.load('model/' + mission_type + '.model'))

我们需要实现是所有完全异步联邦学习任务的可视化,所以model文件应该由任务发起者去指定,而不是固定在训练端,我们采取的方式是将模型的py文件保存在数据库中,训练开始的时候读取并进行保存,通过这个操作我们基本上可以完成之前的戴老师的要求——自我适配联邦学习,而不是我们去主动适配,通过我们提供模型的模板,发起用户将模板填写并提交,参与用户下载并参与训练,这样就实现了自我适配。

接下来的问题就是怎样去调用这个模型,我想到的方法就是通过文件名进行动态导入,这里使用的是importlib库中的动态导入函数,通过这个函数我们可以根据文件名的字符串进行动态导入module,从而实现调用对应的模块。

这里还有一个问题有待解决,需要后续进行修正,当对于初始模型的上传是可选项,而不是必选项,所以在网络加载初始模型的时候,我们需要根据数据库中读取的文件进行判断,如果没有该文件,就不进行加载初始模型,而是使用网络自带的随机参数。

3.与聚合端交互,并更新数据库中的模型
try:
	temp_pickle = pickle.dumps(message)
    # print(sys.getsizeof(temp_pickle))
    clientSocket.sendall(temp_pickle)

    # 接受聚合端返回的模型数据
    message = pickle.loads(clientSocket.recv(10000000))
    # 设置模型数据
    net.load_state_dict(message.getData(), strict=True)
    # 保存模型数据为model文件
    torch.save(message.getData(), 'model/' + mission_type + '.model')
    # 保存到数据库中
    with open('model/' + mission_type + '.model', 'rb') as file:
    	strb = ''.encode()
        strb += file.read()
        mission = Mission.objects.get(mission_id=task_id)
        mission.current_model = strb
        mission.save()
except socket.error:
    print('Socket.error happened')

在循环训练过程中,当与聚合端交互接受到最新模型的时候,我们需要将其加载到原本的网络中,并且去更新数据库中的当前模型。对此我采取的措施是,接受到数据,并去覆盖原本的模型参数文件。

下步计划

1.目前所有功能基本构建完成,下面将进行所有功能的单元测试、集成测试以及系统测试

2.与队友思考一下还有什么功能可以添加以及什么功能是冗余的需要删减

3.将整个网站部署起来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值