云计算任务调度仿真02

前面已经分享过一个仿真项目,但是基于policy gradient方法实现的,考虑到许多人从零到一实现DQN方法有点难度,所以这次分享一个基于DQN实现的仿真项目,非常简单。

这里之所以简单主要得益于它是用pytorch实现的,而pytorch各个版本之间差异不是非常大,可以互用。

这里没有之前那么复杂的建模,首先是任务类

python 复制代码
class Task(object):
    # 任务类
    def __init__(self, jobID, index, CPU, RAM, disk, runtime, status):
        import time
        self.parent = []
        self.child = []
        self.jobID = jobID
        self.index = index
        self.CPU = CPU
        self.RAM = RAM
        self.disk = disk
        self.status = status  # -1: rejected, 0: finished, 1: ready, 2: running
        self.runtime = runtime
        self.ddl = time.time() + self.runtime * 5
        self.endtime = 0

然后构建DAG,因为云计算中的任务大多是具有关联性的,是有向无环图

python 复制代码
class DAG(object):
    def __init__(self, fname, num_task):

        self.fname = fname
        # 任务数量
        self.num_task = num_task
        self.job = []
        self.task = []

    def readfile(self):
        # 读取任务数据
        num_task = 0
        with open(self.fname, 'r') as f:
            task = []
            for line in f:
                if line[0] == 'J':
                    if len(task) != 0:
                        self.job.append(task)
                        task = []
                else:
                    info = list(line.split(','))
                    # 任务的信息,jobid,index就是任务的标识,cpu,内存,硬盘,
                    # 外加一个状态jobID, index, CPU, RAM, disk, runtime, status)
                    task.append \
                        (Task(info[5], info[6], float(info[3]), float(info[4]), float(info[8]), float(info[2]), 1))
                    num_task += 1
                if num_task == self.num_task:
                    break
            if len(task) != 0:
                self.job.append(task)

    def checkRing(self, parent, child):
        # 检查无环
        if parent.index == child.index:
            return True
        if len(child.child) == 0:
            return False
        for c in child.child:
            if self.checkRing(parent, c):
                return True
        return False

    def buildDAG(self):
        # 构建有向无环图
        import random
        for job in self.job:
            for task in job:
                i = random.randint(-len(job), len(job) - 1)
                if i < 0:
                    continue
                parent = job[i]
                if self.checkRing(parent, task) == False:
                    task.parent.append(parent)
                    parent.child.append(task)
......
......

环境类,定义云计算资源,以及调度过程中状态的转移,训练过程等等

python 复制代码
class environment(object):

    def __init__(self, scale, fname, num_task, num_server):

        self.scale = scale
        self.fname = fname
        self.task = []
        self.dag = DAG(self.fname, num_task)  # 根据task数量构建dag
        # 设置每个服务器上虚拟机的数量
        self.VMNum = 5
        self.rej = 0
        # 任务数量和服务器数量是通过参数传递的
        self.num_task = num_task
        self.severNum = num_server
        # 而集群数量是通过计算出来的
        if num_server <= 50:
            self.farmNum = 1
        else:
            if int(self.severNum / 50) * 50 < num_server:
                self.farmNum = int(self.severNum / 50) + 1
            else:
                self.farmNum = int(self.severNum / 50)

        self.remainFarm = []
        self.FarmResources = []
        self.severs = [[1, 1] for _ in range(self.severNum)]
        self.VMtask = []
        self.totalcost = 0
        #self.init_severs(num_server)

        self.losses_stage1 = []
        self.losses_stage2 = []

        print("Total Number of tasks: {0}".format(num_task))

    def init_severs(self, severNum):
        # 服务器,host,每个host上又可以虚拟出一定的虚拟机,然后虚拟机处理任务
        VM = [[[1.0 / self.VMNum, 1.0 / self.VMNum] for _ in range(self.VMNum)] for _ in range(severNum)]
        self.VMtask.append([[[] for _ in range(self.VMNum)] for _ in range(severNum)])
        return VM
......
......

