SMILELab-FL/FedLab

fedlab.utils.serialization.SerializationTool无法完整序列化模型状态

pangbo13 opened this issue · 8 comments

FedLab/fedlab/utils/serialization.py 文件中 serialize_model 函数如下:

 @staticmethod
    def serialize_model(model: torch.nn.Module) -> torch.Tensor:
        parameters = [param.data.view(-1) for param in model.parameters()]
        m_parameters = torch.cat(parameters)
        m_parameters = m_parameters.cpu()

        return m_parameters

该函数只对模型的parameters进行了序列化。parameters只包括了模型的可训练参数,但模型的状态还包括一些不可训练参数,这些参数保存在buffers里(例如BatchNorm层的running_mean、running_var参数)。当前的serialize_model函数没有序列化这部分参数,请问这是刻意设计的吗?

考虑到通用性是这么做的。你可以把batchnorm的其他参数放到package其他位置。收到之后手动处理

但我认为从语义的角度考虑serialize_model应该完整序列化模型的状态。另外由于FedLab被设计为一个通用框架,理论上应该兼容各种自定义网络结构,部分layer功能可能依赖于buffers参数,从通用的角度考虑,序列化全部参数感觉是更合理的行为。将现在的serialize_model函数称为serialize_model_parameters与其实际功能更为匹配。

感谢你的支持与反馈。
另想请教下目前有联邦学习算法相关研究中,有传递这部分buffers参数的文献吗?🤔

感谢你的支持与反馈。 另想请教下目前有联邦学习算法相关研究中,有传递这部分buffers参数的文献吗?🤔

抱歉,我不太理解你的意思。buffers和parameters应该是pytorch在代码实现时为了方便进行的区分,而非理论研究层次的概念。
pytorch官方论坛上有一篇讨论,从中可以看出buffers并非字面意义上的“缓存”,而是模型的参数。就我的理解而言,只要文献中使用的模型用到了BN层(或者其他在pytorch实现中涉及buffers参数的layer),在传递模型时都应当传递了buffers参数,否则传递的状态是不完整的。

了解你的意思。在这个讨论中我注意到,buffer部分存储的是running information,并且这部分tensor并不需要被训练更新(据我所知目前的联邦学习相关方法中没有用到这部分buffer的信息),因此我提问相关文献是想询问是否有新方法对这部分参数的实际使用。
目前的版本如果需要传输这部分信息,可以手动提取这部分tensor,然后通过我们的通用网络接口通信。

感谢你的解答!我目前没有看到需要利用这部分参数的文献。

了解你的意思。在这个讨论中我注意到,buffer部分存储的是running information,并且这部分tensor并不需要被训练更新(据我所知目前的联邦学习相关方法中没有用到这部分buffer的信息),因此我提问相关文献是想询问是否有新方法对这部分参数的实际使用。 目前的版本如果需要传输这部分信息,可以手动提取这部分tensor,然后通过我们的通用网络接口通信。

FedBN考虑了单独对BN层进行了个性化对于性能的影响。其中可能会涉及到使用BN中running_mean和running_variance两个buffer。

了解你的意思。在这个讨论中我注意到,buffer部分存储的是running information,并且这部分tensor并不需要被训练更新(据我所知目前的联邦学习相关方法中没有用到这部分buffer的信息),因此我提问相关文献是想询问是否有新方法对这部分参数的实际使用。 目前的版本如果需要传输这部分信息,可以手动提取这部分tensor,然后通过我们的通用网络接口通信。

FedBN考虑了单独对BN层进行了个性化对于性能的影响。其中可能会涉及到使用BN中running_mean和running_variance两个buffer。

感谢补充,我会参考一下这篇文章。