gpu-admission 源码分析
source link: https://blog.51cto.com/u_1238306/5562152
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
gpu-admission 源码分析
原创kumikoda 2022-08-10 10:10:14 博主文章分类:K8S 源码分析 ©著作权
文章标签 gpu 文章分类 kubernetes 云计算 阅读数206
简介
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设备的内存是⼀样⼤的。
- 打赏
- 赞
- 收藏
- 评论
- 分享
- 举报
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK