# federated_malware **Repository Path**: Eyestorm/federated_malware ## Basic Information - **Project Name**: federated_malware - **Description**: 使用机器学习和深度学习进行恶意软件分类 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2021-03-23 - **Last Updated**: 2025-03-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 实验与工程计划 > 关于实验。做减法更加重要。只在maldroid上做实验。 > 在websocket的基础上拓展,完善系统。在单机单线程的仿真中,完成理论实验。属于是工程计划的一部分。 > 每天500行代码不过分吧。6530, ### 实验计划(两周) * 重读论文**理论部分**,联邦学习的各个**算法实现**。(1轮实验) * [x] 算法实现 * [x] fedavg * [x] fedida * [x] fedprox * [x] fedScafflod * [x] fedAmp(消息通信)今天晚上视线这个。实验算是告一段落了 * [x] fedPer(个性化层) * [x] fedmaml(per-fedavg)(事实上,这个实现的并不是基于maml的fedmeta方法。更像是个性化层。我还是没有理解maml的本质把,这里需要重新读一下,继续实现这个算法。实现完了这一系类,在趋势线,那两个集中式的算法。和AMP、FMC。总共留个算法。很快的。) * [x] fedreptile 联邦元学习的一种实现方法 * [x] fed_meta_per * [x] 在客户端根据sacaffold的方向进行调整 * [x] 在客户端使用元学习的思路进行训练。将串行的元学习思路应用到并行的联邦学习当中。构建一个局部串行训练,总体并行训练的模型 * [x] 在服务器上,根据贡献度和客户端的数据规模,对数据集的聚合进行调整 * [x] 保留个性化层的内容,添加一个没有个性化层的版本 * [x] ~~未完成的算法~~ * [x] ~~fednova(集中式)与fedprox几乎一致。多加了一个超参数。~~(交给学弟?) * [x] ~~pFedMe(集中式)与fedprox一模一样。服务器聚合的时候多加了一个超参数。~~(交给学弟) * [x] ~~fedDand(集中式)有原来的工程,也是在聚合上做修正。~~(交给学弟) * [x] ~~fedFMC(终身学习)~~(交给学弟) * [x] 完成算法的重构工作 * [x] 对算法的工程进行整体优化,删除各个算法中,冗余的代码。 * [x] 通过面向对象的方式表达算法的内容。实现代码的大范围重用。 * [x] 完成算法的测试工作,主要包括以下几个方面: * [x] 实现贡献度计算的方法 * [x] 实现客户端选择的方法(实现,但是暂时不用) * [x] 模型数据保存和加载方法 * [x] 数据分析算法 * 重读论文**实验部分**,复现别人**数据设置**。(2轮实验) * [x] 完成数据集的设置。 * [x] 数据集的扩展(FMINIST、LEAF、MALWARE)、 * [x] 非独立同分布问题的研究和数据集的划分(lable_number,label_distribution,feature_distribution,quantity) * [x] 非独立同分布问题的衡量,计算方案给出。wasserstain距离。直接集成实现了 * [x] 完成数据集的测试工作,包括一下几个方面: * [x] 不同类型的数据集的加载(能够运行即可) * [x] 不同数据集的不同数据划分方法(能够运行,结果合理即可) * [x] 不同数据集的不同划分方法的wassertstain距离衡量(满足assert大小的要求) * 重做实验**调试算法**,使用MNINST调试参数,使得所有的算法能够出现理想的结果。(3轮实验) * [x] MNINST数据集下、不同数据划分方式、不同算法的运行。(调试算法的参数) * [ ] 修改自己的方法,使其达到最理想的效果。 * [x] 解释实验过程中出现的问题,和一些常见的现象的合理解释。 * [x] 通过调参能够在MNINS数据集下,各个算法达到最优效果。 * [x] 结合算法提出的文章中的内容。对算法的实现进行回溯,保证算法实现的准确性。 * [ ] 运行所有算法,通过画图,定点分析结果。对针对极不合理情况进行调参,重新跑。直到所有的算法符合预期。 * [x] 集成实现了多种评估指标mertrics。在多分类情况下调试成功。之后可以修改其他的测试,添加新的内容。 * [ ] (待定,下一轮再说)数据处理process_data和process_data_support_and_query放到base当中。因为所有的模型在测试过程中,都需要进行本地适应。为了排除本地使用造成的干扰。 * [ ] (待定,下一轮再说)模型测试中的test和test_meta放到base当中。因为所有的模型在测试过程中,都需要进行本地适应。为了排除本地使用造成的干扰。 * [x] 将数据处理中的unsqueeze放到数据加载过程中。因为数据处理过程中的问题,不通用于其他数据集。 * 重做实验**验证算法**,使用FEMNINST、maldroid数据集,验证算法的准确性和效果。 * [ ] FEMNINST数据集下,不同数据划分方式、不同算法的运行。(验证算法的准确性,达到理想效果) * [ ] maldroid数据集下,不同数据划分方式、不同算法的运行。(使用算法做事情,达到理想效果) * [ ] 固定好已经调好的参数。在FEMNINST数据集下进行尝试。对比最终的效果。适当修改参数,作为最优说服力的结果。 * [ ] 填写完成表格。 * 重做实验**验证参数**,控制变量。验证自己的修改的内容,相对其他算法有效。 * [ ] 完成实验的参数设置,主要的实验参数包括:update_steps、support_ratio、client_number、noiid_degree * [ ] 验证自己的修改的必要性。控制修改的程度说明修改去掉后,效果会大幅下降。 * [ ] 完成实验结果的持久化和可视化工作(通过持久化保存结果,通过可视化加载结果并展示) * 重做实验**实验设计**,完成一系列对比实验: * [ ] 设计最优条件下的对比实验.阅读别人的论文,查看是如何设置对比实验的。 * [ ] 3个数据集 × 5种数据划分方法 × 9种算法 × [3个参数的影响] ==450组实验。。。。人都快疯了 * [ ] **在同样参数下,多个算法的对比。在不同参数下,一个算法的变化。** * [ ] 在5+1+5=11种实验设置下,对比七个算法。11张图。 * [ ] 在非独立同分布设置加强(每个客户端标签数量减少、客户端特征偏移变大)的情况下,对比fedavg和fedmeta,两种颜色的曲线。(两张图) * [ ] 需要验证的三个参数肯定包括以下几个内容:客户端数量的影响(包括客户端数据规模),本地更新的次数。epochs*update_steps。class_accounts(=2,3,5)。support_ratio的影响(自适应数据集的大小) * 重读**恶意软件**相关的论文,针对恶意软件进行拓展和集成。开始进行调参,整理相关的结果 * [ ] 优化工程结构,方便进行拓展。(针对恶意软件的拓展) * [ ] 重读恶意软件论文,实现数据集的处理和集中式的神经网络算法。(可能要一周) * 重读**借鉴代码**。完善自己的工程代码,准备开始工程实现 * [ ] MAML.ipynb 通过重写了模型的梯度下降方法实现了简单的梯度。包括两个算法MAML、Reptile * [ ] MAML_pytorch_master借鉴MAML的官方实现算法。工程上值得借鉴。借鉴这个实现MAML算法的结合吧。 * [ ] fed_meta_master 工程上值得借鉴。非常厉害。 * [ ] fed_nova_master 借鉴他们的工程构建方法。细度每一行论文,进行模仿。 ### 数据处理(一周) * [ ] 阅读**恶意软件**相关的文章和资料 * [ ] 以前整理的恶意软件的论文 * [ ] 实验室内部的恶意软件的论文 * [ ] 刘工程涉及到的恶意软件论文 * [ ] 完成寻找**工程准备**的工程。 * [ ] 数据集整理。要做的数据集准备好。 * [ ] 完成两个工程的阅读。阅读别人如何处理数据。 * [ ] 进行任务的学习和复现 * [ ] 根据两个工程进行集成和实现 * [ ] **数据处理**。处理的方法,主要包括静态特征。动态特征使用已经提供好的,这个只需要说明一下就好了。需要针对的数据集有哪些: * [ ] AndMal和MalDroid两个数据集。已经处理好的数据。打标签+特征提取+模型建立+集中训练 * [ ] Drebin数据集。打标签+特征提取+模型建立+集中训练 * [ ] Androzo&Virustotal 中的数据集。打标签+特征提取+模型建立+集中训练 * [ ] **模型建立**。 * [ ] 针对每一个数据集,建立模型集中式的方法。处理这些数据。 ### 隐私保护(一周) * 重读**隐私保护**相关论文,完善自己的实验代码。 * [ ] 差分隐私的复现。需要考虑一些改进方法。 * [ ] 提出隐私计算的方法。通过实验验证隐私保护能力的增强。 * [ ] 尝试使用装饰器模式,实现差分隐私的计算过程?其实没有必要。直接在base中调用即可。 * [ ] 远程通信部分使用类、方法装饰器就行了,可以直接横向扩展,将一个worker编程远程的worker * [ ] 隐私保护能力的量化。 * [ ] 解决非独立同分布效果的量化。 * [ ] 理论上的解释。实验上的对比。 ### 工程实现(四周) * **工程初步** * [x] 技术选型与优势论证。明确前后端各个细节的实现 * [x] rpc Demo实现。最终选择了grpc。有教程就是爽。垃圾thrift * [x] 使用async/await/grpc-aio三个实现了协程版本的客户端并发。 * [x] 使用threading实现了线程版本的并发业务。并将fedserverbase的训练过程主动改成多线程版本。 * [x] rpc 业务层构建。只实现了基于grpc的fedclientbase 和fedserverbase的多协程、多线程并发训练。 * [x] 实现异步的训练任务。同时对多个worker发起训练。 * [ ] fedclientbase 领先于其他算法的地方。准确率的多种计算方法。返回值由原来的准确率float变成了元组。在grpc中repeat double,方便扩展其他类型 * [ ] fedserverbase 领先于其他算法的地方。使用了多线程的方法进行训练。训练后,通过join方法等待返回结果。测试过程和其他算法后续实现这个。 * [ ] 学习Python面向对象编程和系统开发。 * [ ] 阅读别人的联邦学习框架代码。github上有很多可以借鉴的工程,只要能够读懂能够移植。就是你的方法。 * 优化工程结构。添加RPC**通信模块**。实现远程调用。 * [x] 本地单线程模拟。(实验阶段用这个就行) * [ ] 本地多线程模拟。(向网络编程进行过度,无非是训练过程加上同步异步操作。) * [x] 分布式训练网络工程构建。 * [x] 没有界面的linix环境下的分布式训练。也可以有界面,本质上是通过linux/python实现的。通信也是基于Python网络编程,训练基于pytorch,界面可以是任意的可食用的界面。类似于一种服务器与客户端建立关系的过程。 * [x] tensor序列化和模型序列化的方法(主要用于网络传输)。通过torch.save和BytesIO保存了一个内存对象。方便快捷。网络传输除了tensor,其他一律用Python自身的数据类型。 * [x] tensor和模型持久化的方法(主要用于本地保存和加载) * [x] 网络通信的方案(websocket?tcp?设计好这个模块,需要给出通信的时序图)。时序图已经给出。主要分为四个端。前端和后端。训练端和聚合端。分别提供四种微服务。client_web服务、server_web服务、trainer服务、aggregate服务。通过微服务架构,实现网络中的各个节点之间的连接。 * [x] 远程调用的方案(kite、thrift_gen、grpc)。最终选择了grpc的方案。前后端通过nodejs与python的grpc实现。训练端和聚合端通过Python的两种微服务实现。关于流式grpc可以等到界面开发阶段再学习。 * [ ] 阅读pytorch的rpc实现方案。训练层面的rpc。可能不太合适。 * [ ] 阅读pysyft的rpc实现方案。借鉴其rpc的思想。 * [ ] web服务展示和操作工程(展示内容,控制策略) * [ ] 多端协同训练。包括linux、android、windows。跨平台训练。(实践,等到以后使用) * [ ] 完成实验过程的可视化工作(通过集成tensorboard对训练过程进行监控)。或者其他集成工具 * 工程**模块化**,实现系统的各个模块。 * [ ] 实现服务注册与发现模块 * [ ] 实现工程的界面初步。包括各种主要的空间和控制方法 * [ ] 对界面进行优化,添加各种展示和控制过程。