计算卸载论文阅读01-理论梳理
标题:When Learning Joins Edge: Real-time Proportional Computation Offloading via Deep Reinforcement Learning
会议:ICPADS 2019
一、梳理
问题:在任务进行卸载时,往往忽略了任务的特定的卸载比例。
模型:针对上述问题,我们提出了一种创新的强化学习(RL)方法来解决比例计算问题。我们考虑了一种常见的卸载场景,该场景具有时变带宽和异构设备,并且设备不断生成应用程序。对于每个应用程序,客户端必须选择本地或远程执行该应用程序,并确定要卸载的比例。我们将该问题制定为一个长期优化问题,然后提出一种基于RL的算法来解决该问题。基本思想是估计可能决策的收益,其中选择收益最大的决策。我们没有采用原来的深度Q网络(DQN),而是通过添加优先级缓冲机制和专家缓冲机制,提出了Advanced DQN(ADQN),分别提高了样本的利用率和克服了冷启动问题。
目的:最小化时延和能耗的权值和(优化参数:用户卸载策略,卸载的比例)。
算法:ADQN。
二、模型细节与算法
2.1系统模型
计算卸载主要包含: 本地计算和边缘计算
1、本地计算:用户在时隙
时的计算时延(计算时延和排队时延)和能耗为
其中表示任务大小,
表示本地计算任务的比例
2、边缘计算:包含时延(上下行传输时延+执行时延+排队时延)和能耗
其中表示卸载到边缘服务器的比例,
表示每单位计算任务处理后得到的结果大小。
3、总的时延与能耗成本
2.2优化目标
2.3 State、Action和Reward
1、状态空间:
状态空间包含:(数据大小、本地CPU频率,local可用计算资源,上行速率,下行速率,ES可用计算资源)
2、动作空间:
动作空间包含:(用户选择ES的策略,任务卸载比例)
3、奖励:
奖励:
表示本地计算成本,
表示部分卸载产生的成本。
2.4代码
计算卸载环境代码:
import math
import copy
import numpy as npclass ENV():def __init__(self, UEs=3, MECs=7, k=33, lam=0.5):self.UEs = UEsself.MECs = MECsself.k = kq = np.full((k, 1), 0.)p = np.linspace(0, 1, k).reshape((k, 1))# Create Actionfor i in range(MECs - 1):a = np.full((k, 1), float(i + 1))b = np.linspace(0, 1, k).reshape((k, 1))q = np.append(q, a, axis=0)p = np.append(p, b, axis=0) # 231(33 * 7) * 33self.actions = np.hstack((q, p)) # 231 * 2self.n_actions = len(self.actions) # 231self.n_features = 3 + MECs * 3 # 3 + 7 * 3self.discount = 0.01# 基本参数# 频率self.Hz = 1self.kHz = 1000 * self.Hzself.mHz = 1000 * self.kHzself.GHz = 1000 * self.mHzself.nor = 10 ** (-7)self.nor1 = 10 ** 19# 数据大小self.bit = 1self.B = 8 * self.bitself.KB = 1024 * self.Bself.MB = 1024 * self.KB# self.task_cpu_cycle = np.random.randint(2 * 10**9, 3* 10**9)self.UE_f = np.random.randint(1.5 * self.GHz * self.nor, 2 * self.GHz * self.nor) # UE的计算能力self.MEC_f = np.random.randint(5 * self.GHz * self.nor, 7 * self.GHz * self.nor) # MEC的计算能力# self.UE_f = 500 * self.mHz # UE的计算能力# self.MEC_f = np.random.randint(5.2 * self.GHz, 24.3 * self.GHz) # MEC的计算能力self.tr_energy = 1 # 传输能耗self.r = 40 * math.log2(1 + (16 * 10)) * self.MB * self.nor # 传输速率# self.r = 800 # 传输速率self.ew, self.lw = 10 ** (-26), 3 * 10 ** (-26) # 能耗系数# self.ew, self.lw = 0.3, 0.15 # 能耗系数self.et, self.lt = 1, 1self.local_core_max, self.local_core_min = 1.3 * self.UE_f, 0.7 * self.UE_fself.server_core_max, self.server_core_min = 1.3 * self.MEC_f, 0.7 * self.MEC_fself.uplink_max, self.uplink_min = 1.3 * self.r, 0.7 * self.rself.downlink_max, self.downlink_min = 1.3 * self.r, 0.7 * self.rself.lam = lamself.e = 1def reset(self):# 初始化环境,状态空间obs = []servers_cap = []new_cap = Truefor i in range(self.UEs):uplink, downlink = [], []# np.random.seed(np.random.randint(1, 1000))# task_size = np.random.randint(2 * 10**8 * self.nor, 3 * 10**8 * self.nor) # 任务大小task_size = np.random.randint(1.5 * self.mHz, 2 * self.mHz) # 任务大小# self.task_size = self.task_size * self.task_cpu_cycle # 处理一个任务所需要的cpu频率# task_cpu_cycle = np.random.randint(2 * 10**9 * self.nor, 3 * 10**9 * self.nor)task_cpu_cycle = np.random.randint(10 ** 3, 10 ** 5)local_comp = np.random.randint(0.9 * self.UE_f, 1.1 * self.UE_f) # UE的计算能力for i in range(self.MECs):up = np.random.randint(0.9 * self.r, 1.1 * self.r)down = np.random.randint(0.9 * self.r, 1.1 * self.r)if new_cap:cap = np.random.randint(0.9 * self.MEC_f, 1.1 * self.MEC_f) # MEC计算能力servers_cap.append(cap)uplink.append(up)downlink.append(down)observation = np.array([task_size, task_cpu_cycle, local_comp])observation = np.hstack((observation, servers_cap, uplink, downlink))obs.append(observation)new_cap = Falsereturn obsdef choose_action(self, prob):"""根据概率选择动作:param prob::return:"""action_choice = np.linspace(0, 1, self.k)actions = []for i in range(self.UEs):a = np.random.choice(a=(self.MECs * self.k), p=prob[i])target_server = int(a / self.k)percen = action_choice[a % self.k]action = [target_server, percen]actions.append(action)return actionsdef step(self, observation, actions_prob, is_prob=True, is_compared=True):if is_prob:actions = self.choose_action(actions_prob)else:actions = actions_probnew_cap = Falseobs_ = []rew, local, ran, mec = [], [], [], []dpg_times, local_times, ran_times, mec_times = [], [], [], []dpg_energys, local_energys, ran_energys, mec_energys = [], [], [], []total = []a, b, c, d = 0, 0, 0, 0for i in range(self.UEs):if i == self.UEs - 1:new_cap = True# 提取信息task_size, task_cpu_cycle, local_comp, servers_cap, uplink, downlink = \observation[i][0], observation[i][1], observation[i][2], observation[i][3:3+self.MECs], observation[i][3+self.MECs:3+self.MECs*2], observation[i][3+self.MECs*2:3+self.MECs*3]action = actions[i]target_server, percen = int(action[0]), action[1]# 计算奖励# 1=======部分卸载==========# 卸载及回传数据产生的时延和能耗tr_time = (percen * task_size) / uplink[target_server] + self.discount * (percen * task_size) / downlink[target_server]tr_energy = (self.tr_energy * percen * task_size) / uplink[target_server] + self.discount * (self.tr_energy * percen * task_size) / downlink[target_server]# 本地计算时延和能耗comp_local_time = task_cpu_cycle * (1 - percen) / (local_comp)comp_local_energy = self.lw * task_cpu_cycle * (1 - percen) * local_comp ** 2# 边缘计算时延和能耗comp_mec_time = (percen * task_cpu_cycle) / servers_cap[target_server]comp_mec_energy = self.ew * percen * task_cpu_cycle * servers_cap[target_server] ** 2# 最大计算时延comp_time = max(comp_local_time, comp_mec_time)time_cost = (comp_time + tr_time) * self.et# 能耗成本energy_cost = (tr_energy + comp_local_energy + comp_mec_energy) * self.e# 总成本total_cost = self.lam * time_cost + (1 - self.lam) * energy_cost# 2、=======完全本地计算==========local_only_time = task_cpu_cycle / (local_comp) * self.etlocal_only_energy = self.lw * task_cpu_cycle * local_comp ** 2 * self.e# local_only_energy = task_size * local_complocal_only = self.lam * local_only_time + (1 - self.lam) * local_only_energy# 3、=======完全边缘计算==========mec_only_tr_time = task_size / uplink[target_server] + self.discount * task_size / downlink[target_server]mec_only_tr_energy = self.tr_energy * task_size / uplink[target_server] + self.discount * self.tr_energy * task_size / downlink[target_server]# print("mec_only_tr_time:", mec_only_tr_time)# print("mec_only_tr_energy:", mec_only_tr_energy)mec_only_comp_time = task_cpu_cycle / servers_cap[target_server]mec_only_comp_energy = self.ew * task_cpu_cycle * servers_cap[target_server] ** 2# mec_only_comp_energy = task_size * servers_cap[target_server]# print("mec_only_comp_time:", mec_only_comp_time)# print("mec_only_comp_energy:", mec_only_comp_energy)mec_only_time_cost = (mec_only_tr_time + mec_only_comp_time) * self.etmec_only_energy_cost = (mec_only_tr_energy + mec_only_comp_energy) * self.emec_only = self.lam * mec_only_time_cost + (1 - self.lam) * mec_only_energy_cost# 4、=======随机卸载==========percen_ran = np.random.uniform() # 随机卸载比例mec_ran = np.random.randint(self.MECs) # 随机选择一个服务器进行卸载random_tr_time = (percen_ran * task_size) / uplink[mec_ran] + (self.discount * percen_ran * task_size) / \downlink[mec_ran]random_tr_energy = (self.tr_energy * percen_ran * task_size) / uplink[mec_ran] + self.discount * (self.tr_energy * percen_ran * task_size) / downlink[mec_ran]random_comp_local_time = (1 - percen_ran) * task_cpu_cycle / local_comprandom_comp_local_energy = self.lw * (1 - percen_ran) * task_cpu_cycle * local_comp ** 2# random_comp_local_energy = (1 - percen_ran) * task_size * local_comprandom_comp_mec_time = percen_ran * task_cpu_cycle / servers_cap[mec_ran]random_comp_mec_energy = self.ew * percen_ran * task_cpu_cycle * servers_cap[mec_ran] ** 2# random_comp_mec_energy = percen_ran * task_size * servers_cap[mec_ran]random_comp_time = max(random_comp_local_time, random_comp_mec_time)random_time_cost = (random_comp_time + random_tr_time) * self.etrandom_energy_cost = (random_tr_energy + random_comp_local_energy + random_comp_mec_energy) * self.erandom_total = self.lam * random_time_cost + (1 - self.lam) * random_energy_costrandom_total_cost2 = random_energy_costreward = -total_cost# 得到下一个observationx = np.random.uniform()y = 0.5if x > y:local_comp = min(local_comp + np.random.randint(0, 0.2 * self.UE_f), self.local_core_max)for j in range(self.MECs):cap = min(servers_cap[j] + np.random.randint(0, 0.3 * self.UE_f), self.server_core_max)# MEC容量保持一致if new_cap:for x in range(self.UEs):observation[x][2 + j] = capdownlink[j] = min(downlink[j] + np.random.randint(0, 0.2 * self.r), self.downlink_max)uplink[j] = min(uplink[j] + np.random.randint(0, 0.2 * self.r), self.uplink_max)else:local_comp = max(local_comp + np.random.randint(-0.2 * self.UE_f, 0), self.local_core_min)for j in range(self.MECs):# MEC容量保持一致if new_cap:cap = max(servers_cap[j] + np.random.randint(0, 0.3 * self.UE_f), self.server_core_max)for x in range(self.UEs):observation[x][2 + j] = capdownlink[j] = max(downlink[j] - np.random.randint(0, 0.2 * self.r), self.downlink_min)uplink[j] = max(uplink[j] - np.random.randint(0, 0.2 * self.r), self.uplink_min)task_size = np.random.randint(10, 50)task_cpu_cycle = np.random.randint(10 ** 3, 10 ** 5) # 处理任务所需要的CPU频率observation_ = np.array([task_size, task_cpu_cycle, local_comp])observation_ = np.hstack((observation_, servers_cap, uplink, downlink))obs_.append(observation_)rew.append(reward)local.append(local_only)mec.append(mec_only)ran.append(random_total)dpg_times.append(time_cost)local_times.append(local_only_time)mec_times.append(mec_only_time_cost)ran_times.append(random_time_cost)dpg_energys.append(energy_cost)local_energys.append(local_only_energy)mec_energys.append(mec_only_energy_cost)ran_energys.append(random_energy_cost)total.append(total_cost)if is_compared:return obs_, rew, local, mec, ran, dpg_times, local_times, mec_times, ran_times, dpg_energys, local_energys, mec_energys, ran_energys, totalelse:return obs_, rew, dpg_times, dpg_energys
相关文章:
计算卸载论文阅读01-理论梳理
标题:When Learning Joins Edge: Real-time Proportional Computation Offloading via Deep Reinforcement Learning 会议:ICPADS 2019 一、梳理 问题:在任务进行卸载时,往往忽略了任务的特定的卸载比例。 模型:针…...

