Skip to content

Commit

Permalink
v1alpha3: Add suggestion CRD (#1)
Browse files Browse the repository at this point in the history
* Adding initial v1alpha2 API controller (kubeflow#457)

* Adding initial v1alpha2 controller

* Adding logs

* Adding comments

* Adding template functions for experiment

* Adding error checks

* chore: Skip test when code is not changed (kubeflow#467)

Signed-off-by: Ce Gao <gaoce@caicloud.io>

* Add serviceAccountName in UI deployment (kubeflow#469)

* feat: Introduce suggestion

Signed-off-by: Ce Gao <gaoce@caicloud.io>

* owners: Add xinyi yu

Signed-off-by: Ce Gao <gaoce@caicloud.io>
  • Loading branch information
gaocegege authored and caicloud-bot committed Apr 28, 2019
1 parent b886768 commit 3e82c3d
Show file tree
Hide file tree
Showing 48 changed files with 3,095 additions and 38 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ fmt:
vet:
go vet ./pkg/... ./cmd/...

manifests:
go run vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go all

# Generate code
generate:
ifndef GOPATH
Expand Down
1 change: 1 addition & 0 deletions OWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ approvers:
- richardsliu
- hougangliu
- johnugeorge
- anchovYu
reviewers:
- libbyandhelen
- texasmichelle
Expand Down
13 changes: 6 additions & 7 deletions cmd/katib-controller/v1alpha2/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@ limitations under the License.
*/

/*
StudyJobController is a controller (operator) for StudyJob
StudyJobController create and watch workers and metricscollectors.
The workers and metricscollectors are generated from template defined ConfigMap.
The workers and metricscollectors are kubernetes object. The default object is a Job and CronJob.
Katib-controller is a controller (operator) for Experiments and Trials
*/
package main

Expand All @@ -30,18 +27,20 @@ import (
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"sigs.k8s.io/controller-runtime/pkg/manager"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"sigs.k8s.io/controller-runtime/pkg/runtime/signals"
)

func main() {
logf.SetLogger(logf.ZapLogger(false))
// Get a config to talk to the apiserver
cfg, err := config.GetConfig()
if err != nil {
log.Printf("config.GetConfig()")
log.Fatal(err)
}

// Create a new StudyJobController to provide shared dependencies and start components
// Create a new katib controller to provide shared dependencies and start components
mgr, err := manager.New(cfg, manager.Options{})
if err != nil {
log.Printf("manager.New")
Expand All @@ -56,14 +55,14 @@ func main() {
log.Fatal(err)
}

// Setup StudyJobController
// Setup katib controller
if err := controller.AddToManager(mgr); err != nil {
log.Printf("controller.AddToManager(mgr)")
log.Fatal(err)
}

log.Printf("Starting the Cmd.")

// Starting the StudyJobController
// Starting the katib controller
log.Fatal(mgr.Start(signals.SetupSignalHandler()))
}
68 changes: 68 additions & 0 deletions cmd/katib-controller/v1alpha3/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
Copyright 2018 The Kubeflow Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

/*
Katib-controller is a controller (operator) for Experiments and Trials
*/
package main

import (
"log"

"github.com/kubeflow/katib/pkg/api/operators/apis"
controller "github.com/kubeflow/katib/pkg/controller/v1alpha3"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"sigs.k8s.io/controller-runtime/pkg/client/config"
"sigs.k8s.io/controller-runtime/pkg/manager"
logf "sigs.k8s.io/controller-runtime/pkg/runtime/log"
"sigs.k8s.io/controller-runtime/pkg/runtime/signals"
)

func main() {
logf.SetLogger(logf.ZapLogger(false))
// Get a config to talk to the apiserver
cfg, err := config.GetConfig()
if err != nil {
log.Printf("config.GetConfig()")
log.Fatal(err)
}

// Create a new katib controller to provide shared dependencies and start components
mgr, err := manager.New(cfg, manager.Options{})
if err != nil {
log.Printf("manager.New")
log.Fatal(err)
}

log.Printf("Registering Components.")

// Setup Scheme for all resources
if err := apis.AddToScheme(mgr.GetScheme()); err != nil {
log.Printf("apis.AddToScheme")
log.Fatal(err)
}

// Setup katib controller
if err := controller.AddToManager(mgr); err != nil {
log.Printf("controller.AddToManager(mgr)")
log.Fatal(err)
}

log.Printf("Starting the Cmd.")

// Starting the katib controller
log.Fatal(mgr.Start(signals.SetupSignalHandler()))
}
1 change: 1 addition & 0 deletions manifests/v1alpha1/vizier/ui/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ spec:
ports:
- name: ui
containerPort: 80
serviceAccountName: katib-ui
# resources:
# requests:
# cpu: 500m
Expand Down
26 changes: 26 additions & 0 deletions pkg/api/operators/apis/addtoscheme_experiments_v1alpha3.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package apis

import (
"github.com/kubeflow/katib/pkg/api/operators/apis/experiment/v1alpha2"
)

func init() {
// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
AddToSchemes = append(AddToSchemes, v1alpha2.SchemeBuilder.AddToScheme)
}
26 changes: 26 additions & 0 deletions pkg/api/operators/apis/addtoscheme_katib_v1alpha2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package apis

import (
experiments "github.com/kubeflow/katib/pkg/api/operators/apis/experiment/v1alpha2"
trials "github.com/kubeflow/katib/pkg/api/operators/apis/trial/v1alpha2"
)

func init() {
// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
AddToSchemes = append(AddToSchemes, experiments.SchemeBuilder.AddToScheme, trials.SchemeBuilder.AddToScheme)
}
26 changes: 26 additions & 0 deletions pkg/api/operators/apis/addtoscheme_suggestion_v1alpha2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package apis

import (
"github.com/kubeflow/katib/pkg/api/operators/apis/suggestion/v1alpha2"
)

func init() {
// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
AddToSchemes = append(AddToSchemes, v1alpha2.SchemeBuilder.AddToScheme)
}
26 changes: 26 additions & 0 deletions pkg/api/operators/apis/addtoscheme_trial_v1alpha2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package apis

import (
"github.com/kubeflow/katib/pkg/api/operators/apis/trial/v1alpha2"
)

func init() {
// Register the types with the Scheme so the components can map objects to GroupVersionKinds and back
AddToSchemes = append(AddToSchemes, v1alpha2.SchemeBuilder.AddToScheme)
}
30 changes: 30 additions & 0 deletions pkg/api/operators/apis/experiment/v1alpha2/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1alpha2

const (
// Default value of Spec.ParallelTrialCount
DefaultTrialParallelCount = 3

// Default value of Spec.ConfigMapName
DefaultTrialConfigMapName = "trial-template"

// Default env name of katib namespace
DefaultKatibNamespaceEnvName = "KATIB_CORE_NAMESPACE"

// Default value of Spec.TemplatePath
DefaultTrialTemplatePath = "defaultTrialTemplate.yaml"
)
1 change: 1 addition & 0 deletions pkg/api/operators/apis/experiment/v1alpha2/doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@ limitations under the License.
// +k8s:deepcopy-gen=package,register
// +k8s:conversion-gen=github.com/kubeflow/katib/pkg/api/operators/apis/experiment/v1alpha2
// +k8s:defaulter-gen=TypeMeta
// +kubebuilder:subresource:status
// +groupName=experiment.kubeflow.org
package v1alpha2
29 changes: 18 additions & 11 deletions pkg/api/operators/apis/experiment/v1alpha2/experiment_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,14 @@ type ExperimentSpec struct {
TrialTemplate *TrialTemplate `json:"trialTemplate,omitempty"`

// How many trials can be processed in parallel.
ParallelTrialCount int `json:"parallelTrialCount,omitempty"`
// Defaults to 3
ParallelTrialCount *int `json:"parallelTrialCount,omitempty"`

// Total number of trials to run.
MaxTrialCount int `json:"maxTrialCount,omitempty"`
// Max completed trials to mark experiment as succeeded
MaxTrialCount *int `json:"maxTrialCount,omitempty"`

// Max failed trials to mark experiment as failed.
MaxFailedTrialCount *int `json:"maxFailedTrialCount,omitempty"`

// Whether to retain historical data in DB after deletion.
RetainHistoricalData bool `json:"retainHistoricalData,omitempty"`
Expand Down Expand Up @@ -75,8 +79,8 @@ type ExperimentStatus struct {
// Current optimal trial parameters and observations.
CurrentOptimalTrial OptimalTrial `json:"currentOptimalTrial,omitempty"`

// How many trials have successfully completed.
TrialsCompleted int `json:"trialsCompleted,omitempty"`
// How many trials have succeeded.
TrialsSucceeded int `json:"trialsSucceeded,omitempty"`

// How many trials have failed.
TrialsFailed int `json:"trialsFailed,omitempty"`
Expand All @@ -86,6 +90,9 @@ type ExperimentStatus struct {

// How many trials are currently pending.
TrialsPending int `json:"trialsPending,omitempty"`

// How many trials are currently running.
TrialsRunning int `json:"trialsRunning,omitempty"`
}

type OptimalTrial struct {
Expand Down Expand Up @@ -154,7 +161,7 @@ type FeasibleSpace struct {

type ObjectiveSpec struct {
Type ObjectiveType `json:"type,omitempty"`
Goal float64 `json:"goal,omitempty"`
Goal *float64 `json:"goal,omitempty"`
ObjectiveMetricName string `json:"objectiveMetricName,omitempty"`
// This can be empty if we only care about the objective metric.
// Note: If we adopt a push instead of pull mechanism, this can be omitted completely.
Expand Down Expand Up @@ -206,6 +213,7 @@ type GoTemplate struct {

// Structure of the Experiment custom resource.
// +k8s:openapi-gen=true
// +kubebuilder:subresource:status
type Experiment struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Expand All @@ -231,7 +239,7 @@ type NasConfig struct {

// GraphConfig contains a config of DAG
type GraphConfig struct {
NumLayers int32 `json:"numLayers,omitempty"`
NumLayers *int32 `json:"numLayers,omitempty"`
InputSizes []int32 `json:"inputSizes,omitempty"`
OutputSizes []int32 `json:"outputSizes,omitempty"`
}
Expand All @@ -242,7 +250,6 @@ type Operation struct {
Parameters []ParameterSpec `json:"parameterconfigs,omitempty"`
}

// TODO - enable this during API implementation.
//func init() {
// SchemeBuilder.Register(&Experiment{}, &ExperimentList{})
//}
func init() {
SchemeBuilder.Register(&Experiment{}, &ExperimentList{})
}
Loading

0 comments on commit 3e82c3d

Please sign in to comment.