在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录

Posted 涵林同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录相关的知识,希望对你有一定的参考价值。

在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 示意图

可以看到,这个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

如何计算 download_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

以上是关于在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录的主要内容,如果未能解决你的问题,请参考以下文章

基于conda安装Federatedscope环境遇坑解决记录

Next.js + React 返回上一页

windows dns doh clien server dnscrypt

MetaException(message:For direct MetaStore DB connections, we don't support retries at the clien

Ubuntu 设置hosts

json PHP服务中的SOAP服务在PHP中的SOAP客户端 - http://www.starstormdesign.de/soap-service-mit-einem-soap-client-