Skip to content

Commit 22c8125

Browse files
authored
Stop and resume an explainer (#706)
* Stop and resume an explainer (kserve#4546) Signed-off-by: Hannah DeFazio <[email protected]> * Whitespace Signed-off-by: Hannah DeFazio <[email protected]> --------- Signed-off-by: Hannah DeFazio <[email protected]>
1 parent 5ec6963 commit 22c8125

File tree

4 files changed

+898
-61
lines changed

4 files changed

+898
-61
lines changed

pkg/controller/v1beta1/inferenceservice/components/explainer.go

Lines changed: 68 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"k8s.io/apimachinery/pkg/runtime"
2828
"k8s.io/apimachinery/pkg/types"
2929
"k8s.io/client-go/kubernetes"
30+
"knative.dev/pkg/apis"
3031
knservingv1 "knative.dev/serving/pkg/apis/serving/v1"
3132
ctrl "sigs.k8s.io/controller-runtime"
3233
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -149,6 +150,7 @@ func (e *Explainer) Reconcile(ctx context.Context, isvc *v1beta1.InferenceServic
149150
explainerAnnotations,
150151
),
151152
}
153+
152154
container := explainer.GetContainer(isvc.ObjectMeta, isvc.Spec.Explainer.GetExtensions(), e.inferenceServiceConfig, predictorName)
153155
if len(isvc.Spec.Explainer.PodSpec.Containers) == 0 {
154156
isvc.Spec.Explainer.PodSpec.Containers = []corev1.Container{
@@ -162,46 +164,79 @@ func (e *Explainer) Reconcile(ctx context.Context, isvc *v1beta1.InferenceServic
162164

163165
// Here we allow switch between knative and vanilla deployment
164166
if e.deploymentMode == constants.RawDeployment {
165-
r, err := raw.NewRawKubeReconciler(ctx, e.client, e.clientset, e.scheme, constants.InferenceServiceResource, objectMeta, metav1.ObjectMeta{},
166-
&isvc.Spec.Explainer.ComponentExtensionSpec, &podSpec, nil)
167-
if err != nil {
168-
return ctrl.Result{}, errors.Wrapf(err, "fails to create NewRawKubeReconciler for explainer")
169-
}
170-
// set Deployment Controller
171-
for _, deployment := range r.Deployment.DeploymentList {
172-
if err := controllerutil.SetControllerReference(isvc, deployment, e.scheme); err != nil {
173-
return ctrl.Result{}, errors.Wrapf(err, "fails to set deployment owner reference for explainer")
174-
}
175-
}
176-
// set Service Controller
177-
for _, svc := range r.Service.ServiceList {
178-
if err := controllerutil.SetControllerReference(isvc, svc, e.scheme); err != nil {
179-
return ctrl.Result{}, errors.Wrapf(err, "fails to set service owner reference for explainer")
180-
}
167+
if err := e.reconcileExplainerRawDeployment(ctx, isvc, &objectMeta, &podSpec); err != nil {
168+
return ctrl.Result{}, err
181169
}
182-
// set autoscaler Controller
183-
if err := r.Scaler.Autoscaler.SetControllerReferences(isvc, e.scheme); err != nil {
184-
return ctrl.Result{}, errors.Wrapf(err, "fails to set autoscaler owner references for explainer")
170+
} else {
171+
if err := e.reconcileExplainerKnativeDeployment(ctx, isvc, &objectMeta, &podSpec); err != nil {
172+
return ctrl.Result{}, err
185173
}
174+
}
186175

187-
deployment, err := r.Reconcile(ctx)
188-
if err != nil {
189-
return ctrl.Result{}, errors.Wrapf(err, "fails to reconcile explainer")
176+
if utils.GetForceStopRuntime(isvc) {
177+
// Exit early if we have already set the explainer's status to stopped
178+
existingExplainerCondition := isvc.Status.GetCondition(v1beta1.ExplainerReady)
179+
if existingExplainerCondition != nil && existingExplainerCondition.Status == corev1.ConditionFalse && existingExplainerCondition.Reason == v1beta1.StoppedISVCReason {
180+
return ctrl.Result{}, nil
190181
}
191-
isvc.Status.PropagateRawStatus(v1beta1.ExplainerComponent, deployment, r.URL)
192-
} else {
193-
knutils.ValidateInitialScaleAnnotation(objectMeta.Annotations, e.allowZeroInitialScale, isvc.Spec.Explainer.MinReplicas, e.Log)
194-
r := knative.NewKsvcReconciler(e.client, e.scheme, objectMeta, &isvc.Spec.Explainer.ComponentExtensionSpec,
195-
&podSpec, isvc.Status.Components[v1beta1.ExplainerComponent], e.inferenceServiceConfig.ServiceLabelDisallowedList)
196182

197-
if err := controllerutil.SetControllerReference(isvc, r.Service, e.scheme); err != nil {
198-
return ctrl.Result{}, errors.Wrapf(err, "fails to set owner reference for explainer")
183+
// Set the ready condition to false
184+
isvc.Status.SetCondition(v1beta1.ExplainerReady, &apis.Condition{
185+
Type: v1beta1.ExplainerReady,
186+
Status: corev1.ConditionFalse,
187+
Reason: v1beta1.StoppedISVCReason,
188+
})
189+
}
190+
return ctrl.Result{}, nil
191+
}
192+
193+
func (e *Explainer) reconcileExplainerRawDeployment(ctx context.Context, isvc *v1beta1.InferenceService, objectMeta *metav1.ObjectMeta, podSpec *corev1.PodSpec) error {
194+
r, err := raw.NewRawKubeReconciler(ctx, e.client, e.clientset, e.scheme, constants.InferenceServiceResource, *objectMeta, metav1.ObjectMeta{},
195+
&isvc.Spec.Explainer.ComponentExtensionSpec, podSpec, nil)
196+
if err != nil {
197+
return errors.Wrapf(err, "fails to create NewRawKubeReconciler for explainer")
198+
}
199+
// set Deployment Controller
200+
for _, deployment := range r.Deployment.DeploymentList {
201+
if err := controllerutil.SetControllerReference(isvc, deployment, e.scheme); err != nil {
202+
return errors.Wrapf(err, "fails to set deployment owner reference for explainer")
199203
}
200-
status, err := r.Reconcile(ctx)
201-
if err != nil {
202-
return ctrl.Result{}, errors.Wrapf(err, "fails to reconcile explainer")
204+
}
205+
// set Service Controller
206+
for _, svc := range r.Service.ServiceList {
207+
if err := controllerutil.SetControllerReference(isvc, svc, e.scheme); err != nil {
208+
return errors.Wrapf(err, "fails to set service owner reference for explainer")
203209
}
210+
}
211+
// set autoscaler Controller
212+
if err := r.Scaler.Autoscaler.SetControllerReferences(isvc, e.scheme); err != nil {
213+
return errors.Wrapf(err, "fails to set autoscaler owner references for explainer")
214+
}
215+
216+
deployment, err := r.Reconcile(ctx)
217+
if err != nil {
218+
return errors.Wrapf(err, "fails to reconcile explainer")
219+
}
220+
if !utils.GetForceStopRuntime(isvc) {
221+
isvc.Status.PropagateRawStatus(v1beta1.ExplainerComponent, deployment, r.URL)
222+
}
223+
return nil
224+
}
225+
226+
func (e *Explainer) reconcileExplainerKnativeDeployment(ctx context.Context, isvc *v1beta1.InferenceService, objectMeta *metav1.ObjectMeta, podSpec *corev1.PodSpec) error {
227+
knutils.ValidateInitialScaleAnnotation(objectMeta.Annotations, e.allowZeroInitialScale, isvc.Spec.Explainer.MinReplicas, e.Log)
228+
r := knative.NewKsvcReconciler(e.client, e.scheme, *objectMeta, &isvc.Spec.Explainer.ComponentExtensionSpec,
229+
podSpec, isvc.Status.Components[v1beta1.ExplainerComponent], e.inferenceServiceConfig.ServiceLabelDisallowedList)
230+
231+
if err := controllerutil.SetControllerReference(isvc, r.Service, e.scheme); err != nil {
232+
return errors.Wrapf(err, "fails to set owner reference for explainer")
233+
}
234+
status, err := r.Reconcile(ctx)
235+
if err != nil {
236+
return errors.Wrapf(err, "fails to reconcile explainer")
237+
}
238+
if !utils.GetForceStopRuntime(isvc) {
204239
isvc.Status.PropagateStatus(v1beta1.ExplainerComponent, status)
205240
}
206-
return ctrl.Result{}, nil
241+
return nil
207242
}

0 commit comments

Comments
 (0)