0

gpu-admission 源码分析

 2 years ago
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.
neoserver,ios ssh client

gpu-admission 源码分析

原创

kumikoda 2022-08-10 10:10:14 博主文章分类:K8S 源码分析 ©著作权

文章标签 gpu 文章分类 kubernetes 云计算 阅读数206

简介

Gpu-admission提供调度扩展器,基于default-scheduler预选出来的节点,进⾏筛选

因此我们⾸先找到⼊⼝函数,即pkg/predicate/gpu_predicate.go下的Filter函数

gpu-admission 源码分析_gpu

pkg/predicate/gpu_predicate.go ⽤于预选出适合的gpu节点(只有⼀个,因此不需要优选)和device,并写⼊到pod的注解中

gpu-admission 源码分析_gpu_02

⽀持两个过滤器,quota和device。以deviceFilter为例

⾸先对默认调度穿过来的node列表进⾏排序。根据每个节点上的pod信息,重新构建node信息。然后按照可使⽤资源由少到多进⾏排序。

gpu-admission 源码分析_gpu_03

接下来调⽤algorithm的Allocate函数为container分配gpu设备。最终将分配的node和gpu信息写⼊pod的annoatation中。

gpu-admission 源码分析_gpu_04

我们重点分析Allocate()函数,进⼊Pkg/algorithm/allocate.go

gpu-admission 源码分析_gpu_05

func (alloc *allocator) Allocate(pod *v1.Pod) (*v1.Pod, error) {

gpu-admission 源码分析_gpu_06

Allocate函数遍历pod的所有container,逐个分配device,实际的分配⼯作是有AllocateOne函数完成,返回选择后的device列表。

我们进⼀步深⼊到AllocateOne函数中

func (alloc *allocator) AllocateOne(container *v1.Container) ([]*device.DeviceInfo, error) {

//尝试分配需要gpu资源的container

//获取该node的总共内存,device的个数等

gpu-admission 源码分析_gpu_07
gpu-admission 源码分析_gpu_08

如果needCores⼩于100,则共享模式为true。

共享模式下,调⽤pkg/algorithm/share.go的Evaluate函数,按照每块device可⽤的core数由少到多的顺序进⾏排序,选出满⾜core和memory的那个device卡

gpu-admission 源码分析_gpu_09

若needcores为100的整数倍,则为⾮共享模式。该模式下,调⽤pkg/algorithm/exclusive.go下的Evaluate()函数为container分配gpu卡。

同样先对本node上的所有gpu按照core的可⽤个数由少到多进⾏排序。然后逐个过滤各块卡。如果是块空卡(即没有应⽤在使⽤它),则加⼊到devs列表中。直到找到n(needcores/100)块空卡.。如果没有找到n块,则失败。

gpu-admission 源码分析_gpu_10

如果是⾮共享模式,记录vcore为100,vmemory为deviceTotalMemory

最后更新本node上的gpu设备已使⽤资源信息。

gpu-admission 源码分析_gpu_11

其他:

pkg/device/deviceInfo.go:

gpu-admission 源码分析_gpu_12

记录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设备的内存是⼀样⼤的。

  • 打赏
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK