Dragonfly 中基于机器学习的多场景自适应智能 P2P 节点调度算法及优化
内容
Dragonfly 项目中,基于机器学习针对不同场景寻找最优节点打分规则,为待调度节点寻找最优父节点。对当前场景所遇到的调度问题带来的下载瓶颈进行数据收集、数据分析、建模、算法调研、监控及优化。构建面向下一代的更加智能的 P2P 调度算法。
项目产出
完整参与 P2P 节点调度算法实现,并在现有场景下比现阶段基于规则调度算法,提高 P2P 网络内各节点下载效率、利用率以及稳定性。
项目要求
- 基于 P2P 的文件分发协议。
- 机器学习调度算法。
难度
进阶
导师
Github: @gaius-qi Email Address: [email protected]
- 需要线性回归公式,并划哪些是离散特征,哪些是连续特征。
- Location、IDC 以及 NetTopology 是不需要舍弃的,当作特征值的时候,可以作为离散特征值。用最终匹配结果 0 或 1 来代表其值。
- HostType 同样也不需要被舍弃, 当作离散特征值来做。
- Scheduler 模块增加 Training package,Training package 依赖 Storage package,不要 Storage 里面耦合训练相关内容。
- Training 写成一个策略类: 包括线性回归和深度学习两个实现, 深度学习这部分暂且不看,这么实现就是让 Training 可扩展。
type Training interface{
Serve() error
Stop() error
...
}
- Training Serve 中再对应策略(线性回归)中实现就包括数据相关、训练、回归、模型存储、加载模型。
- 训练结束后模型如何保存? => 对象存储保存模型。且只保存回归成功的模型。 a. 训练完成的模型,保存在 redis,要设计好具体的存储 key,和每个 scheduler 模型的存储上限。 b. manager 提供 rest api,能够 CURD 对应 scheduler 的模型。 c. manager 要提供 rest api 去更换对应 scheduler 的模型。更换模型的链路走 redis 的 mq 通知 scheduler,可以参考 manager 内 job 里面 preheat 如何实现的。
- scheduler 配置中提供两种替换模型的方式 1. 手动替换对应模型(手动替换走上面提到的 manager rest api) 2. 回归成功后自动替换
- scheduler 配置中,训练的时间间隔,需要可配置,但是有最小值 1 week。
- scheduler 配置中增加训练时 CPU 使用数量配置,限制 CPU => runtime.GOMAXPROCS
- 在没有训练出模型的时候,使用规则的方式(evaluator_base.go)兜底。
需要提供
- 线性回归公式。
- 离散特征以及连续特征。
- package training 的 interface。
- package training 策略 linear_regression 的方法定义: 数据相关、训练、回归、模型存储、加载模型。
- 训练模型如何存储,存储 Redis,设计好具体的存储 Key 还有每个 scheduler 模型存储上限。
- Manager 训练模型 REST API 定义。
- Scheduler 替换模型配置定义。
- Scheduler 触发训练阈值配置定义。
- Scheduler 训练 CPU 限制配置定义。
cc @wd665544 @Y-J-9
2022-06-24 会议记录
- 实际数据集 @gaius-qi
- 更新 scheduler 模型通过 manager 操作 redis,而非走异步任务。
Peer 下载数据: record.csv
- 特征值,举例:
离散特征值:
1. IDC: Peer IDC 与 Parent IDC 字符串完全匹配,匹配值为 0,不匹配值为 1.
2. Parent Peer Type: Parent 的类型,非 CDN 值为 0, CDN 值为 1。
连续特征值:
1. Parent Piece 下载百分比: Parent Piece Total / TotalPieceCount
-
目标值,举例: 目标: 下载速度 计算: 下载时长/下载时间
-
模型 API 设计, 要遵守 REST 标准,并且缺少 Redis 存储 Key 设计:
/model/:id CURD 就可以了
- 配置命名有了,但是具体描述没有,并且缺少配置具体值是什么? 如果是枚举,枚举值是什么?举例:
RefreshMode 描述: 模型刷新模式 枚举值: 0 代表手动、1 代表自动。
然后最后列出 scheduler 整体配置列表。
- 实现两个 package pipeline 和 training,文件目录结构列下
离散特征值:
state 四种状态, 其他都没问题。时间是否要做成离散特征值,做时间桶,按照 2小时划分。
REST API:
Models:
GET `api/v1/models/:id`
GET `api/v1/models`
PATCH `api/v1/models/:id`
DELETE `api/v1/models/:id`
Vesions:
GET `api/v1/models/:id/versions/:version_id`
GET `api/v1/models/:id/versions`
PATCH `api/v1/models/:id/versions/:version_id`
DELETE `api/v1/models/:id/versions/:version_id`
Redis Key:
使用模型:
Model ID: 线性回归
Key: {namespace}:{cluster_id}:{hostname}-{ip}:{model_id}
Value: 使用模型版本号,以及类似 Precision 和 Recall 等数据。
模型存储:
Version ID: 使用文件 SHA256
Key: {namespace}:{cluster_id}:{hostname}-{ip}:{model_id}:{version}
Value: 模型
配置
例子:
scheduler:
training:
refreshModelInterval: 168h
命名更改: UploadModelInterval => refreshModelInterval CpuLimit => cpu 增加 refreshMode
任务
每个模块都必须要有单测。
schduler/training:
- training
- training.go
- training_test.go
- load.go
- load_test.go
- save.go
- save_test.go
scheduler/storage:
- storage
- storage.go
- storage_test.go
- redis.go
- redis_test.go
manager API:
CURD Model 和 Model Version
包括 handler 和 service
pkg/pipeline
- pipeline
- pipeline.go
- pipeline_test.go
- step.go
- step_test.go
- stage.go
- stage_test.go
- 深度学习实现调研 => 最终要实现
- Y-J-9: 完成了training.go和training_test.go
- wd665544: 完成了manager基于model的crud开发
7.18会议记录
wd665544
- golangci-lint
- manager CRUD命名问题,MachineModel采用一个结构体
- manager REST接口标准化
Y-J-9
- golangci-lint
- 常量命名采用驼峰命名法
- 将数据预处理提前到存储Record时做,storage提供IOReader配置载入量
- 去除冗余结构体,只保留Record
回归验证标准
- MAE,平均绝对误差
- MSE,均方误差
- RMSE,均方根误差
- R²,决定系数
wd665544
- 修改pr的问题
- 补充pipeline的test
Y-J-9
- 根据pipeline改造train流程
- 阅读论文,拟定提纲
8.2会议记录
- pipeline重构设计方案详解。
- 深度学习设计方案详解。
- Dragonfly项目详解。
- manager负责配置管理,维护peer间的关联关系,负责稳定性相关,网络相关。manager启动scheduler调度集群,seed peer集群,集群和实例是一对多的关系。
- scheduler负责核心调度,存储基于task的有向无环peer图,向manager上报配置,异步拉取并保持心跳。调度时优先进行filter,过滤后的peer进行打分后返回给下载peer。
- seed peer负责回源下载,其前驱结点一定为源站,向manager上报配置,异步拉取并保持心跳。
- peer负责主要的文件下载流程,先根据taskID向scheduler拉取可用peers列表,再根据每个piece向peer请求piece描述数据,优先返回的peer将作为该piece的parent peer进行下载。
下周任务
- pr功能完善。
- 列论文提纲。
- 准备科普类文章。
@gaius-qi
- storage增加list接口返回为readerCloser
- for select逻辑review
- scheduler dynamic config返回schedulerID
@Y-J-9
- 写dragonfly介绍文章
- 细化论文提纲
@wd665544
- 提交pipeline和training的pr
- 解决ci问题
8月29日会议记录
@gaius-qi
- Dragonfly介绍文档在其他平台的投递
@wd665544
- [WIP]手动和自动模式
- 剩余代码的完善
@Y-J-9
- Dragonfly介绍文档的英文翻译
8月29日会议记录
@wd665544
- [WIP]手动和自动模式 70%
@Y-J-9
- Dragonfly介绍文档的英文翻译review