Skip to content

Commit d36e71a

Browse files
hello2maobmao
andauthored
Fix: incorrect scheduling decision and calculation when using MIG (#422)
* fix mig scheduling issue * clean up the code --------- Co-authored-by: bmao <[email protected]>
1 parent 334fe67 commit d36e71a

File tree

4 files changed

+73
-17
lines changed

4 files changed

+73
-17
lines changed

pkg/scheduler/api/pod_info/pod_info.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,10 +371,6 @@ func getTaskStatus(pod *v1.Pod, bindRequest *bindrequest_info.BindRequestInfo) p
371371
}
372372

373373
func (pi *PodInfo) updatePodAdditionalFields(bindRequest *bindrequest_info.BindRequestInfo) {
374-
if len(pi.Job) == 0 {
375-
return
376-
}
377-
378374
if bindRequest != nil && len(bindRequest.BindRequest.Spec.SelectedGPUGroups) > 0 {
379375
pi.GPUGroups = bindRequest.BindRequest.Spec.SelectedGPUGroups
380376
} else {

pkg/scheduler/cache/cluster_info/cluster_info_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,15 @@ func TestSnapshotNodes(t *testing.T) {
262262
Phase: v1core.PodRunning,
263263
},
264264
}
265+
exampleMIGPod := examplePod.DeepCopy()
266+
exampleMIGPod.Name = "mig-pod"
267+
exampleMIGPod.Spec.Containers[0].Resources.Requests["nvidia.com/mig-1g.5gb"] = resource.MustParse("2")
268+
exampleMIGPodWithPG := examplePod.DeepCopy()
269+
exampleMIGPodWithPG.Name = "mig-pod-with-pg"
270+
exampleMIGPodWithPG.Annotations = map[string]string{
271+
commonconstants.PodGroupAnnotationForPod: "pg-1",
272+
}
273+
exampleMIGPodWithPG.Spec.Containers[0].Resources.Requests["nvidia.com/mig-1g.5gb"] = resource.MustParse("2")
265274
tests := map[string]struct {
266275
objs []runtime.Object
267276
resultNodes []*node_info.NodeInfo
@@ -400,6 +409,48 @@ func TestSnapshotNodes(t *testing.T) {
400409
resultPodsLen: 1,
401410
nodePoolName: "pool-a",
402411
},
412+
"MIG Job": {
413+
objs: []runtime.Object{
414+
&v1core.Node{
415+
ObjectMeta: v1.ObjectMeta{
416+
Name: "node-1",
417+
},
418+
Status: v1core.NodeStatus{
419+
Allocatable: v1core.ResourceList{
420+
"cpu": resource.MustParse("10"),
421+
"nvidia.com/mig-1g.5gb": resource.MustParse("10"),
422+
},
423+
},
424+
},
425+
exampleMIGPod,
426+
exampleMIGPodWithPG,
427+
},
428+
resultNodes: []*node_info.NodeInfo{
429+
{
430+
Name: "node-1",
431+
Idle: resource_info.ResourceFromResourceList(
432+
v1core.ResourceList{
433+
"cpu": resource.MustParse("6"),
434+
"nvidia.com/mig-1g.5gb": resource.MustParse("6"),
435+
},
436+
),
437+
Used: resource_info.ResourceFromResourceList(
438+
v1core.ResourceList{
439+
"cpu": resource.MustParse("4"),
440+
"memory": resource.MustParse("0"),
441+
"nvidia.com/mig-1g.5gb": resource.MustParse("4"),
442+
},
443+
),
444+
Releasing: resource_info.ResourceFromResourceList(
445+
v1core.ResourceList{
446+
"cpu": resource.MustParse("0"),
447+
"memory": resource.MustParse("0"),
448+
},
449+
),
450+
},
451+
},
452+
resultPodsLen: 2,
453+
},
403454
}
404455

405456
for name, test := range tests {

pkg/scheduler/plugins/proportion/proportion.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
commonconstants "github.com/NVIDIA/KAI-scheduler/pkg/common/constants"
2727
"github.com/NVIDIA/KAI-scheduler/pkg/scheduler/api"
2828
"github.com/NVIDIA/KAI-scheduler/pkg/scheduler/api/common_info"
29-
"github.com/NVIDIA/KAI-scheduler/pkg/scheduler/api/common_info/resources"
3029
"github.com/NVIDIA/KAI-scheduler/pkg/scheduler/api/node_info"
3130
"github.com/NVIDIA/KAI-scheduler/pkg/scheduler/api/pod_info"
3231
"github.com/NVIDIA/KAI-scheduler/pkg/scheduler/api/pod_status"
@@ -247,18 +246,6 @@ func getNodeResources(ssn *framework.Session, node *node_info.NodeInfo) rs.Resou
247246
nodeResource.Add(rs.NewResourceQuantities(node.Allocatable.Cpu(), node.Allocatable.Memory(), 0))
248247
} else {
249248
nodeResource.Add(utils.QuantifyResource(node.Allocatable))
250-
migEnabledGpus := 0
251-
for resource, qty := range node.Node.Status.Allocatable {
252-
if resource_info.IsMigResource(resource) {
253-
gpu, _, err := resources.ExtractGpuAndMemoryFromMigResourceName(string(resource))
254-
if err != nil {
255-
log.InfraLogger.Errorf("Failed to extract gpu and memory from mig resource %v: %v", resource, err)
256-
continue
257-
}
258-
migEnabledGpus += int(qty.Value()) * gpu
259-
}
260-
}
261-
nodeResource[rs.GpuResource] += float64(migEnabledGpus)
262249
}
263250

264251
// Subtract resources of non-related pods

pkg/scheduler/plugins/proportion/proportion_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,28 @@ var _ = Describe("Set Fair Share in Proportion", func() {
565565
rs.GpuResource: 2,
566566
},
567567
},
568+
{
569+
name: "mig gpu node",
570+
isRestrictNode: true,
571+
node: &node_info.NodeInfo{
572+
Name: "n1",
573+
Node: &v1.Node{
574+
ObjectMeta: metav1.ObjectMeta{
575+
Labels: map[string]string{
576+
"node-role.kubernetes.io/gpu-worker": "true",
577+
},
578+
},
579+
},
580+
Allocatable: resource_info.ResourceFromResourceList(
581+
common_info.BuildResourceListWithMig("8000m", "10G", "nvidia.com/mig-1g.5gb"),
582+
),
583+
},
584+
want: rs.ResourceQuantities{
585+
rs.CpuResource: 8000,
586+
rs.MemoryResource: 10000000000,
587+
rs.GpuResource: 1,
588+
},
589+
},
568590
{
569591
name: "ignore extra resources",
570592
isRestrictNode: true,

0 commit comments

Comments
 (0)