当前位置:网站首页>gpu-admission 源码分析
gpu-admission 源码分析
2022-08-10 11:06:00 【51CTO】
简介
Gpu-admission提供调度扩展器,基于default-scheduler预选出来的节点,进⾏筛选
因此我们⾸先找到⼊⼝函数,即pkg/predicate/gpu_predicate.go下的Filter函数
pkg/predicate/gpu_predicate.go ⽤于预选出适合的gpu节点(只有⼀个,因此不需要优选)和device,并写⼊到pod的注解中
⽀持两个过滤器,quota和device。以deviceFilter为例
⾸先对默认调度穿过来的node列表进⾏排序。根据每个节点上的pod信息,重新构建node信息。然后按照可使⽤资源由少到多进⾏排序。
接下来调⽤algorithm的Allocate函数为container分配gpu设备。最终将分配的node和gpu信息写⼊pod的annoatation中。
我们重点分析Allocate()函数,进⼊Pkg/algorithm/allocate.go
func (alloc *allocator) Allocate(pod *v1.Pod) (*v1.Pod, error) {
Allocate函数遍历pod的所有container,逐个分配device,实际的分配⼯作是有AllocateOne函数完成,返回选择后的device列表。
我们进⼀步深⼊到AllocateOne函数中
func (alloc *allocator) AllocateOne(container *v1.Container) ([]*device.DeviceInfo, error) {
//尝试分配需要gpu资源的container
//获取该node的总共内存,device的个数等
如果needCores⼩于100,则共享模式为true。
共享模式下,调⽤pkg/algorithm/share.go的Evaluate函数,按照每块device可⽤的core数由少到多的顺序进⾏排序,选出满⾜core和memory的那个device卡
若needcores为100的整数倍,则为⾮共享模式。该模式下,调⽤pkg/algorithm/exclusive.go下的Evaluate()函数为container分配gpu卡。
同样先对本node上的所有gpu按照core的可⽤个数由少到多进⾏排序。然后逐个过滤各块卡。如果是块空卡(即没有应⽤在使⽤它),则加⼊到devs列表中。直到找到n(needcores/100)块空卡.。如果没有找到n块,则失败。
如果是⾮共享模式,记录vcore为100,vmemory为deviceTotalMemory
最后更新本node上的gpu设备已使⽤资源信息。
其他:
pkg/device/deviceInfo.go:
记录gpu设备的id、totalMemory、usedMemory、usedCore。并提供以下三个函数
AddUsedResources // 更新设备的已使⽤core和memory记录;
AllocatableCore() // 获取设备的剩余core
AllocatableMemory() //获取设备的剩余memory
pkg/device/nodeInfo.go:
⽤于构建node信息(每次调度的时候都会调⽤)。遍历节点上的所有pod和每个pod中的container,获取已经分配出去core和memory信息。
初始化每个device的totalMemory是所有内存的平均值,因此gpu-admission假设的前提是node上所有gpu设备的内存是⼀样⼤的。
边栏推荐
- Licking Exercise - 58 Verifying Binary Search Trees
- A case of violent parameter tuning in machine learning
- 【勇敢饭饭,不怕刷题之链表】链表中有环的问题
- Will SQL and NoSQL eventually converge?
- A little self-deprecating deconstruction about farmers "code"
- Centos7 environment uses Mysql offline installation package to install Mysql5.7
- [Brave food, not afraid to write the linked list] The problem of the penultimate node of the linked list
- 接口定义与实现
- Emulate stm32 directly with proteus - the programmer can be completely discarded
- 2023版揽胜运动曝光,安全、舒适一个不落
猜你喜欢
随机推荐
Mount [shell][mount -o loop]
不止跑路,拯救误操作rm -rf /*的小伙儿
L2 applications from a product perspective: why is it a playground?
Codeforces 814 C. An impassioned circulation of affection (dp)
What is an abstract class
第3章-线性方程组(3)
flask-restplus接口地址404问题
Research on motion capture system for indoor combined positioning technology
【无标题】
基于UiAutomator2+PageObject模式开展APP自动化测试实战
LeetCode50天刷题计划(Day 19—— 在排序数组中查找元素的第一个和最后一个位置(9.10-10.40)
Double.doubleToLongBits()方法使用
今天面了个腾讯拿38K出来的大佬,让我见识到了基础的天花板
ViT结构详解(附pytorch代码)
leetcode 823. Binary Trees With Factors(因子二叉树)
blocking non-blocking poll mechanism asynchronous
单目操作符(含原码反码补码转换)
Redis设计与实现
什么是幂等性?四种接口幂等性方案详解!
Nocalhost - Making development more efficient in the cloud-native era