Skip to content

Commit 698a9c6

Browse files
authored
CherryPick: Reconcile semantics for Suggestion Algorithms (#1633) (#1644)
* Reuse suggestions * Fix tests
1 parent bfae181 commit 698a9c6

File tree

10 files changed

+199
-156
lines changed

10 files changed

+199
-156
lines changed

pkg/apis/manager/v1beta1/api.pb.go

Lines changed: 123 additions & 114 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/apis/manager/v1beta1/api.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ message GetSuggestionsRequest {
290290
Experiment experiment = 1;
291291
repeated Trial trials = 2; // all completed trials owned by the experiment.
292292
int32 request_number = 3; ///The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time.
293+
int32 total_request_number = 4;//The number of Suggestions requested till now
293294
}
294295

295296
message GetSuggestionsReply {

pkg/apis/manager/v1beta1/gen-doc/api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ Discrete and Categorical type use List.
354354
| experiment | [Experiment](#api.v1.beta1.Experiment) | | |
355355
| trials | [Trial](#api.v1.beta1.Trial) | repeated | all completed trials owned by the experiment. |
356356
| request_number | [int32](#int32) | | The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time. |
357+
| total_request_number | [int32](#int32) | | The number of Suggestions requested till now |
357358

358359

359360

pkg/apis/manager/v1beta1/gen-doc/index.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,13 @@ <h3 id="api.v1.beta1.GetSuggestionsRequest">GetSuggestionsRequest</h3>
975975
<td><p>The number of Suggestion you request at one time. When you set 3 to request_number, you can get three Suggestions at one time. </p></td>
976976
</tr>
977977

978+
<tr>
979+
<td>total_request_number</td>
980+
<td><a href="#int32">int32</a></td>
981+
<td></td>
982+
<td><p>The number of Suggestions requested till now </p></td>
983+
</tr>
984+
978985
</tbody>
979986
</table>
980987

pkg/apis/manager/v1beta1/python/api_pb2.py

Lines changed: 37 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/controller.v1beta1/suggestion/suggestionclient/suggestionclient.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,21 +102,21 @@ func (g *General) SyncAssignments(
102102
instance.Status.AlgorithmSettings)
103103

104104
requestSuggestion := &suggestionapi.GetSuggestionsRequest{
105-
Experiment: g.ConvertExperiment(filledE),
106-
Trials: g.ConvertTrials(ts),
107-
RequestNumber: int32(requestNum),
105+
Experiment: g.ConvertExperiment(filledE),
106+
Trials: g.ConvertTrials(ts),
107+
RequestNumber: int32(requestNum),
108+
TotalRequestNumber: int32(instance.Spec.Requests),
108109
}
109110

110111
// Get new suggestions
111112
responseSuggestion, err := rpcClientSuggestion.GetSuggestions(ctx, requestSuggestion)
112113
if err != nil {
113114
return err
114115
}
115-
logger.Info("Getting suggestions", "endpoint", endpoint, "response", responseSuggestion,
116-
"request", requestSuggestion)
116+
logger.Info("Getting suggestions", "endpoint", endpoint, "Number of request parameters", requestNum, "Number of response parameters", len(responseSuggestion.ParameterAssignments))
117117
if len(responseSuggestion.ParameterAssignments) != requestNum {
118118
err := fmt.Errorf("The response contains unexpected trials")
119-
logger.Error(err, "The response contains unexpected trials", "requestNum", requestNum, "response", responseSuggestion)
119+
logger.Error(err, "The response contains unexpected trials")
120120
return err
121121
}
122122

pkg/controller.v1beta1/suggestion/suggestionclient/suggestionclient_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,7 @@ func newFakeRequest() *suggestionapi.GetSuggestionsRequest {
910910
},
911911
},
912912
},
913-
RequestNumber: 2,
913+
RequestNumber: 2,
914+
TotalRequestNumber: 6,
914915
}
915916
}

pkg/suggestion/v1beta1/chocolate/base_service.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,12 @@ def create_optimizer(self, algorithm_name):
103103
raise Exception(
104104
'"Failed to create Chocolate optimizer for the algorithm: {}'.format(algorithm_name))
105105

106-
def getSuggestions(self, trials, request_number):
106+
def getSuggestions(self, trials, request_number, total_request_number):
107107
"""
108108
Get the new suggested trials with chocolate algorithm.
109109
"""
110110
logger.info("-" * 100 + "\n")
111-
logger.info("New GetSuggestions call\n")
111+
logger.info("New GetSuggestions call with total requested {} and currently requesting {} \n".format(total_request_number, request_number))
112112
for _, trial in enumerate(trials):
113113
if trial.name not in self.recorded_trials_names:
114114
loss_for_choco = float(trial.target_metric.value)
@@ -157,9 +157,25 @@ def getSuggestions(self, trials, request_number):
157157
logger.info("New record in sqlite DB is updated")
158158
logger.info("{}\n".format(
159159
self.created_trials[new_trial_loss_idx]))
160+
# Assuming that created_trials are already populated
161+
# TODO: Handle Restart of algorithm pod
162+
logger.info("{} Trials created in DB".format(len(self.created_trials)))
163+
if total_request_number != len(self.created_trials) + request_number:
164+
logger.info("Mismatch in generated trials with k8s suggestions trials")
165+
new_actual_requested_no = total_request_number - len(self.created_trials)
166+
prev_generated_no = request_number - new_actual_requested_no
167+
logger.info("In this call, New {} Trials will be generated, {} Trials will be reused from previously generated".format(new_actual_requested_no, prev_generated_no))
160168

161169
list_of_assignments = []
162-
for i in range(request_number):
170+
if prev_generated_no > 0:
171+
for params in self.created_trials[-prev_generated_no:]:
172+
if DB_FIELD_TRIAL_NAME in params:
173+
logger.error("Trial already updated in selected assignment {}".format(params))
174+
new_assignment = BaseChocolateService.convert(
175+
self.search_space, params)
176+
list_of_assignments.append(new_assignment)
177+
178+
for i in range(new_actual_requested_no):
163179
try:
164180
token, chocolate_params = self.chocolate_optimizer.next()
165181
new_assignment = BaseChocolateService.convert(
@@ -182,7 +198,7 @@ def getSuggestions(self, trials, request_number):
182198

183199
if len(list_of_assignments) > 0:
184200
logger.info(
185-
"GetSuggestions returns {} new Trials\n\n".format(request_number))
201+
"GetSuggestions returns {} Trials from requested {} Trials\n\n".format(len(list_of_assignments),request_number))
186202

187203
return list_of_assignments
188204

pkg/suggestion/v1beta1/chocolate/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def GetSuggestions(self, request, context):
8484

8585
trials = Trial.convert(request.trials)
8686
new_assignments = self.base_service.getSuggestions(
87-
trials, request.request_number)
87+
trials, request.request_number, request.total_request_number)
8888
return api_pb2.GetSuggestionsReply(
8989
parameter_assignments=Assignment.generate(new_assignments)
9090
)

test/suggestion/v1beta1/test_chocolate_service.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ def test_get_suggestion(self):
169169
experiment=experiment,
170170
trials=trials,
171171
request_number=2,
172+
total_request_number=2,
172173
)
173174

174175
get_suggestion = self.test_server.invoke_unary_unary(

0 commit comments

Comments
 (0)