开源代码集合

模拟器、源代码

CloudSim 系列

Tiresias 开源模拟器

Decima 模拟器

DL 模拟器

商汤科技自研模拟器

Qore-DL 源代码

ekya

DSS Python 实现的离散调度模拟器

Synergy 模拟器 [正在阅读]

DL_cluster_simulator

YAFS

  • fog 节点的调度器的
  • 优点

    • 有非常多现成的例子,可以直接使用
    • 因为是 Fog 节点,因此包含大量的拓扑结构,使用 NetworkX 可以直接快速构建一个图拓扑结构
    • 官方文档【目前看来非常齐全】:https://yafs.readthedocs.io/en/latest/index.html
    • 发了论文:
  • 基础模块

Privacy Budget Scheduling

Gavel [很好]

  • 模拟器/源码地址:https://github.com/stanford-futuredata/gavel
  • 优点:

    • 提供了一个调度上的通用最优化问题;
    • 使用时间片轮转调度机制,决策变量是 X,然后根据最优化目标的不同,确定一个最优化问题;
    • 提供了 Space Sharing 和 Placement Sensitivity 的模拟;
    • 提供了性能指标相关数据,为后续研究给予了更多的自信。
  • 缺点:

    • 目前看来主要还是针对轮转作业进行优化;
    • 代码中存在一些小 Bug,而且 GPU 种类写死,不太方便进行定制。
  • 流程全整理

    • Total step 确定?【默认是随机生成的,然后会和 Throughput 的已有数据进行乘操作】
    • 算法得到 Allocation 后,还会根据当前实际的任务在 worker 上的处理时间,动态调整得到的结果,最后变成一个_priority 用于队列计算。可能有时候还会遇到_priority 相同的情况,则还会根据_depolit【即衡量目标分配和实际分配的差距,多减少增】去进行划分
    • 算法在任务到来和任务结束的时候才会更新 allocation,减少对算法求解器的使用
    • 带上 Pref 表示使用数据集中提供的 throughout 【OK】
    • Pack 算法的异同点
      • Pack:任务提交【OK】
      • Pack:选中 packing 任务的调度处理方式【OK,没看到什么复杂的,正常处理】
      • Pack:任务单步完成如何结算,任务整体完成如何结算【OK,没看到什么复杂的,正常处理】
      • Pack 算法的计算方式:
    • 接入 philly_job_distribution 后的异同点
      • 其实就是改变了 scale_factor,使得任务可以获得很大的 scale_factor(即使用多 multi_gpu),在代码中好像就是直接在任务生成的时候就模拟好 philly_job_distribution 的情况,而不是直接从 philly 数据集中获取
      • multi_gpu:任务提交【OK,会在 load throughputs 的时候根据任务的 scale_factor 去获取不同的 throughputs 以用来计算 step】
      • multi_gpu:任务单步完成/整体完成如何结算:多个相同的 GPU 会平均分配单轮的 step 结果,直接考虑使用即可
    • 如何获取 GPU 上的性能数据
      • 学习并了解 measure_throughput.py 可以获得具体的方法
    • Water_filling 算法的异同点
      • 目前没看出来…
    • SLO 算法的异同点
    • Allox 算法与实现
    • FIFO 系列算法的实现方法
      • 这个算法其实很简单,就是一个队列按顺序调度即可
      • Base: 非抢占式 FIFO;Perf 和 Packed: 抢占式 FIFO, 每个时刻都重新计算 FIFO 的方式
    • FinishedTimeFairness 系列算法的实现方法(Themis)
  • 如何画图

    • scheduler/notebooks/figures/evaluation/continuous_jobs.ipynb contains code to parse the resulting logs and produce graphs (can be run using jupyter notebook). The notebook should use the appropriate log_directory used in the above command line.
  • From_trace:

    • 这个参数一般是可以从 checkpoint 中读取数据,该实验的过程总是非常长,我觉得非常合理。同时,也可以跟随着之前的环境进行进一步的测试。
    • 可以从 checkpoint 做恢复进行 debug
  • 如何接入价格和 Elastic

    • 可以接入 aws 的价格数据,aws 的 plot prices 是开源的,可以直接拿来用。
    • 每个时刻都会根据价格曲线,从多个数据中心中找最便宜的价格使用即可
  • 如何更换一个新算法

    • 如果想要接入那些不需要考虑公平性和时间轮转的算法,只需要控制队列即可

POP

Willump

ParallelSched [停止阅读]

  • 浙大的学生实现的一个调度器模拟器

  • 考虑集成 Optimus、Tetris、DL2 进入 Gavel 中

Resalloc [停止阅读]

TitanSched & ChronusArtifact

  • Astraea[目前看起来比较适合我来做]:https://github.com/yzs981130/Astraea_Artifacts
    • 这篇工作的代码是可以跑出来的,而且看起来没有什么大的 bug
    • 具体的方法和后续作者的源码修改:TitanSched

