Dragonfly2 icon indicating copy to clipboard operation
Dragonfly2 copied to clipboard

Dragonfly 中基于机器学习的多场景自适应智能 P2P 节点调度算法及优化

Open gaius-qi opened this issue 3 years ago • 15 comments

内容

Dragonfly 项目中,基于机器学习针对不同场景寻找最优节点打分规则,为待调度节点寻找最优父节点。对当前场景所遇到的调度问题带来的下载瓶颈进行数据收集、数据分析、建模、算法调研、监控及优化。构建面向下一代的更加智能的 P2P 调度算法。

项目产出

完整参与 P2P 节点调度算法实现,并在现有场景下比现阶段基于规则调度算法,提高 P2P 网络内各节点下载效率、利用率以及稳定性。

项目要求

  • 基于 P2P 的文件分发协议。
  • 机器学习调度算法。

难度

进阶

导师

Github: @gaius-qi Email Address: [email protected]

gaius-qi avatar May 25 '22 03:05 gaius-qi

  1. 需要线性回归公式,并划哪些是离散特征,哪些是连续特征。
  2. Location、IDC 以及 NetTopology 是不需要舍弃的,当作特征值的时候,可以作为离散特征值。用最终匹配结果 0 或 1 来代表其值。
  3. HostType 同样也不需要被舍弃, 当作离散特征值来做。
  4. Scheduler 模块增加 Training package,Training package 依赖 Storage package,不要 Storage 里面耦合训练相关内容。
  5. Training 写成一个策略类: 包括线性回归和深度学习两个实现, 深度学习这部分暂且不看,这么实现就是让 Training 可扩展。
type Training interface{
  Serve() error
  Stop() error
  ...
}
  1. Training Serve 中再对应策略(线性回归)中实现就包括数据相关、训练、回归、模型存储、加载模型。
  2. 训练结束后模型如何保存? => 对象存储保存模型。且只保存回归成功的模型。 a. 训练完成的模型,保存在 redis,要设计好具体的存储 key,和每个 scheduler 模型的存储上限。 b. manager 提供 rest api,能够 CURD 对应 scheduler 的模型。 c. manager 要提供 rest api 去更换对应 scheduler 的模型。更换模型的链路走 redis 的 mq 通知 scheduler,可以参考 manager 内 job 里面 preheat 如何实现的。
  3. scheduler 配置中提供两种替换模型的方式 1. 手动替换对应模型(手动替换走上面提到的 manager rest api) 2. 回归成功后自动替换
  4. scheduler 配置中,训练的时间间隔,需要可配置,但是有最小值 1 week。
  5. scheduler 配置中增加训练时 CPU 使用数量配置,限制 CPU => runtime.GOMAXPROCS
  6. 在没有训练出模型的时候,使用规则的方式(evaluator_base.go)兜底。

需要提供

  1. 线性回归公式。
  2. 离散特征以及连续特征。
  3. package training 的 interface。
  4. package training 策略 linear_regression 的方法定义: 数据相关、训练、回归、模型存储、加载模型。
  5. 训练模型如何存储,存储 Redis,设计好具体的存储 Key 还有每个 scheduler 模型存储上限。
  6. Manager 训练模型 REST API 定义。
  7. Scheduler 替换模型配置定义。
  8. Scheduler 触发训练阈值配置定义。
  9. Scheduler 训练 CPU 限制配置定义。

cc @wd665544 @Y-J-9

gaius-qi avatar Jun 24 '22 04:06 gaius-qi

2022-06-24 会议记录

  1. 实际数据集 @gaius-qi
  2. 更新 scheduler 模型通过 manager 操作 redis,而非走异步任务。

gaius-qi avatar Jun 24 '22 12:06 gaius-qi

Peer 下载数据: record.csv

gaius-qi avatar Jul 01 '22 03:07 gaius-qi

  1. 特征值,举例:
离散特征值:
1. IDC: Peer IDC 与 Parent IDC 字符串完全匹配,匹配值为 0,不匹配值为 1.
2. Parent Peer Type: Parent 的类型,非 CDN 值为 0, CDN 值为 1。