Windows 11 本地 php 开发环境搭建:PHP + Apache + MySQL +VSCode 安装和环境配置
目录 前言1. PHP 的下载、安装和配置1.1 下载 php1.2 安装 php1.3 配置 php 系统变量1.4 配置 php.ini 2. Apache 的下载、安装和配置2.1 下载 Apache2.2 安装 Apache2.3 修改配置 Apache2.4 指定服务端口(非必须)2.5 配置系统变量2.6 安装服务2.7 Apach…...

15个使用率超高的Python库,下载量均过亿
今天给大家分享最近一年内PyPI上下载量最高的Python包。现在我们来看看这些包的作用,他们之间的关系,以及为什么如此流行。 1. Urllib3:8.93亿次下载 Urllib3 是 Python 的 HTTP 客户端,它提供了许多 Python 标准库没有的功能。 …...

所有知识付费都可以用 ChatGPT 再割一次?
伴随春天一起到来的,还有如雨后春笋般冒出的 ChatGPT / AI 相关的付费社群、课程训练营、知识星球等。 ChatGPT 吹来的这股 AI 热潮,这几个月想必大家多多少少都能感受到。 ▲ 图片来源:网络 这两张图是最近在圈子里看到的。 一张是国内各…...

Python中“is”和“==”的区别(避坑)
2.3 “is”和“”的区别 在Python编写代码时,经常会遇到需要判断2个对象是否相等的情况,这个时候一般就会想到使用is和,is和好像都可以用来判断对象是否相等,经常会傻傻分不清,但其实这其中还是有区别的。 不过在这之…...

