网站建设工作计划,微网站建设教程视频教程,哈尔滨建设工程管理工资多少,手工制作花灯在FederatedScope 如何查看client/server之间的传递的参数大小#xff08;通讯量#xff09;#xff1f; 对源码的探索记录
背景需求
想给自己的论文补一个通讯开销对比实验#xff1a;需要计算出client和server之间传递的信息(例如#xff0c;模型权重、embedding)总共…在FederatedScope 如何查看client/server之间的传递的参数大小通讯量 对源码的探索记录
背景需求
想给自己的论文补一个通讯开销对比实验需要计算出client和server之间传递的信息(例如模型权重、embedding)总共加起来有多大。
通过在用户交流群的咨询得知目前FS的monitor模块能够统计server/client之间的通信量total_upload_bytes/total_download_bytes同时可以在federatedscope/core/monitors/monitor.py下查看日志文件。
PS: FS框架的开发老师在交流群中有问必答总是耐心回答每个问题感恩~
按照开发老师的提示我找到了训练完成后的log文件文件的内容如下 图1system_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_bytes56.78K(114072395043950439504)/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函数的实现就是直接把传进来的参数加到 wokerclient 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 asizeofobj [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