Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v1alpha3: Add suggestion CRD #1

Merged
merged 5 commits into from
Apr 28, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

experiment: v1alpha3
trial: v1alpha2 (?)
suggestion: v1alpha2 (?)

Copy link
Author

@gaocegege gaocegege May 7, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

API

  • trial v1alpha2
  • experiment v1alpha2
  • suggestion v1alpha2

GRPC API

  • suggestion v1alpha3

controller

  • trial v1alpha3
  • experiment v1alpha3
  • suggestion v1alpha3

}
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"`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Name as MinTrialCount? Minimum trail count for success..
BTW, what is the benefit of pointer *int rather than int, which is changed in several places?


// 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"`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And where do we record periodical metric?

}

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