Skip to content

Commit

Permalink
feat: expose hyperparameters in experiments api to avoid using depr…
Browse files Browse the repository at this point in the history
…ecated `config` property for experiment (#9012)
  • Loading branch information
keita-determined authored Apr 10, 2024
1 parent 5a588e0 commit 1bb2fe4
Show file tree
Hide file tree
Showing 26 changed files with 520 additions and 313 deletions.
8 changes: 8 additions & 0 deletions harness/determined/common/api/bindings.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions master/internal/api_experiment.go
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,7 @@ func getExperimentColumns(q *bun.SelectQuery) *bun.SelectQuery {
ColumnExpr("e.config->'resources'->>'resource_pool' AS resource_pool").
ColumnExpr("e.config->'searcher'->>'name' AS searcher_type").
ColumnExpr("e.config->'searcher'->>'metric' AS searcher_metric").
ColumnExpr("e.config->'hyperparameters' AS hyperparameters").
ColumnExpr("e.config->>'name' as NAME").
ColumnExpr(
"CASE WHEN NULLIF(e.notes, '') IS NULL THEN NULL ELSE 'omitted' END AS notes").
Expand Down
40 changes: 40 additions & 0 deletions master/internal/api_experiment_intg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,43 @@ func TestGetExperimentConfig(t *testing.T) {
}
}

func TestGetExperimentHyperparameters(t *testing.T) {
api, curUser, ctx := setupAPITest(t, nil)
exp := createTestExp(t, api, curUser)
expectedBytes, err := db.SingleDB().ExperimentConfigRaw(exp.ID)
require.NoError(t, err)
expected := make(map[string]any)
require.NoError(t, json.Unmarshal(expectedBytes, &expected))
expectedHyperparameter := expected["hyperparameters"].(map[string]any)
resp, err := api.GetExperiments(ctx, &apiv1.GetExperimentsRequest{
ExperimentIdFilter: &commonv1.Int32FieldFilter{
Incl: []int32{int32(exp.ID)},
},
})
require.NoError(t, err)
require.Len(t, resp.Experiments, 1)
require.Equal(t, int32(exp.ID), resp.Experiments[0].Id)

if _, ok := resp.Experiments[0].Config.Fields["hyperparameters"]; !ok { //nolint:staticcheck
t.Errorf("`hyperparameters` is not in config")
}

cases := []struct {
name string
hyperparameters map[string]any
}{
{"GetExperimentResponse.Experiments.Config.Hyperparameters", resp.Experiments[0].Config. //nolint:staticcheck
Fields["hyperparameters"].
AsInterface().(map[string]any)},
{"GetExperimentResponse.Experiments.Hyperparameters", resp.Experiments[0].Hyperparameters.AsMap()},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
require.Equal(t, expectedHyperparameter, c.hyperparameters)
})
}
}

func TestGetTaskContextDirectoryExperiment(t *testing.T) {
api, curUser, ctx := setupAPITest(t, nil)

Expand Down Expand Up @@ -1026,6 +1063,9 @@ func getExperimentsTest(ctx context.Context, t *testing.T, api *apiServer, pid i
// Don't compare config.
res.Experiments[i].Config = nil //nolint:staticcheck

// Don't compare hyperparameters.
res.Experiments[i].Hyperparameters = nil

// Compare time seperatly due to millisecond precision in postgres.
require.WithinDuration(t,
expected[i].StartTime.AsTime(), res.Experiments[i].StartTime.AsTime(), time.Millisecond)
Expand Down
Loading

0 comments on commit 1bb2fe4

Please sign in to comment.