Ones 模拟器

强化学习模拟器 [停止阅读]

  • 一个专门用于模拟强化学习调度算法的模拟器:https://github.com/mail-ecnu/VMAgent
  • 问题

    • 这个模拟器比较老,很多文档写的比较一般
    • 连实例代码都很难跑起来,感觉这份代码还是有比较大的问题的!
  • 状态:暂时搁置

DeepBoot 模拟器 [正在阅读]

  • 来自文章 [TPDS’23] DeepBoot: Dynamic Scheduling System for Training and Inference Deep Learning Tasks in GPU Cluster
  • https://github.com/czq693497091/DeepBoot
  • 优点

    • 这个代码很简单就能跑起来
    • 似乎没看到什么大的问题,有点想从里面找一些点来做!
    • 适合用来学习以下代码的实现
      • Pollux (OSDI’21)
      • AFS (NSDI’21)
      • Tiresias (NSDI’19)
      • Optimus (EuroSys’18)
      • Ayrl (Lyra, EuroSys’23)
  • 问题

hydra 模拟器 [未读]

Beware of Fragmentation 模拟器 [正在阅读]

  • 来自论文:阅读笔记 - (ATC’23)Beware of Fragmentation: Scheduling GPU-Sharing Workloads with Fragmentation Gradient Descent
  • github:https://github.com/hkust-adsl/kubernetes-scheduler-simulator
  • K8S 调度器、Client-go 和 controller 的源码解读:https://github.com/jindezgm/k8s-src-analysis/tree/master
  • 自定义 K8S 调度插件:https://www.qikqiak.com/post/custom-kube-scheduler/
  • K8S 调度器性能测试代码:https://github.com/nexuslrf/cl2-scheduler-throughput/tree/master
  • 经典的 K8S 调度流程:Beware of Fragmentation 模拟器
  • 源码简单阅读:Beware of Fragmentation 模拟器

    • 整个流程完整地调用了 K8S 中的很多调度接口,对了解和学习 K8S 中的调度接口设计是非常有帮助的!
    • 代码里给出的较大规模测试是可以执行的!【但是缩小规模后容易出错,需要仔细看一下】
    • Data => 比较简单的数据,直接阅读即可理解
    • generate_config_and_run.py
      • 执行逻辑:全部都是使用二进制文件 ./bin/simon 来执行的
      • -gpusel: 这个参数让人疑惑,如果选择了一般的 GPU,执行时间如何获得呢?
      • Gpu sharing 的场景如何进行模拟?
    • 不同的调度算法的区别体现在 yaml 中的,通过更改 -f--default-scheduler-config 的配置文件达成
    • 核心的调度代码如下 [没有看懂这段代码在.CoreV1().Pods().Get() 执行了何种操作,瞬间就完成了调度逻辑,需要在调试的时候切入一下]

      func (sim *Simulator) createPod(p *corev1.Pod) error {
          if _, err := sim.client.CoreV1().Pods(p.Namespace).Create(sim.ctx, p, metav1.CreateOptions{}); err != nil {
          return fmt.Errorf("%s(%s): %s", simontype.CreatePodError, utils.GeneratePodKey(p), err.Error())
          }
      
      
          // synchronization
          sim.syncPodCreate(p.Namespace, p.Name, 2*time.Millisecond)
          pod, _ := sim.client.CoreV1().Pods(p.Namespace).Get(sim.ctx, p.Name, metav1.GetOptions{})
          if pod != nil {
                  if pod.Spec.NodeName != "" {
                          sim.syncNodeUpdateOnPodCreate(pod.Spec.NodeName, pod, 2*time.Millisecond)
                          log.Infof("pod(%s) is scheduled to node(%s)\n", utils.GeneratePodKey(pod), pod.Spec.NodeName)
                  }
          } else {
                  log.Errorf("[createPod] pod(%s) not created, should not happen", utils.GeneratePodKey(p))
          }
          return nil
      }
      

Rotary模拟器+testbed [未读]

InfAdapter testbed [未读]

Jellyfish testbed [正在阅读]

Vessim [未读] 碳排放模拟器

Trace 整合

MS Philly Cluster数据集

Google数据集

阿里数据集

商汤数据集

planetlab-workload-traces数据集

pollux论文的一些实验数据

  • Pollux: Co-adaptive Cluster Scheduling for Goodput-Optimized Deep Learning 提供的部分开源数据集
    • 只有在他们的testbed实验系统上跑的,用于绘图的数据集
    • 特点:
      • 数据集很小
      • 都是从实际系统上采样得到结果,主要是通过nvidia-smi获得的硬件在每个时刻的使用情况
      • 其结果用于绘制下面的几张图
    • 地址:https://github.com/petuum/pollux-results

Azure Trace数据集

任务Workload性能建模

MLPref

torch.profiler

Rotary