Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More states torch nn #16

Open
wants to merge 67 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
b541cd3
first changes
ariskaratzikos Feb 6, 2024
77b14ba
changes on how to handle the time needed for the rl to make decision …
ariskaratzikos Feb 14, 2024
d04f8fa
the scheduler is ready for the rl model implementations
ariskaratzikos Feb 14, 2024
9186249
APPLIED RESPONSE TIME integration
ariskaratzikos Feb 15, 2024
ab601d0
added the loop for pause events
ariskaratzikos Feb 20, 2024
f65b82c
creation of more features
ariskaratzikos Feb 23, 2024
28b9965
fixed the node feature
ariskaratzikos Feb 25, 2024
1d5d16c
last changes on rl actions
ariskaratzikos Mar 1, 2024
b9f37eb
Update central_cluster.py
ariskaratzikos Mar 2, 2024
8c19d49
Update central_cluster.py
ariskaratzikos Mar 2, 2024
a5c0a29
Update node.py
ariskaratzikos Mar 2, 2024
31ac5e2
Update central_cluster.py
ariskaratzikos Mar 2, 2024
22e6341
Update node.py
ariskaratzikos Mar 2, 2024
f054dda
Update central_cluster.py
ariskaratzikos Mar 2, 2024
4c624d1
Update central_cluster.py
ariskaratzikos Mar 2, 2024
3dff87f
Update central_cluster.py
ariskaratzikos Mar 2, 2024
136546e
Update central_cluster.py
ariskaratzikos Mar 2, 2024
a0d870c
Update machine.py
ariskaratzikos Mar 2, 2024
193eff6
Create reward_giver2.py
ariskaratzikos Mar 2, 2024
ef69e30
Update node.py
ariskaratzikos Mar 2, 2024
3fb42f6
Update central_cluster.py
ariskaratzikos Mar 2, 2024
1da142f
Update central_cluster.py
ariskaratzikos Mar 2, 2024
997689d
Update reward_giver2.py
ariskaratzikos Mar 2, 2024
19decab
fixed bugs
ariskaratzikos Mar 2, 2024
1cb6476
slight debug changes
ariskaratzikos Mar 4, 2024
cfc26ff
changes on the first fit alg
ariskaratzikos Mar 10, 2024
a2282d3
made the rl model work + debugging on it
ariskaratzikos Mar 19, 2024
bfaaf60
added some metrics
ariskaratzikos Mar 21, 2024
7608dca
changes on the metrics
ariskaratzikos Mar 22, 2024
72a6cf0
made changes on the extaction of the jobs for reallocation
ariskaratzikos Mar 23, 2024
8c9af8a
changes on the reward function
ariskaratzikos Mar 28, 2024
54da4f8
updated round up values
ariskaratzikos Mar 31, 2024
7575585
not converging enough
ariskaratzikos Apr 1, 2024
a74bc4f
changes on the simplicity of the state representation
ariskaratzikos Apr 4, 2024
a268271
made the simple model output variartion in q values
ariskaratzikos Apr 5, 2024
14e5f41
changes on the rewrad func
ariskaratzikos Apr 9, 2024
315b8a1
many changes
ariskaratzikos Apr 18, 2024
77cac66
changes on the model's brain
ariskaratzikos Apr 24, 2024
36abcc4
nothing specific
ariskaratzikos Apr 25, 2024
6116785
more config changes
ariskaratzikos Apr 25, 2024
9559432
more episodes
ariskaratzikos Apr 28, 2024
75cd7da
test changes
ariskaratzikos May 12, 2024
8b12449
testing changes
ariskaratzikos May 14, 2024
ba91cef
more changes
ariskaratzikos May 19, 2024
d38a7aa
time critical higher cost edge
ariskaratzikos May 22, 2024
338a824
included the papers
ariskaratzikos May 28, 2024
2b55583
updated the files
ariskaratzikos May 29, 2024
c623dd3
Update README.md
ariskaratzikos May 29, 2024
3f9feb8
Update README.md
ariskaratzikos May 29, 2024
c79378b
more changes for github presentation
ariskaratzikos May 29, 2024
c4aa015
changes
ariskaratzikos May 29, 2024
3c6731f
more episodes
ariskaratzikos Jun 13, 2024
75c361c
Update README.md
ariskaratzikos Jun 14, 2024
ea2ed53
Update README.md
ariskaratzikos Jun 14, 2024
88d861b
Update README.md
ariskaratzikos Jun 14, 2024
e0bfead
Update README.md
ariskaratzikos Jun 14, 2024
d5e1b9e
Update README.md
ariskaratzikos Jun 14, 2024
b6b14d9
more episodes
ariskaratzikos Jun 14, 2024
56f15d8
more updates
ariskaratzikos Jun 14, 2024
a08718e
graphs incoming
ariskaratzikos Jun 17, 2024
4d61148
more episodes
ariskaratzikos Jun 20, 2024
bab5d54
more episodes
ariskaratzikos Jun 20, 2024
28d9c6f
last changes
ariskaratzikos Sep 12, 2024
40483d2
last changes
ariskaratzikos Sep 12, 2024
5d97b57
Update README.md
ariskaratzikos Sep 13, 2024
04cd3c0
Update README.md
ariskaratzikos Sep 13, 2024
e47946e
Update README.md
ariskaratzikos Sep 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
107 changes: 29 additions & 78 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,85 +1,36 @@
# CloudSimPy 数据中心作业调度仿真框架
# Πλαίσιο προσομοίωσης χρονοπρογραμματισμού εργασιών κέντρου δεδομένων CloudSimPy