20230426----重返学习-vue-router路由
day-058-fifty-eight-20230426-vue-router路由 vue-router路由 路由:切换页面,单页面应用上使用的 hash模式—锚点 对应vue版本 如何使用路由版本 vue2 —> router3vue3 —> router4 使用vue-router 创建项目的时候,直接选中路由…...

Java字节码指令
Java代码运行的过程是Java源码->字节码文件(.class)->运行结果。 Java编译器将Java源文件(.java)转换成字节码文件(.class),类加载器将字节码文件加载进内存,然后进行字节码校验,最后Java解释器翻译成机器码。 …...

Vue3之setup参数介绍
setup(props, context) {... }一、参数 使用setup函数时,它将接受两个参数: propscontext 让我们更深入地研究如何使用每个参数 二、Props setup函数中的第一个参数是props。正如在一个标准组件中所期望的那样,setup函数中的props是响应…...

ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。
安全防范病毒和间谍软件,银行和网上购物更安全, 网络摄像头和家用路由器使用更安全,阻止黑客访问您的电脑, 让您的孩子网络安全;产品兑换码仅支持中国ip地址兑换,兑换后可全球通用。 简单,可靠的防护 防范黑客&#x…...

试试这几个冷门但好用的软件吧
软件一:探记 探记是一款专注于个人记录每一条记录的工具,主要特点如下: 简单易用:探记的界面设计简洁明了,操作流程简单易用,用户可以快速、方便地添加记录。 多样化记录类型:探记支持多种记…...

