在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环境遇坑解决记录
windows dns doh clien server dnscrypt
MetaException(message:For direct MetaStore DB connections, we don't support retries at the clien
json PHP服务中的SOAP服务在PHP中的SOAP客户端 - http://www.starstormdesign.de/soap-service-mit-einem-soap-client-