Skip to content

Commit 2c8b4ed

Browse files
committed
make ModelName immutable and fix model weight
1 parent d2c6e7a commit 2c8b4ed

File tree

4 files changed

+34
-4
lines changed

4 files changed

+34
-4
lines changed

api/v1alpha2/inferencemodel_types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ type InferenceModelSpec struct {
7171
//
7272
// +kubebuilder:validation:MaxLength=256
7373
// +kubebuilder:validation:Required
74+
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="modelName is immutable"
7475
ModelName string `json:"modelName"`
7576

7677
// Criticality defines how important it is to serve the model compared to other models referencing the same pool.
@@ -175,7 +176,7 @@ type TargetModel struct {
175176
// Conversely weights are optional, so long as ALL targetModels do not specify a weight.
176177
//
177178
// +optional
178-
// +kubebuilder:validation:Minimum=0
179+
// +kubebuilder:validation:Minimum=1
179180
// +kubebuilder:validation:Maximum=1000000
180181
Weight *int32 `json:"weight,omitempty"`
181182
}

config/crd/bases/inference.networking.x-k8s.io_inferencemodels.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ spec:
8282
an error will be returned specifying that no valid target model is found.
8383
maxLength: 256
8484
type: string
85+
x-kubernetes-validations:
86+
- message: modelName is immutable
87+
rule: self == oldSelf
8588
poolRef:
8689
description: PoolRef is a reference to the inference pool, the pool
8790
must exist in the same namespace.
@@ -143,7 +146,7 @@ spec:
143146
Conversely weights are optional, so long as ALL targetModels do not specify a weight.
144147
format: int32
145148
maximum: 1000000
146-
minimum: 0
149+
minimum: 1
147150
type: integer
148151
required:
149152
- name

pkg/epp/datastore/datastore.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,18 +339,25 @@ func stripLabelKeyAliasFromLabelMap(labels map[v1alpha2.LabelKey]v1alpha2.LabelV
339339
}
340340

341341
func RandomWeightedDraw(logger logr.Logger, model *v1alpha2.InferenceModel, seed int64) string {
342-
var weights int32
343-
344342
source := rand.NewSource(rand.Int63())
345343
if seed > 0 {
346344
source = rand.NewSource(seed)
347345
}
348346
r := rand.New(source)
347+
348+
// all the weight values are nil, then we should return random model name
349+
if model.Spec.TargetModels[0].Weight == nil {
350+
index := r.Int31n(int32(len(model.Spec.TargetModels)))
351+
return model.Spec.TargetModels[index].Name
352+
}
353+
354+
var weights int32
349355
for _, model := range model.Spec.TargetModels {
350356
weights += *model.Weight
351357
}
352358
logger.V(logutil.TRACE).Info("Weights for model computed", "model", model.Name, "weights", weights)
353359
randomVal := r.Int31n(weights)
360+
// TODO: optimize this without using loop
354361
for _, model := range model.Spec.TargetModels {
355362
if randomVal < *model.Weight {
356363
return model.Name

pkg/epp/datastore/datastore_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,25 @@ func TestRandomWeightedDraw(t *testing.T) {
280280
},
281281
want: "v1.1",
282282
},
283+
{
284+
name: "weighted distribution with weight unset",
285+
model: &v1alpha2.InferenceModel{
286+
Spec: v1alpha2.InferenceModelSpec{
287+
TargetModels: []v1alpha2.TargetModel{
288+
{
289+
Name: "canary",
290+
},
291+
{
292+
Name: "v1.1",
293+
},
294+
{
295+
Name: "v1",
296+
},
297+
},
298+
},
299+
},
300+
want: "v1.1",
301+
},
283302
}
284303
var seedVal int64 = 420
285304
for _, test := range tests {

0 commit comments

Comments
 (0)