GithubHelp home page GithubHelp logo

fengcunli / cloudsimpy Goto Github PK

View Code? Open in Web Editor NEW
214.0 3.0 74.0 2.81 MB

CloudSimPy: Datacenter job scheduling simulation framework

License: MIT License

Python 100.00%
cloud reinforcement-learning job-scheduling-algorithm datacenter schedule

cloudsimpy's Introduction

CloudSimPy 数据中心作业调度仿真框架

CloudSimPy 基于离散事件仿真框架 SimPy,利用 Python 语言进行实现; Python 语言的科学计算、深度学习、机器学习生态相较于其他编程语言更加完善,CloudSimPy 可以与具有 Python 支持的深度学习框架(比如 TensorFlowPyTorch)很好的结合,有助于研究基于机器学习或者深度学习的资源管理方法。

CloudSimPy/playground/Non_DAG/algorithm/DeepJS/DRL.py 中的基于深度强化学习的数据中心作业调度算法由 TensorFlow 进行实现,并在其 eager 模式下进行推断和训练。

CloudSimPy

作为数据中心作业调度仿真框架 CloudSimPy 包含两个 Pythoncoreplayground

Core

core 对数据中心作业调度问题中的各个实体(entity)进行了抽象和建模,core 包中含有以下模块:

  • configTaskInstanceConfigTaskConfigJobConfig 分别给出任务实例、任务、作业的配置(资源需求,持续时间等)
  • jobTaskInstanceTaskJob 分别是对于任务实例、任务、作业的建模
  • machine 是对机器的建模
  • cluster 是对于计算集群的建模,类 Cluster 维护着集群的机器列表
  • alogrithm 中定义了调度算法的接口,用户自定义的调度算法必须实现这一接口,是实现策略模式的关键
  • scheduler 是对于调度器的建模,通过策略模式这一设计模式,不同的 Scheduler 实例可以使用不同的调度算法进行调度
  • broker 实现了类 BrokerBroker 代替用户对计算集群提交作业
  • monitor 实现了类 MonitorMonitor 用于在仿真过程中对仿真的状态进行监测和记录
  • simulation 是对一次仿真的建模,一次仿真必须构造一个集群 Cluster 实例;构造一系列作业配置 JobConfig 实例,利用这些作业配置实例构造一个 Broker 实例; 构造一个调度器 Scheduler 实例。在一次仿真可以选择开是否使用一个 Monitor 实例进行仿真过程的监测 CloudSimPy

Playground

playground 包设计用于方便软件包用户进行试验,主要包含 DAG 包、Non_DAG 包(分别支持考虑任务间依赖关系和不考虑任务间依赖关系情况下的仿真实验)、auxiliary 包。 DAGNon_DAG 均分别预先实现了一些启发式作业调度算法及基于深度强化学习的作业调度算法。 例如在 Non_DAG/algorithm/DeepJS 中实现的基于深度强化学习的数据中心作业调度算法:

  • agent 智能体,实现了强化学习中的策略梯度
  • brain TensorFlow 实现的神经网络结构
  • DRL 基于深度强化学习的数据中心作业调度算法
  • reward_giver 强化学习奖励函数

auxiliary 包提供了一些辅助类和函数:

  • episode 中的 Episode 类用于 episodic 方式的仿真实验
  • tools 中的 multiprocessing_run 用于多进程模式的训练;average_slowdownaverage_completion 用于从一个 Episode 类的对象中抽取计算统计信息

高性能仿真

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

msg_pass

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

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

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

策略模式

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

通过使用策略设计模式,在 CloudSimPy 中将 Scheduler 的实现和 Scheduler 所使用的调度算法的实现独立开来, 并分别放在了 core 包中和 playground/DAG/algorithmplayground/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

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 [email protected]: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

cloudsimpy's People

Contributors

abhinand5 avatar fc-li avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

cloudsimpy's Issues

强化学习的state size是多少?

论文中说action size是M*N(M和N分别是任务和机器数目)
说state是一个变长的任务机器对。那么state size是多少呢?
求教,谢谢!

阿里云Trace使用问题请教

您好,我看到您的论文中使用了阿里云的数据,有些数据使用问题想向您请教。
主要是关于task和instance之间的关系。在2018的数据追踪记录中,同一个DAG下面对应多个task,每一个task下面对应多个instance,而且每个task对应instance的数目不相同,那这些instance和task之间的关系是什么?是否是指一个task的数据可以切分,然后由多个instance分布式运行?
希望能收到您的解答,非常感谢~

进程创建后不能启动

主程序main-makespan.py在windows下执行
已增加:
if name == 'main':
freeze_support()
可以看到Process创建了13个进程,但是第一进程就不能start()
报错说它不能转换为数值

 for i in range(n_episode):
     algorithm = RLAlgorithm(agent, reward_giver, features_extract_func=features_extract_func,
                             features_normalize_func=features_normalize_func)
     episode = Episode(machine_configs, jobs_configs, algorithm, None)
     algorithm.reward_giver.attach(episode.simulation)
     p = Process(target=multiprocessing_run,
                 args=(episode, trajectories, makespans, average_completions, average_slowdowns))
     p.start()
     p.join()
 #

