[联邦学习] 在FederatedScope 查看client和server之间的传递的参数大小(通讯量)

[联邦学习] 在FederatedScope 查看client和server之间的传递的参数大小(通讯量)

背景需求

想给自己的论文补一个通讯开销对比实验:需要计算出client和server之间传递的信息(例如,模型权重、embedding)总共加起来有多大。

通过在用户交流群的咨询,得知目前FS的monitor模块能够统计server/client之间的通信量(total_upload_bytes/total_download_bytes),同时可以在federatedscope/core/monitors/monitor.py下查看日志文件。

(PS: FS框架的开发老师在交流群中有问必答,总是耐心回答每个问题,感恩~)

按照开发老师的提示,我找到了训练完成后的log文件,文件的内容如下:

图1:system_metrics.log 示意图
图1:system_metrics.log 示意图

可以看到,这个log文件记录了每个client/server,下载/上传的字节数总和(例如上图红框所示)。

但是一开始,我并不清楚倒数第二行中“sys_avg/total_upload_bytes”和”sys_avg/total_download_bytes“这两个均值是如何计算出来的。同时也很好奇,FS到底是如何计算每个client的总上传/下载字节数。抱着这样的疑问和想法,我决定去学习一下FS相关的源码。

目标

SO,这次探索主要想弄清楚两件事

问题一:FS如何计算total_upload_bytes和total_download_bytes?
问题二:sys_avg/total_upload_bytes”和“sys_avg/total_download_bytes” 这两个值是怎么算出来的?

将初步结论放前面

对于问题1

在每一个联邦通讯论中,每次处理Message时,根据Message的content (即传递的消息的内容),来计算total_upload_bytes 和total_download_bytes,并将两个值存到Client类和Server类的成员变量中。

对于问题2

实际上,sys_avg/total_upload_bytes是每个client 和server 的total_upload_bytes 的平均值:

比如图1中:sys_avg/total_upload_bytes=56.78K=(114072+39504+39504+39504)/4/1024

在这里插入图片描述

对于问题一的探索

Note1:接下来的部分比较无聊,并且需要了解FederatedScope的运行机制(尤其是Message消息传递和事件驱动机制),推荐查看官方教程:

Note2:本博文仅考虑standalone模式的情况。

如何计算total_download_bytes?

track_download_bytes函数

计算该值的核心是**track_download_bytes()**函数:简单来说,该函数在处理每一个message时,计算该message的download_bytes并将其累加到client/server对象的成员变量中。

调用位置:fed_runner.py 的_handle_msg函数

在这里插入图片描述

track_download_bytes()函数的实现就是直接把传进来的参数加到 woker(client or server)类对象的total_download_bytes变量中

在这里插入图片描述

msg.count_bytes()函数

传给track_download_bytes()的参数 download_bytes这个变量,又基于msg.count_bytes()这个方法。
在这里插入图片描述

该方法的实现如下
在这里插入图片描述

可以看到,方法里使用了pympler.asizeof 这个函数,它的作用是计算Python对象消耗的内存大小(返回值的单位是Bytes

用法示例:

pympler.asizeof can be used to investigate how much memory certain Python objects consume. In contrast to sys.getsizeof, asizeof sizes objects recursively. You can use one of the asizeof functions to get the size of these objects and all associated referents:

例子:

>>> from pympler import asizeof
>>> obj = [1, 2, (3, 4), 'text']
>>> asizeof.asizeof(obj)
176

如何计算 upload_bytes ?

跟踪download_bytes 的位置

StandaloneCommManager类的send函数

定位:federatedscope/core/communication.py

在这里插入图片描述

什么时候会调用send?

woker类中,发送Message时,通常会使用的就是self.comm_manager.send。

举例:

在这里插入图片描述

在这里插入图片描述

upload_bytes如何计算?

当前轮Message的upload_bytes大小=Messge中的接收方的数量*这个Message的content的大小

在这里插入图片描述

对于问题二:两个统计量的均值是怎么算出来的

由于代码逻辑比较复杂,截图略麻烦,所以这里主要用文字表述。

简而言之,每一个通讯轮的评估阶段,框架会将每个参与者(client和server)的系统统计量,存到日志文件(system_metrics.log)里。存储时,当前轮的统计量会覆盖上一轮的统计量。

举个例子,假设有3个client和1个server,那么整个联邦过程结束后,system_metrics.log文件里只有4行(即图1中去掉最后两行)。

而之后,框架会调用名为 merge_system_metrics_simulation_mode()的方法。该方法读取system_metrics.log这个文件,根据文件里的数据取平均值。

在这里插入图片描述
函数定位:federatedscope/core/monitors/monitor.py

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值