Weisen Pan a877aed45f AI-based CFN Traffic Control and Computer Force Scheduling
Change-Id: I16cd7730c1e0732253ac52f51010f6b813295aa7
2023-11-03 00:09:19 -07:00

138 lines
3.2 KiB
Go

package utils
// Author: Weisen Pan
// Date: 2023-10-24
import (
"fmt"
"math"
"sort"
"sync"
log "github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"
"github.com/hkust-adsl/kubernetes-scheduler-simulator/knets_pkg/api/v1alpha1"
simontype "github.com/hkust-adsl/kubernetes-scheduler-simulator/knets_pkg/type"
gpushareutils "github.com/hkust-adsl/kubernetes-scheduler-simulator/knets_pkg/type/open-gpu-share/utils"
)
const (
Q1LackBoth = "q1_lack_both"
Q2LackGpu = "q2_lack_gpu"
Q3Satisfied = "q3_satisfied"
Q4LackCpu = "q4_lack_cpu"
XLSatisfied = "xl_satisfied"
XRLackCPU = "xr_lack_cpu"
NoAccess = "no_access"
)
var FragRatioDataMap = map[string]int{
Q1LackBoth: 0,
Q2LackGpu: 1,
Q3Satisfied: 2,
Q4LackCpu: 3,
XLSatisfied: 4,
XRLackCPU: 5,
NoAccess: 6,
}
var GpuNumTypeList = []string{"PureCpu", "ShareGpu", "OneGpu", "TwoGpu", "FourGpu", "EightGpu", "Others"}
type FragRatio struct {
Data []float64
}
type FragAmount struct {
NodeName string
Data []float64
}
func NewFragAmount(nodeName string, data []float64) FragAmount {
fragAmount := FragAmount{NodeName: nodeName, Data: make([]float64, len(data))}
copy(fragAmount.Data, data)
return fragAmount
}
func (fr FragRatio) AddRatio(fragType string, freq float64) error {
if freq < 0 || freq > 1 {
return fmt.Errorf("bad freq")
}
if index, ok := FragRatioDataMap[fragType]; !ok {
return fmt.Errorf("bad fragType")
} else {
fr.Data[index] += freq
return nil
}
}
func (fa FragAmount) AddGamma(faOther FragAmount, gamma float64) error {
if len(fa.Data) == 0 {
fa.Data = make([]float64, len(FragRatioDataMap))
for i := 0; i < len(FragRatioDataMap); i++ {
fa.Data[i] = 0
}
}
if len(fa.Data) != len(faOther.Data) {
return fmt.Errorf("this (%d) does not match the other (%d)", len(fa.Data), len(faOther.Data))
}
for i := 0; i < len(fa.Data); i++ {
fa.Data[i] += gamma * faOther.Data[i]
}
return nil
}
func (fa FragAmount) AddFragAmount(faOther FragAmount) error {
return fa.AddGamma(faOther, 1.0)
}
func (fa FragAmount) AddByFragType(fragType string, amount float64) error {
if amount < 0 {
return fmt.Errorf("bad freq")
}
if index, ok := FragRatioDataMap[fragType]; !ok {
return fmt.Errorf("bad fragType")
} else {
fa.Data[index] += amount
return nil
}
}
func (fr FragRatio) Repr() (outStr string) {
outStr += "["
for i, v := range fr.Data {
if i > 0 {
outStr += ", "
}
outStr += fmt.Sprintf("%4.1f%%", 100*v)
}
outStr += "]"
return outStr
}
func (fa FragAmount) Repr() (outStr string) {
outStr += fa.NodeName
outStr += ": ["
for i, v := range fa.Data {
if i > 0 {
outStr += ", "
}
outStr += fmt.Sprintf("%6.1f", v)
}
outStr += "]"
return outStr
}
func NodeGpuFragRatio(nodeRes simontype.NodeResource, typicalPods simontype.TargetPodList) FragRatio {
data := make([]float64, len(FragRatioDataMap))
fragRatio := FragRatio{data}
for _, pod := range typicalPods {
freq := pod.Percentage
if freq < 0 || freq > 1 {
log.Errorf("pod %v has bad freq: %f\n", pod.TargetPodResource, freq)
continue
}
fragType := GetNodePodFrag(nodeRes, pod.TargetPodResource)
log.Debugf("nodeRes: %s; pod: %s => fragType: %s (freq: %.2f)\n", nodeRes.Repr(), pod.TargetPodResource.Repr(), fragType,