diff --git "a/\346\234\211\345\245\226\345\276\201\351\233\206\346\264\273\345\212\250/\346\212\200\346\234\257\346\216\242\350\256\250\347\261\273/federated_object_detection_benchmark_\345\256\242\346\210\267\347\253\257\346\234\215\345\212\241\347\253\257\351\200\232\344\277\241\344\273\243\347\240\201\350\257\246\350\247\243.md" "b/\346\234\211\345\245\226\345\276\201\351\233\206\346\264\273\345\212\250/\346\212\200\346\234\257\346\216\242\350\256\250\347\261\273/federated_object_detection_benchmark_\345\256\242\346\210\267\347\253\257\346\234\215\345\212\241\347\253\257\351\200\232\344\277\241\344\273\243\347\240\201\350\257\246\350\247\243.md" new file mode 100644 index 0000000..ba48852 --- /dev/null +++ "b/\346\234\211\345\245\226\345\276\201\351\233\206\346\264\273\345\212\250/\346\212\200\346\234\257\346\216\242\350\256\250\347\261\273/federated_object_detection_benchmark_\345\256\242\346\210\267\347\253\257\346\234\215\345\212\241\347\253\257\351\200\232\344\277\241\344\273\243\347\240\201\350\257\246\350\247\243.md" @@ -0,0 +1,102 @@ +# 论文《Federated-Benchmark: A Benchmark of Real-world Images Dataset for Federated Learning》客户端服务端通信过程代码详解 + +## 代码目录:FATE/research/federated_object_detection_benchmark/ + +### 本文解析:client的行为写在fl_client.py中,server的行为写在fl_server.py中。整个框架中,client和server通过socket IO通信。 + + +# 初始化阶段 + +## 客户端handler注册 +Client中__init__()函数中调用register_handlers, 示意图如下, 下图列出了所有在监听的handler + + +其中分别注册了connect, disconnect, reconnect, init, request_update, stop_and_eval, check_client_resource 事件,对应的触发条件是self.sio.on函数的第一个参数,具体作用如下: + +* connect 事件当连接时被调用,打印connect指示当前已经连接到服务器 +* disconnect 事件当断开服务器时被调用,打印connect指示当前已断开 +* reconnect 当重新连接到服务器时候被调用,指示已经重新连接到服务器 +* init 当第一次连接到服务器的时候调用, 是client_wake_up的回调, 指示wakeup成功,开始加载本地模型,并通知服务器加载成功 +* request_update 服务器发送reqest_update的时候调用, 在本地训练一轮并将参数使用pickle转化后再转化为socketio能够通讯的string格式发送给服务器 +* stop_and_eval 在本函数中接收来自服务器的聚合模型,并使用本地的数据集评估后将评估结果发送给服务器 +* check_client_resource 的作用是检查本地资源负载情况并发送给服务器, 以便于服务器调整资源策略 + +## 服务器handler注册 + +Server中__init__调用register_handler来注册处理器,示意图如下图: + + +* connect 打印了客户端请求的sid,指示已经连接 +* disconnect 打印客户端sid并将客户端从客户端列表中移除 +* reconnect 打印重新连接的客户端sid +* client_wake_up 相应客户端唤醒的请求并命令客户端进行初始化 +* client_ready 将客户端加入客户端列表, 并且当客户端数目达到要求的时候,开始check客户端的资源 +* check_client_resource_done 客户端资源负载统计完毕,发回的请求,如果负载小于一定值,就将客户端加到一个选定客户端列表,如果超过半数的客户端达到要求,则开始训练, 否则将继续等待并检查客户端资源,直到要求满足 +* client_update 收到客户端发过来的权值信息并聚合,聚合完毕后将权值发送给客户端,并指示客户端进行评估 +* client_eval 收到客户端的评估指标并进行聚合, 计算服务器的loss等指标,计算完成后,进入下一轮训练 + + + + +# 通信流程 +Client通过__init__ ()函数向客户端发送‘client_wake_up’, 告诉server客户端已经唤醒。 + + + +server接收到消息后,发送'init',通知客户端初始化。 + + + +client接收到初始化消息后,通过on_init()函数进行本地模型初始化,并发向server发送'client_ready',告诉server我准备好了。 + + + + + +客户端收到当前轮数后,通过on_check_client_resource(*args)检查自身负载是否满足条件,并返回客户端资源检查完毕的消息。 + + + +Server接收到消息后,如果框中部分大于0.5进入下一轮训练,若小于0.5则返回去检查客户端资源。 + + + +Server通过train_next_round()函数将聚合后的模型传给client,并通知client开始request_update更新本地模型。 + + + +Client收到request_update后先通过register_handles()函数中的on_connect()等函数打印客户端与服务端的连接状态, + + + +然后通过on_request_update(*args)函数执行本地训练。 + + + +并将本地更新后的当前轮数,参数,训练集大小,loss传给server, + + + +同时通知server ‘client_update’。 + + + +Server收到本地更新的参数后,通过handle_client_update()函数执行参数聚合。 + + + +并通过stop_and_eval()函数向client发停止训练、开始验证的消息,进入验证阶段。 + + + +Client收到验证通知后,通过on_stop_and_eval(*args)函数基于本地验证集验证,并将验证结果返回给server。 + + + +Server接收到消息后,将所有客户端的loss,map,recall进行聚合得到全局模型的loss, map, recall。 + + + +并判断当前轮数是否大于最大轮数,若大于停止联邦学习过程,否则继续循环整个过程。 + +