构建DQN的智能体,有Q值的计算和更新,才是基于值的强化学习方法

python 复制代码
class Agent():
    def __init__(self, input_dims, n_actions, lr, gamma=0.99,
                 epsilon=1.0, eps_dec=1e-5, eps_min=0.01):
        self.lr = lr
        self.input_dims = input_dims
        self.n_actions = n_actions
        self.gamma = gamma
        self.epsilon = epsilon
        self.eps_dec = eps_dec
        self.eps_min = eps_min
        self.action_space = [i for i in range(self.n_actions)]

        self.Q = LinearDeepQNetwork(self.lr, self.n_actions, self.input_dims)
        self.losses = []

    def choose_action(self, state):
        if np.random.random() > self.epsilon:
            state1 = T.tensor(state, dtype=T.float).to(self.Q.device)
            actions = self.Q.forward(state1)
            #选最大的动作执行
            action = T.argmax(actions).item()
        else:
            action = np.random.choice(self.action_space)

        return action

    def decrement_epsilon(self):
        #贪心的变化
        self.epsilon = self.epsilon - self.eps_dec \
                        if self.epsilon > self.eps_min else self.eps_min

    def learn(self, state, action, reward, state_):
        self.Q.optimizer.zero_grad()
        states = T.tensor(state, dtype=T.float).to(self.Q.device)
        actions = T.tensor(action).to(self.Q.device)
        rewards = T.tensor(reward).to(self.Q.device)
        states_ = T.tensor(state_, dtype=T.float).to(self.Q.device)

        q_pred = self.Q.forward(states)[actions]

        q_next = self.Q.forward(states_).max()

        q_target = reward + self.gamma*q_next

        loss = self.Q.loss(q_target, q_pred).to(self.Q.device)
        loss.backward()
        self.Q.optimizer.step()
        self.decrement_epsilon()
        self.losses.append(loss.item())

在此基础上,可以继续实现fixed-q-target和experience replay以及double QDN等优化

我添加了打印损失函数值的代码

所以为了方便程序的运行和跨时间段使用,修改等,建议用pytorch进行实现

相关推荐
Quintus五等升8 分钟前
深度学习③|分类任务—AlexNet
人工智能·经验分享·深度学习·神经网络·学习·机器学习·cnn
AI即插即用1 小时前
即插即用系列 | CVPR 2025 SegMAN: Mamba与局部注意力强强联合,多尺度上下文注意力的新SOTA
图像处理·人工智能·深度学习·目标检测·计算机视觉·视觉检测
子午2 小时前
【2026原创】卫星遥感图像识别系统+Python+深度学习+人工智能+算法模型+TensorFlow
人工智能·python·深度学习
_ziva_2 小时前
大模型分词算法全解析:BPE、WordPiece、SentencePiece 实战对比
人工智能·深度学习·自然语言处理
棒棒的皮皮3 小时前
【深度学习】YOLO论文官方演进 + 目标检测经典 + 拓展创新
深度学习·yolo·目标检测·计算机视觉
GIS萬事通3 小时前
基于arcgis制作深度学习标签并基于python自动化预处理样本
python·深度学习·arcgis·边缘计算
2501_941333103 小时前
【深度学习强对流天气识别】:基于YOLO11-C3k2-SCcConv模型的高效分类方法_2
人工智能·深度学习·分类
岑梓铭3 小时前
YOLO11深度学习一模型很优秀还是漏检怎么办,预测解决
人工智能·笔记·深度学习·神经网络·yolo·计算机视觉
叫我:松哥3 小时前
基于YOLO深度学习算法的人群密集监测与统计分析预警系统,实现人群密集度的实时监测、智能分析和预警功能,支持图片和视频流两种输入方式
人工智能·深度学习·算法·yolo·机器学习·数据分析·flask
Lun3866buzha4 小时前
✅ 军事目标检测与识别系统 Faster R-CNN实现 士兵坦克车辆武器爆炸物多类别检测 深度学习实战项目(建议收藏)计算机视觉(附源码)
深度学习·目标检测·计算机视觉