连续特征值:
1. Parent Piece 下载百分比: Parent Piece Total / TotalPieceCount
  1. 目标值,举例: 目标: 下载速度 计算: 下载时长/下载时间

  2. 模型 API 设计, 要遵守 REST 标准,并且缺少 Redis 存储 Key 设计:

/model/:id CURD 就可以了

  1. 配置命名有了,但是具体描述没有,并且缺少配置具体值是什么? 如果是枚举,枚举值是什么?举例:

RefreshMode 描述: 模型刷新模式 枚举值: 0 代表手动、1 代表自动。

然后最后列出 scheduler 整体配置列表。

  1. 实现两个 package pipeline 和 training,文件目录结构列下

gaius-qi avatar Jul 01 '22 10:07 gaius-qi

离散特征值:

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

任务

每个模块都必须要有单测。

  1. schduler/training:
  • training
    • training.go
    • training_test.go
    • load.go
    • load_test.go
    • save.go
    • save_test.go
  1. scheduler/storage:
  • storage
    • storage.go
    • storage_test.go
    • redis.go
    • redis_test.go
  1. manager API:

CURD Model 和 Model Version

包括 handler 和 service

  1. pkg/pipeline
  • pipeline
    • pipeline.go
    • pipeline_test.go
    • step.go
    • step_test.go
    • stage.go
    • stage_test.go
  1. 深度学习实现调研 => 最终要实现

gaius-qi avatar Jul 04 '22 10:07 gaius-qi

  • Y-J-9: 完成了training.go和training_test.go
  • wd665544: 完成了manager基于model的crud开发

wd665544 avatar Jul 11 '22 12:07 wd665544

7.18会议记录

wd665544

  • golangci-lint
  • manager CRUD命名问题,MachineModel采用一个结构体
  • manager REST接口标准化

Y-J-9

  • golangci-lint
  • 常量命名采用驼峰命名法
  • 将数据预处理提前到存储Record时做,storage提供IOReader配置载入量
  • 去除冗余结构体,只保留Record

回归验证标准

  • MAE,平均绝对误差
  • MSE,均方误差
  • RMSE,均方根误差
  • R²,决定系数

Y-J-9 avatar Jul 18 '22 13:07 Y-J-9

wd665544

  • 修改pr的问题
  • 补充pipeline的test

Y-J-9

  • 根据pipeline改造train流程
  • 阅读论文,拟定提纲

wd665544 avatar Jul 25 '22 14:07 wd665544

8.2会议记录

  • pipeline重构设计方案详解。
  • 深度学习设计方案详解。
  • Dragonfly项目详解。
  1. manager负责配置管理,维护peer间的关联关系,负责稳定性相关,网络相关。manager启动scheduler调度集群,seed peer集群,集群和实例是一对多的关系。
  2. scheduler负责核心调度,存储基于task的有向无环peer图,向manager上报配置,异步拉取并保持心跳。调度时优先进行filter,过滤后的peer进行打分后返回给下载peer。
  3. seed peer负责回源下载,其前驱结点一定为源站,向manager上报配置,异步拉取并保持心跳。
  4. peer负责主要的文件下载流程,先根据taskID向scheduler拉取可用peers列表,再根据每个piece向peer请求piece描述数据,优先返回的peer将作为该piece的parent peer进行下载。

下周任务

  • pr功能完善。
  • 列论文提纲。
  • 准备科普类文章。

Y-J-9 avatar Aug 02 '22 14:08 Y-J-9

@gaius-qi

  • storage增加list接口返回为readerCloser
  • for select逻辑review
  • scheduler dynamic config返回schedulerID

@Y-J-9

  • 写dragonfly介绍文章
  • 细化论文提纲

@wd665544

  • 提交pipeline和training的pr
  • 解决ci问题

wd665544 avatar Aug 08 '22 13:08 wd665544

8月29日会议记录

@gaius-qi

  • Dragonfly介绍文档在其他平台的投递

@wd665544

  • [WIP]手动和自动模式
  • 剩余代码的完善

@Y-J-9

  • Dragonfly介绍文档的英文翻译

Y-J-9 avatar Aug 29 '22 13:08 Y-J-9

8月29日会议记录

@wd665544

  • [WIP]手动和自动模式 70%

@Y-J-9

  • Dragonfly介绍文档的英文翻译review

wd665544 avatar Sep 06 '22 12:09 wd665544