【云原生】k8s NetworkPolicy 网络策略是怎么样的
前言 随着微服务的流行,越来越多的云服务平台需要大量模块之间的网络调用。 在 Kubernetes 中,网络策略(NetworkPolicy)是一种强大的机制,可以控制 Pod 之间和 Pod 与外部网络之间的流量。 Kubernetes 中的 NetworkPolicy 定义了一组规则&…...

手把手教你用几行代码给winform多个控件(数量无上限)赋值
前言: 我们在开发winform程序的过程中,经常会遇到这样一个场景,我们设计的界面,比如主窗体有一百多个TextBox,然后初始化的时候要对这个一百多个TextBox的Text属性赋值,比如赋个1,如果是winfor…...

回炉重造十一------ansible批量安装服务
1.playbook的核心组件 Hosts 执行的远程主机列表Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最 少元素需包括 name 和 task,一个name只能包括一个taskVariables 内置变量或自定义变量在playbook中调用Templates 模板,…...

系统集成项目管理工程师 笔记(第20章:知识产权管理、第21章:法律法规和标准规范)
文章目录 20.1.2 知识产权的特性 58420.2.1 著作权及邻接权 58520.2.2 专利权 58920.2.3 商标权 59221.3 诉讼时效 59921.6.3 标准分级与标准类型 60321.7.2 信息系统集成项目管理常用的技术标准 6061、基础标准2、开发标准3、文档标准4、管理标准 第20章 知识产权管理 584 20.…...

Channel-wise Knowledge Distillation for Dense Prediction(ICCV 2021)原理与代码解析
paper:Channel-wise Knowledge Distillation for Dense Prediction official implementation:https://github.com/irfanICMLL/TorchDistiller/tree/main/SemSeg-distill 摘要 之前大多数用于密集预测dense prediction任务的蒸馏方法在空间域spatial…...