*CloudSimPy* 基于离散事件仿真框架 [SimPy](https://simpy.readthedocs.io/en/latest/contents.html),利用 *Python* 语言进行实现;
*Python* 语言的科学计算、深度学习、机器学习生态相较于其他编程语言更加完善,*CloudSimPy* 可以与具有 *Python* 支持的深度学习框架(比如 *TensorFlow*,*PyTorch*)很好的结合,有助于研究基于机器学习或者深度学习的资源管理方法。
Το σύστημα που αναπτύξαμε βασίζεται στο πλαίσιο προσομοίωσης διακριτών γεγονότων [SimPy](https://simpy.readthedocs.io/en/latest/contents.html) και υλοποιείται με τη χρήση της γλώσσας *Python*,
Το σύστημα μας, μπορεί να ενσωματωθεί καλά με πλαίσια βαθιάς μάθησης (π.χ. *TensorFlow*, *PyTorch*) που έχουν υποστήριξη της γλώωσας *Python*, γεγονός που μπορεί να βοηθήσει στη μελέτη της μηχανικής μάθησης ή της διαχείρισης πόρων με βάση τη βαθιά μάθηση.

`CloudSimPy/playground/Non_DAG/algorithm/DeepJS/DRL.py` 中的基于深度强化学习的数据中心作业调度算法由 *TensorFlow* 进行实现,并在其 *eager* 模式下进行推断和训练。
Ο αλγόριθμος χρονοπρογραμματισμού εργασιών του κέντρου δεδομένων που βασίζεται στη βαθιά ενισχυτική μάθηση στο `CloudSimPy/playground/DAG/algorithm/DeepJS/DQLAgent.py` & `../DQLScheduler.py` υλοποιούνται με τη χρήση της βιβλιοθήκης *pytorch*.

## CloudSimPy
作为数据中心作业调度仿真框架 *CloudSimPy* 包含两个 *Python* `core` `playground`
Ως πλαίσιο προσομοίωσης χρονοπρογραμματισμού εργασιών κέντρου δεδομένων, το *CloudSimPy* περιέχει δύο πακέτα *Python* `core` και `playground`.
#### Core
`core` 对数据中心作业调度问题中的各个实体(*entity*)进行了抽象和建模,`core` 包中含有以下模块:

+ `config` 中 `TaskInstanceConfig`、`TaskConfig`、`JobConfig` 分别给出任务实例、任务、作业的配置(资源需求,持续时间等)
+ `job` 中 `TaskInstance`、`Task`、`Job` 分别是对于任务实例、任务、作业的建模
+ `machine` 是对机器的建模
+ `cluster` 是对于计算集群的建模,类 `Cluster` 维护着集群的机器列表
+ `alogrithm` 中定义了调度算法的接口,用户自定义的调度算法必须实现这一接口,是实现**策略模式**的关键
+ `scheduler` 是对于调度器的建模,通过策略模式这一设计模式,不同的 `Scheduler` 实例可以使用不同的调度算法进行调度
+ `broker` 实现了类 `Broker`,`Broker` 代替用户对计算集群提交作业
+ `monitor` 实现了类 `Monitor`,`Monitor` 用于在仿真过程中对仿真的状态进行监测和记录
+ `simulation` 是对一次仿真的建模,一次仿真必须构造一个集群 `Cluster` 实例;构造一系列作业配置 `JobConfig` 实例,利用这些作业配置实例构造一个 `Broker` 实例;
构造一个调度器 `Scheduler` 实例。在一次仿真可以选择开是否使用一个 `Monitor` 实例进行仿真过程的监测
![CloudSimPy](images/cloudsimpy-arch.png)
Το πακέτο `core` αφηρημένο και μοντελοποιεί τις οντότητες (*entity*) σε ένα πρόβλημα χρονοπρογραμματισμού εργασιών ενός κέντρου δεδομένων, το πακέτο `core` περιέχει τις ακόλουθες ενότητες:

+ Τα `TaskInstanceConfig`, `TaskConfig`, `JobConfig` στο `config` δίνουν τη διαμόρφωση (απαιτήσεις πόρων, διάρκεια κ.λπ.) των περιπτώσεων εργασιών, των εργασιών και των θέσεων εργασίας, αντίστοιχα.
+ `job` όπου `TaskInstance`, `Task`, `Job` αποτελούν τη δομή της μοντελοποίησης των περιπτώσεων εργασιών.
+ `machine` μοντελοποιεί τη μηχανή.
+ Το `node` μοντελοποιεί μια υπολογιστική συστάδα που αποτελείται από τρία μηχανήματα.
+ Το `cluster` μοντελοποιεί μια υπολογιστική συστάδα, η κλάση `Cluster` διατηρεί έναν κατάλογο των κόμβων πυ περιέχει.
+ `αλγόριθμος` ορίζει τη διεπαφή με τον αλγόριθμο χρονοπρογραμματισμού, ο οποίος πρέπει να υλοποιείται από αλγόριθμους χρονοπρογραμματισμού που ορίζονται από τον χρήστη, και είναι το κλειδί για την υλοποίηση του μοντέλου.
+ `scheduler` μοντελοποιεί τον χρονοπρογραμματιστή, ένα πρότυπο σχεδίασης που επιτρέπει σε διαφορετικές περιπτώσεις του `Scheduler` να προγραμματίζονται με διαφορετικούς αλγορίθμους χρονοπρογραμματισμού.
+ `broker` υλοποιεί την κλάση `Broker`, η οποία υποβάλλει εργασίες στη συστάδα υπολογιστών για λογαριασμό του χρήστη.
+ `monitor` υλοποιεί την κλάση `Monitor`, η οποία χρησιμοποιείται για την παρακολούθηση και την καταγραφή της κατάστασης μιας προσομοίωσης κατά τη διάρκεια της διαδικασίας προσομοίωσης.
+ Η `simulation` μοντελοποιεί μια προσομοίωση, η οποία πρέπει να κατασκευάσει μια περίπτωση συστάδας `Cluster`, να κατασκευάσει μια σειρά από περιπτώσεις διαμόρφωσης εργασιών `JobConfig` και να χρησιμοποιήσει αυτές τις περιπτώσεις διαμόρφωσης εργασιών για να κατασκευάσει μια περίπτωση `Broker`, να κατασκευάσει μια περίπτωση χρονοπρογραμματιστή `Scheduler`.

#### Playground
`playground` 包设计用于方便软件包用户进行试验,主要包含 `DAG` 包、`Non_DAG` 包(分别支持考虑任务间依赖关系和不考虑任务间依赖关系情况下的仿真实验)、`auxiliary` 包。
`DAG` 与 `Non_DAG` 均分别预先实现了一些启发式作业调度算法及基于深度强化学习的作业调度算法。
例如在 `Non_DAG/algorithm/DeepJS` 中实现的基于深度强化学习的数据中心作业调度算法:
+ agent 智能体,实现了强化学习中的*策略梯度*
+ brain *TensorFlow* 实现的神经网络结构
+ DRL 基于深度强化学习的数据中心作业调度算法
+ reward_giver 强化学习奖励函数

`auxiliary` 包提供了一些辅助类和函数:
+ `episode` 中的 `Episode` 类用于 **episodic** 方式的仿真实验
+ `tools` 中的 `multiprocessing_run` 用于**多进程模式**的训练;`average_slowdown` 和 `average_completion` 用于从一个 `Episode` 类的对象中抽取计算统计信息

## 高性能仿真
由于在数据中心中任务实例 `TaskInstance` 是实际的资源消耗者也是实际业务逻辑的执行者,因此在概念上将 `core` 包 `job` 模块中的 `TaskInstance` 设计为一个 *SimPy* 中的进程(`Process`),
而类 `Task` 设计为 `TaskInstance` 的集合,类 `Job` 设计为 `Task` 的集合。`Job`,`Task` 的运行状态利用 *Python* 下的 `property` 特性实现,
并采用如下图所示的信息传递机制实现 `Task`,`Job` 状态的合成。

![msg_pass](images/msg.png)

当我们询问一个 `Job` 的状态是,`Job` 实例会询问它的 `Task` 实例们的状态,`Task` 实例则会去询问它们各自的 `TaskInstance` 实例们的状态,
`Task` 实例根据各自的 `TaskInstance` 实例们的状态合成自己的状态,然后 `Job` 实例根据它的 `Task` 实例们的状态合成自己的状态,即状态信息反向传播最终回到 `Job` 实例。
这样的设计不仅可以保证 `Job` 和 `Task` 状态信息的准确性和一致性,更重要的是没有在每个仿真时间步主动维护 `Job` 和 `Task` 的状态信息,
而是将 `Job` 和 `Task` 状态的获得推迟到 `Job` 和 `Task` 状态的被动询问时,这允许我们在关闭监测功能(也就是不询问 `Job` 和 `Task` 的状态)时让仿真快速高效的进行。
被动询问取代主动维护,实现了仿真过程中 **hotpath** 的优化,让 **hotpath** 上的执行的操作尽可能的少尽可能的快。

除了 `TaskInstance` 在概念上设计为一个 *SimPy* 进程,`Broker`、`Scheduler`、`Monitor` 也被设计为 *SimPy* 进程。
`Broker` 进程不断地按照作业的提交时间将作业配置列表所描述的作业提交至集群 `Cluster` 实例,直至所有的作业提交完毕,`Broker` 停止提交并销毁。
`Scheduler` 按照调度时间步不断地进行调度,直到仿真 `Simulation` 被标记为结束(当 `Broker` 被销毁(即不会有新的作业到达)且所有已提交的作业都执行完毕时,
`Simulation` 被标记为结束)。`Monitor` 按照监测时间步不断地进行仿真状态的监测和记录,直到仿真 `Simulation` 被标记为结束。

另外的数据中心作业调度问题中的实体 `Simulation`,`Cluster`,`Machine`,`Task`,`Job` 就是普通的类的概念,仅仅作为相关信息的管理器。

## 策略模式
策略模式是一种行为设计模式,在策略模式中定义一系列算法,将每个算法放入一个单独的类中,并使这些类的对象可相互互换。
在策略模式中,我们有一个类,它可以以不同方式执行特定操作,比如此处的调度器 `Scheduker` 类它可以以不同的调度算法(调度策略)执行调度,我们可以将所有这些算法提取到一个个称为策略的单独的类中。原始类(称为上下文)持有一个对策略的引用,并将工作委托给该策略,而不是自己去直接执行工作。原始类不负责选择适当的算法,相反,用户将所需的策略传递给它。事实上,原始类对策略知之甚少,它通过相同的通用的接口调用所有的策略。
这样,上下文就变得独立于具体策略,我们可以添加新算法或修改现有算法,而无需更改原始类或其他策略的代码。

通过使用策略设计模式,在 *CloudSimPy* 中将 `Scheduler` 的实现和 `Scheduler` 所使用的调度算法的实现独立开来,
并分别放在了 `core` 包中和 `playground/DAG/algorithm`、`playground/Non_DAG/algorithm` 包中。

在`layground/DAG/algorithm/DeepJS/reward_giver.py` 中也使用了策略模式为具有不同优化目标的基于深度强化学习的作业调度模型提供不同的奖励计算方法:
+ MakespanRewardGiver 给出用于优化完工时间(Makespan)的奖励
+ AverageSlowDownRewardGiver 给出用于优化平均 SlowDown 的奖励
+ AverageCompletionRewardGiver 给出用于优化平均完成时间的奖励

## Papers using CloudSimPy
1. [DeepJS: Job Scheduling Based on Deep Reinforcement Learning in Cloud Data Center](./playground/paper/F0049-4.19.pdf)

## Run examples
#### Requirements
1. Python 3.6
2. SimPy 3.0.11
3. TensorFlow 1.12.0
4. Numpy 1.15.3
5. Pandas 0.23.4
#### Install and run
1. `git clone git@github.com:RobertLexis/CloudSimPy.git`
2. Add the path to directory cloudsimpy to system environment **PYTHONPATH**
3. `cd cloudsimpy/playground/Non_DAG/launch_scripts`
4. `python main-makespan.py`
Το πακέτο `playground` έχει σχεδιαστεί για να διευκολύνει τον πειραματισμό από τους χρήστες του πακέτου και αποτελείται από τα παρακάτω πακέτα.
To 'auxiliary' περιέχει συναρτήσεις που έχουν βοηθητικό ρόλο στην ανάπτυξη του συστήματος του δρομολογητή και του μοντέλου ενισχυτικής μάθησης.
Το `DAG` είναι προ-υλοποιημένo με ορισμένους ευρετικούς αλγορίθμους χρονοπρογραμματισμού εργασιών καθώς και με αλγορίθμους χρονοπρογραμματισμού εργασιών που βασίζονται σε βαθιά ενισχυτική μάθηση, αντίστοιχα.
+ ευφυές σώμα πράκτορα, το οποίο υλοποιεί την *βαθμίδα πολιτικής* στην ενισχυτική μάθηση
+ εγκέφαλος *TorchNN* που υλοποιεί τη δομή του νευρωνικού δικτύου
+ Συνάρτηση επιβράβευσης, που ορίζει τις τιμές επιστροφής της συνάρτησης βάση σύγκρισης των μετρικών του συστήματος στην τωρινή και την προηγούμενη χρονική στιγμή λήψης αποτελεσμάτων από το σύστημα.

#### Main Single Process
Μέσα στον φάκελο `lanch_scripts` υπάρχει το αρχείο `main-single-process.py` μέσω του οποίου τρέχει το σύστημα.

#### Jobs files
Έχουν αναπτυχθεί ορισμένα αρχεία επεξεργασίας των αρχικών csv αρχείων.
31 changes: 26 additions & 5 deletions core/broker.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from core.job import Job
import random

from core.job import Job

class Broker(object):
job_cls = Job
Expand All @@ -16,10 +17,30 @@ def attach(self, simulation):
self.cluster = simulation.cluster

def run(self):
time_threshold = 301
starting_time = self.env.now
print("broker_runs with starting time", starting_time)
for job_config in self.job_configs:
assert job_config.submit_time >= self.env.now
yield self.env.timeout(job_config.submit_time - self.env.now)
# print(job_config.submit_time,self.env.now, job_config.id)
# assert job_config.submit_time >= self.env.now
if job_config.submit_time >= self.env.now:
timeout_duration = job_config.submit_time - self.env.now
else:
timeout_duration = 0
div = self.env.now // time_threshold
if ((self.env.now % time_threshold) == 0 and self.env.now != 0):
time_threshold = (div) * time_threshold # ama einai akrivws 300,600 klp tote paw sto pause
else:
time_threshold = (div+1) * time_threshold # ama einai estw kai 0.1 over tote pausarei sto epomeno checkpoint
while(timeout_duration > 0):
if ((self.env.now + 0.1)/ time_threshold > 1 and self.env.now != 0):
time_threshold += 50 # perimenei mono thn prwth fora
yield self.env.pause_event
else:
timeout_duration -= 0.1
yield self.env.timeout(0.1)

job = Broker.job_cls(self.env, job_config)
# print('a task arrived at time %f' % self.env.now)
self.cluster.add_job(job)
# print('job %s arrived at time %f with the broker that started at %s' % (job.id, self.env.now, starting_time))
random.choice(self.cluster.child_clusters).add_job(job)
self.destroyed = True
Loading