WARNING:tensorflow:From C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\training\checkpointable\util.py:1858: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
Traceback (most recent call last):
File "E:/DPL/CloudSimPy-master/CloudSimPy-master/playground/Non_DAG/launch_scripts/main-makespan.py", line 93, in
pj.start()
File "C:\ProgramData\Anaconda3\lib\multiprocessing\process.py", line 112, in start
self._popen = self._Popen(self)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", line 65, in init
reduction.dump(process_obj, to_child)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 745, in reduce
return (convert_to_tensor, (self.numpy(),))
File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py", line 724, in numpy
raise ValueError("Resource handles are not convertible to numpy.")
ValueError: Resource handles are not convertible to numpy.

Setting up the python environment problem

I have created a virtual environment with python 3.6. While installing Tensorflow 1.12.0 its showing an error

protobuf requires Python '>=3.7' but the running Python is 3.6.0

What should I do? I am using windows system with VS code.

RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.

python main-makespan.py

2021-06-27 22:57:21.987365: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
Jobs number: 10
Tasks number: 93
Task instances number mean: 45.376344086021504
Task instances number std 85.48783652126134
Task instances cpu mean: 0.5264810426540284
Task instances cpu std: 0.10018140357202873
Task instances memory mean: 0.009175121384696406
Task instances memory std: 0.002757219144923028
Task instances duration mean: 74.68815165876777
Task instances duration std: 45.40343044250821
680 0.4279005527496338 62.05685685072286 1.4292964198242561
********** Iteration 0 ************
2021-06-27 22:57:31.490100: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
Jobs number: 10
Tasks number: 93
Task instances number mean: 45.376344086021504
Task instances number std 85.48783652126134
Task instances cpu mean: 0.5264810426540284
Task instances cpu std: 0.10018140357202873
Task instances memory mean: 0.009175121384696406
Task instances memory std: 0.002757219144923028
Task instances duration mean: 74.68815165876777
Task instances duration std: 45.40343044250821
680 0.4458014965057373 62.05685685072286 1.4292964198242561
********** Iteration 0 ************
Traceback (most recent call last):
File "", line 1, in
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\spawn.py", line 105, in spawn_main
exitcode = _main(fd)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\spawn.py", line 114, in _main
prepare(preparation_data)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\spawn.py", line 225, in prepare
_fixup_main_from_path(data['init_main_from_path'])
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path
run_name="mp_main")
File "D:\anaconda3\envs\deepjs\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "D:\anaconda3\envs\deepjs\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "D:\anaconda3\envs\deepjs\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "D:\2021\Bin-packing\deepjs\CloudSimPy-master\playground\Non_DAG\launch_scripts\main-makespan2.py", line 78, in
manager = Manager()
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\context.py", line 56, in Manager
m.start()
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\managers.py", line 513, in start
self._process.start()
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\popen_spawn_win32.py", line 33, in init
prep_data = spawn.get_preparation_data(process_obj._name)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\spawn.py", line 143, in get_preparation_data
_check_not_importing_main()
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main
is not going to be frozen to produce an executable.''')
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.

I‘m running this code on Windows,can anybody help me with this?
Thanks in advance!

question

您好,想问下,您的job中的task是不是没有包含有依赖关系啊?
测试文件job.csv好像是基于历史数据?不知道您的数据来自哪里?

ValueError: Resource handles are not convertible to numpy.

python main-makespan.py

2021-06-27 23:37:25.581570: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
Jobs number: 10
Tasks number: 93
Task instances number mean: 45.376344086021504
Task instances number std 85.48783652126134
Task instances cpu mean: 0.5264810426540284
Task instances cpu std: 0.10018140357202873
Task instances memory mean: 0.009175121384696406
Task instances memory std: 0.002757219144923028
Task instances duration mean: 74.68815165876777
Task instances duration std: 45.40343044250821
680 0.45179080963134766 62.05685685072286 1.4292964198242561
********** Iteration 0 ************
2021-06-27 23:37:36.427508: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
Jobs number: 10
Tasks number: 93
Task instances number mean: 45.376344086021504
Task instances number std 85.48783652126134
Task instances cpu mean: 0.5264810426540284
Task instances cpu std: 0.10018140357202873
Task instances memory mean: 0.009175121384696406
Task instances memory std: 0.002757219144923028
Task instances duration mean: 74.68815165876777
Task instances duration std: 45.40343044250821
680 0.4897310733795166 62.05685685072286 1.4292964198242561
Traceback (most recent call last):
File "D:/2021/Bin-packing/deepjs/CloudSimPy-master/playground/Non_DAG/launch_scripts/main-makespan2.py", line 132, in
train()
File "D:/2021/Bin-packing/deepjs/CloudSimPy-master/playground/Non_DAG/launch_scripts/main-makespan2.py", line 96, in train
p.start()
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\popen_spawn_win32.py", line 65, in init
reduction.dump(process_obj, to_child)
File "D:\anaconda3\envs\deepjs\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
File "D:\anaconda3\envs\deepjs\lib\site-packages\tensorflow\python\framework\ops.py", line 763, in reduce
return (convert_to_tensor, (self.numpy(),))
File "D:\anaconda3\envs\deepjs\lib\site-packages\tensorflow\python\framework\ops.py", line 742, in numpy
raise ValueError("Resource handles are not convertible to numpy.")
ValueError: Resource handles are not convertible to numpy.

This bug occurs. Can anybody help me with this?
Thanks!!!

Cannot import the core module

Couldn't import the core file while running the main-makespan.py file

Traceback (most recent call last):
File "main-makespan.py", line 10, in
from core.machine import MachineConfig
ModuleNotFoundError: No module named 'core'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.