No.052<软考>《(高项)备考大全》【冲刺6】《软考之 119个工具 (4)》
《软考之 119个工具 (4)》 61.人际交往:62.组织理论:63.预分派:64.谈判:65.招募:66.虚拟团队:67.多标准决策分析:68.人际关系技能:69.培训:70.团队建设活动:71.基本规则:72.集中办公:73.认可与奖励:74.人事评测工具:75.观察和交谈:76.项目绩效评估:77.冲…...

Go | 一分钟掌握Go | 9 - 通道
作者:Mars酱 声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。 转载:欢迎转载,转载前先请联系我! 前言 在Java中,多线程之间的通信方式有哪些?记得吗&…...

【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?
文章目录 📚引言📖计算机视觉的核心任务📑图像分类和对象识别📑目标检测📑语义分割📑实例分割📑图像生成 📖计算机视觉的应用领域📑人脸识别📑自动驾驶&#…...

BatteryChargingSpecification1.2中文详解
1. Introduction 1.1 Scope 规范定义了设备通过USB端口充电的检测、控制和报告机制,这些机制是USB2.0规范的扩展,用于专用 充电器(DCP)、主机(SDP)、hub(SDP)和CDP(大电流充电端口)对设备的充电和power up。这些机制适用 于兼…...

基于Jenkins,docker实现自动化部署(持续交互)【转】
前言 随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致。基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的…...

漫谈大数据 - 数据湖认知篇
导语:数据湖是目前比较热的一个概念,许多企业都在构建或者准备构建自己的数据湖。但是在计划构建数据湖之前,搞清楚什么是数据湖,明确一个数据湖项目的基本组成,进而设计数据湖的基本架构,对于数据湖的构建…...

阿里云国际版ACE与国内版ACE区别
1.国际版ACE与国内版ACE有哪些不同 2.国际版ACP/ACE约考流程 2.1 登录VUE官方网站约考 https://www.pearsonvue.com.cn/Clients/Alibaba-Cloud-Certification.aspx 2.2 如果之前有注册过账户,那就直接登录,如果还没有账户,那就创建账户 2.…...

Mysql8.0 gis支持
GIS数据类型 MySQL的GIS功能遵守OGC的OpenGIS Geometry Model,支持其定义的空间数据类型的一个子集,包括以下空间数据类型: GEOMETRY:不可实例化的数据类型,但是可以作为一个列的类型,存储任何一种其他类型的数据POIN…...

汇编---Nasm
文章目录 比较流行的汇编语言有3种:不同风格的汇编语言在语法格式上会有不同: 实战代码:Intrinsic函数手写汇编(8086汇编)调用C的API库函数调用约定实际代码 C调用汇编函数进行计算纯C实现如下:CASM实现:纯ASM实现:ASM打印命令行参…...

NDK OpenGL渲染画面效果
NDK系列之OpenGL渲染画面效果技术实战,本节主要是通过OpenGL Java库(谷歌对OpenGL C库做了JIN封装,核心实现还是在Native层),实现页面渲染,自定义渲染特效。 实现效果: 实现逻辑: 1…...

常见的深度学习框架
框架优点缺点TensorFlow- 由Google开发和维护,社区庞大,学习资源丰富- 具备优秀的性能表现,支持大规模分布式计算- 支持多种编程语言接口,易于使用- 提供了可视化工具TensorBoard,可用于调试和可视化模型- 底层架构复杂…...

【设计模式】七大设计原则--------单一职责原则
文章目录 1.案例1.1 原始案例1.2 改进一:类上遵循单一职责原则1.3 改进二:方法上遵循单一职责原则 2.小结 1.案例 1.1 原始案例 package com.sdnu.principle.singleresponsibility; //客户端 public class singleResponsibility {public static void m…...

MySQL-中间件mycat(一)
目录 🍁mycat基础概念 🍁Mycat安装部署 🍃初始环境 🍃测试环境 🍃下载安装 🍃修改配置文件 🍃启动mycat 🍃测试连接 🦐博客主页:大虾好吃吗的博客 ǹ…...

ARM寄存器组织
ARM有37个32位长的寄存器: 1个用做PC(Program Counter); 1个用做CPSR(Current Program Status Register); 5个用做SPSR(Saved Program Status Registers); 30个通用寄存器。 AR…...

记录一次webdav协议磁盘挂载经验总结
记录一次磁盘挂载经验总结 文章目录 记录一次磁盘挂载经验总结适配环境服务器协议适配方案脚本与详细说明 适配环境 windows 11windows 10windows 7 x86 and x64linuxuos统信国产化linux系统 服务器协议 webdav 适配方案 一、通用 winfsprclone 已验证通过,版…...