《算力网络中高效算力资源度量方法》论文解读与实验复现
论文摘要
- 算力度量的研究处于起步阶段,已有的度量方法相对单一,只考虑了部分静态或动态指标,难以保证算力资源利用率和算力资源匹配准确率。
- 设计了先静后动的混合式度量方法(hybrid metric method, HMM),考虑节点基础性能及动态工作状态的变化;在指标选取上进行了全面考量。
- 实验和数据分析证明能有效提升算力资源利用率和算力资源匹配准确率。
关键词
算力网络(computing-first network)
算力度量(computing resource metric)
论文贡献
- 提出更加综合的度量指标
- 提出混合式算力度量方法,其性能表现更优
研究现状
对于算力度量处于起步阶段,目前研究对于算力度量标准的设计较为单一,大部分单独使用静态指标或动态指标来衡量,容易产生资源利用率低和匹配准确性差等问题。
- 只有静态指标:节点基础性能相近时,哪个拥有的资源更加匹配用户节点
- 只有动态指标:不考虑节点基础性能,算力资源利用率低
传统资源度量技术
CPU性能衡量
CPI = 每条指令的周期 * 每条指令的事件
TOPS、MIPS作为衡量CPU性能的静态指标
GPU性能衡量
与IPC(instructions per cycle)、缓存命中率(cache hit rate)、DRAM利用率、L2利用率等有关
GOPS作为衡量GPU性能的动态指标
除此之外,还有存储等因素
RAM、硬盘存储量作为衡量存储的静态指标
算力资源度量技术
文献1:均为静态指标
文献2-3:只考虑CPU利用率和存储剩余量
方案设计
设计原则
- 全面性:先满足基础性能需求,再考虑动态性能需求
- 综合性:考虑了基础算力、智能算力、存储能力、网络能力四大指标
- 基础算力: TOPS/W、MIPS为静态指标,CPU空闲率为动态指标
- 智能算力:GOPS为静态指标,GPU空闲率为动态指标
- 存储能力:RAM和硬盘存储大小为静态指标,硬盘存储剩余量为动态指标
- 网络能力:吞吐率作为动态指标
- 可操作性:场景案例分析,只考虑动态不满足静态,只考虑静态不满足动态,HMM全部满足
工作流程
- 利用熵权法计算节点的基础性能分数
将TOPS/W、GOPS、MIPS、RAM、硬盘存储大小五个静态因素定义成五元组I = (I1, I2, I3, I4, I5),通过熵权法取得客观的指标权重w = {w1, w2, w3, w4, w5}, 从而得到一个多因素静态联合指标M,M = w1 * I1 + w2 * I2 + w3 * I3 + w4 * I4 + w5 * I5
- 得到节点基础性能分数后,对基础性能进行分段
采用CART算法为排好序的算力节点分数进行分段
- 在确定用户对节点基础性能需求后,分析动态因素
采用n维欧式距离法对动态因素联合分析
- 找出最短距离的节点,即为最优节点
实验评估
- 数据集:收集1000台服务器的算力信息(TOPS/W,GOPS,MIPS,RAM,硬盘存储大小)
- 熵权法得到节点基础性能分数,CART分类,得到静态性能为低、中、高三类节点的数量
- 节点利用率测定,设置1000个节点信息,更改用户任务数量(100,200, … ,1000)
- 节点匹配准确率测定
实验复现
算力度量指标
由于无法找到测定TOPS/W的方式,以及GOPS方式,决定将静态指标变更为:
MIPS(衡量CPU)、GFLOPS(衡量GPU的浮点运算能力)、RAM、硬盘大小
动态指标依然是:CPU利用率、GPU利用率、硬盘剩余量、吞吐率
数据集构造
测定了30台计算机的静态算力信息(来自同学or实验室)
根据静态性能,采用随机数等方式生成30条动态算力信息
采用随机数方式生成30条用户任务需求
算法复现
代码文件结构:
其中CART的原理和python实现见另一篇博客
决策树之CART算法分类树原理及python实现
只贴main代码部分:
if __name__ == '__main__':
# 读取节点的静态性能数据,得到静态性能评分
m, n, staticData, labelList = bp.readStaticPerform()
print("节点的数量为:" + str(m))
print("评价指标的数量为:" + str(n))
M = bp.getBaseScore(m, n, staticData)
print("节点的评分为:")
print(M)
# 利用CART算法训练决策树
features = ['score']
labels = ['low', 'mid', 'high']
x, y = dt.readDataSet()
model = dt.train(x, y)
dt.drawTree(model, features, labels)
# 读取用户需求
x, y, userRequire = readUserRequirement()
staticRequire = []
dynamicRequire = []
for ur in userRequire:
staticRequire.append(ur[0])
dynamicRequire.append([float(tk) for tk in ur[1:]])
# 读取节点的静态性能分数
sScore = bp.readScore()
# 读取节点的动态性能数据
m, n, dynamicData = dp.readDynamicPerform()
# 已选择节点集合
usedNode = []
# 已匹配的任务集合
overTask = []
# 遍历用户需求,对于每个用户需求,先匹配静态性能,再匹配动态性能
for i in range(x):
result = dt.predictClassify(model, [[int(staticRequire[i])]])
minDist, index_of_best_node = dp.getBestDistance(m, n, dynamicRequire[i], dynamicData, int(staticRequire[i]), result, sScore)
if minDist > 0 and index_of_best_node > -1:
usedNode.append(index_of_best_node)
overTask.append(i)
# 选择该节点,更新其变化后的动态性能
for j in range(n):
dynamicData[index_of_best_node][j] -= dynamicRequire[i][j]
print("已选择的算力节点有:")
print(usedNode)
print("节点的利用率为:")
print(len(set(usedNode)) / m)
复现结果
D:\Configure\python\python.exe D:/ProgramFiles/seApp/pycharm-workspace/CPN/main.py
节点的数量为:30
评价指标的数量为:4
节点的评分为:
[26, 7, 25, 24, 22, 18, 45, 13, 19, 7, 30, 2, 19, 24, 3, 19, 30, 14, 42, 3, 12, 38, 14, 14, 43, 24, 28, 35, 69, 90]
预测结果准确性:
1.0
分数为:[5] 需要基础性能为 low 的节点 选择的节点为:7
分数为:[34] 需要基础性能为 high 的节点 选择的节点为:24
分数为:[38] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[7] 需要基础性能为 low 的节点 选择的节点为:-1
分数为:[34] 需要基础性能为 high 的节点 选择的节点为:21
分数为:[24] 需要基础性能为 mid 的节点 选择的节点为:-1
分数为:[45] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[56] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[35] 需要基础性能为 high 的节点 选择的节点为:27
分数为:[26] 需要基础性能为 mid 的节点 选择的节点为:0
分数为:[38] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[70] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[39] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[38] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[31] 需要基础性能为 mid 的节点 选择的节点为:-1
分数为:[29] 需要基础性能为 mid 的节点 选择的节点为:-1
分数为:[46] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[26] 需要基础性能为 mid 的节点 选择的节点为:-1
分数为:[19] 需要基础性能为 mid 的节点 选择的节点为:-1
分数为:[63] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[33] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[31] 需要基础性能为 mid 的节点 选择的节点为:-1
分数为:[69] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[38] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[25] 需要基础性能为 mid 的节点 选择的节点为:-1
分数为:[57] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[38] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[54] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[56] 需要基础性能为 high 的节点 选择的节点为:-1
分数为:[41] 需要基础性能为 high 的节点 选择的节点为:-1
已选择的算力节点有:
[7, 24, 21, 27, 0]
节点的利用率为:
0.16666666666666666
上述30个任务,有5个被分配到了算力节点。
对于上述的30个节点,输入各自的算力信息,通过CART算法分类的结果如下图:
在图中可知,
score <= 13.5的为low
13.5 < score <= 32.5的为mid
score > 32.5的为high
由于涉及到复现过程中节点数据不够等问题,结果与论文中存在差异。
一些思考
- 在构造数据集对于数据进行标签的标注的过程中,想到本文使用熵权法意在得到一个比较客观的权重,且指标较为全面,似乎通用性较强。那么若对于特定的应用场景比如用户的任务需求为深度学习等需要用到高算力的情况,是否可以采用一些主观赋权的方法,有意识倾向于某些指标,使得其适配于特定的场景?
赋权法
- 主观赋权法
AHP层次分析法:一种解决多目标的复杂问题的定性与定量相结合的决策分析方法。该方法将定量分析与定性分析结合起来,用决策者的经验判断各衡量目标之间能否实现的标准之间的相对重要程度,并合理地给出每个决策方案的每个标准的权数,利用权数求出各方案的优劣次序,比较有效地应用于那些难以用定量方法解决的问题。- 客观赋权法
- 主成分分析(Principal Component Analysis,PCA):一种降维的统计方法,将原来变量重新组合成一组新的相互无关的几个综合变量,同时根据实际需要从中可以取出几个较少的总和变量尽可能多地反映原来变量的信息。
- 熵权法:仅依赖于数据本身的离散性。不确定性越大,熵就越大,包含的信息量越大;不确定性越小,熵就越小,包含的信息量就越小。
- 组合赋权法
采用主观赋权法和客观赋权法相结合的组合赋权方法,以弥补单一赋权带来的不足。将两种赋权方法相结合。
- 对于特定的服务场景,是否需要研究一下业务到模型的映射?一种思路是:确定特定业务场景——业务场景建模——算力节点度量方法——评估度量方法有效性
参考内容:
【1】柴若楠,郜帅,兰江雨等.算力网络中高效算力资源度量方法[J].计算机研究与发展,2023,60(04):763-771.
【2】https://blog.csdn.net/AAGHJJSJBJSHJ/article/details/119790443