Skip to content
This repository was archived by the owner on Aug 11, 2020. It is now read-only.

Commit 20f5ef2

Browse files
BartoszCkikossak
authored andcommitted
Add hyperparameters management - create and list commands
1 parent 7280fb7 commit 20f5ef2

File tree

5 files changed

+591
-0
lines changed

5 files changed

+591
-0
lines changed

paperspace/cli/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import paperspace.cli.auth
66
import paperspace.cli.deployments
77
import paperspace.cli.experiments
8+
import paperspace.cli.hyperparameters
89
import paperspace.cli.jobs
910
import paperspace.cli.machines
1011
import paperspace.cli.models

paperspace/cli/hyperparameters.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import click
2+
3+
from paperspace import client, config
4+
from paperspace.cli import common
5+
from paperspace.cli.cli import cli
6+
from paperspace.cli.common import ClickGroup
7+
from paperspace.commands import hyperparameters as hyperparameters_commands
8+
9+
10+
@cli.group("hyperparameters", help="Manage hyperparameters", cls=ClickGroup)
11+
def hyperparameters_group():
12+
pass
13+
14+
15+
@hyperparameters_group.command("create", help="Create hyperparameter")
16+
@click.option(
17+
"--name",
18+
"name",
19+
required=True,
20+
)
21+
@click.option(
22+
"--projectId",
23+
"projectHandle",
24+
required=True,
25+
)
26+
@click.option(
27+
"--tuningCommand",
28+
"tuningCommand",
29+
required=True,
30+
)
31+
@click.option(
32+
"--workerContainer",
33+
"workerContainer",
34+
required=True,
35+
)
36+
@click.option(
37+
"--workerMachineType",
38+
"workerMachineType",
39+
required=True,
40+
)
41+
@click.option(
42+
"--workerCommand",
43+
"workerCommand",
44+
required=True,
45+
)
46+
@click.option(
47+
"--workerCount",
48+
"workerCount",
49+
required=True,
50+
type=int,
51+
)
52+
@click.option(
53+
"--serverRegistryUsername",
54+
"hyperparameterServerRegistryUsername",
55+
)
56+
@click.option(
57+
"--serverRegistryPassword",
58+
"hyperparameterServerRegistryPassword",
59+
)
60+
@click.option(
61+
"--serverContainerUser",
62+
"hyperparameterServerContainerUser",
63+
)
64+
@common.api_key_option
65+
def create_hyperparameter(api_key, **hyperparameter):
66+
common.del_if_value_is_none(hyperparameter)
67+
hyperparameters_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key)
68+
command = hyperparameters_commands.CreateHyperparameterCommand(api=hyperparameters_api)
69+
command.execute(hyperparameter)
70+
71+
72+
@hyperparameters_group.command("list", help="List hyperparameters")
73+
@common.api_key_option
74+
def create_hyperparameter(api_key):
75+
hyperparameters_api = client.API(config.CONFIG_EXPERIMENTS_HOST, api_key=api_key)
76+
command = hyperparameters_commands.ListHyperparametersCommand(api=hyperparameters_api)
77+
command.execute()
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from paperspace.commands import common
2+
3+
4+
class HyperparametersCommandBase(common.CommandBase):
5+
def _log_message(self, response, success_msg_template, error_msg):
6+
if response.ok:
7+
try:
8+
json_ = response.json()
9+
except (ValueError, KeyError):
10+
self.logger.log(success_msg_template)
11+
else:
12+
msg = success_msg_template.format(**json_)
13+
self.logger.log(msg)
14+
else:
15+
try:
16+
data = response.json()
17+
self.logger.log_error_response(data)
18+
except ValueError:
19+
self.logger.error(error_msg)
20+
21+
22+
class CreateHyperparameterCommand(HyperparametersCommandBase):
23+
def execute(self, hyperparameter):
24+
response = self.api.post("/hyperopt/", json=hyperparameter)
25+
self._log_message(response,
26+
"Hyperparameter created with ID: {handle}",
27+
"Unknown error while creating hyperparameter")
28+
29+
30+
class ListHyperparametersCommand(common.ListCommand):
31+
@property
32+
def request_url(self):
33+
return "/hyperopt/"
34+
35+
def _get_table_data(self, objects):
36+
data = [("Name", "ID", "Project ID")]
37+
for obj in objects:
38+
name = obj["templateHistory"]["params"].get("name")
39+
id_ = obj.get("handle")
40+
project_id = obj["templateHistory"]["params"].get("project_handle")
41+
data.append((name, id_, project_id))
42+
43+
return data
44+
45+
def _get_objects(self, response, kwargs):
46+
objects = super(ListHyperparametersCommand, self)._get_objects(response, kwargs)["data"]
47+
return objects
48+
49+
def _get_request_params(self, kwargs):
50+
params = {"limit": -1}
51+
return params

tests/example_responses.py

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3113,3 +3113,183 @@
31133113
"message": "PSEOF"
31143114
}
31153115
]
3116+
3117+
LIST_HYPERPARAMETERS_RESPONSE_JSON = {
3118+
"data": [
3119+
{
3120+
"dtCreated": "2019-05-13T11:29:43.155736+00:00",
3121+
"dtDeleted": None,
3122+
"dtFinished": None,
3123+
"dtModified": "2019-05-13T11:29:43.155736+00:00",
3124+
"dtProvisioningFinished": None,
3125+
"dtProvisioningStarted": None,
3126+
"dtStarted": None,
3127+
"dtTeardownFinished": None,
3128+
"dtTeardownStarted": None,
3129+
"experimentError": None,
3130+
"experimentTemplateHistoryId": 45987,
3131+
"experimentTemplateId": 8,
3132+
"experimentTypeId": 4,
3133+
"handle": "es3dn6fu16r4kk",
3134+
"id": 45980,
3135+
"projectHandle": "pr4yxj956",
3136+
"projectId": 14898,
3137+
"started_by_user_id": 199654,
3138+
"state": 1,
3139+
"templateHistory": {
3140+
"dtCreated": "2019-05-13T11:29:41.933178+00:00",
3141+
"dtDeleted": None,
3142+
"experimentTemplateId": 8,
3143+
"id": 45987,
3144+
"params": {
3145+
"is_preemptible": False,
3146+
"name": "some_name",
3147+
"ports": 5000,
3148+
"project_handle": "pr4yxj956",
3149+
"tuning_command": "some command",
3150+
"worker_command": "some worker command",
3151+
"worker_container": "some_container",
3152+
"worker_count": 1,
3153+
"worker_machine_type": "k80",
3154+
"worker_use_dockerfile": False,
3155+
"workspaceUrl": "none"
3156+
},
3157+
"triggerEvent": None,
3158+
"triggerEventId": None
3159+
}
3160+
},
3161+
{
3162+
"dtCreated": "2019-05-13T11:29:40.196982+00:00",
3163+
"dtDeleted": None,
3164+
"dtFinished": None,
3165+
"dtModified": "2019-05-13T11:29:40.196982+00:00",
3166+
"dtProvisioningFinished": None,
3167+
"dtProvisioningStarted": None,
3168+
"dtStarted": None,
3169+
"dtTeardownFinished": None,
3170+
"dtTeardownStarted": None,
3171+
"experimentError": None,
3172+
"experimentTemplateHistoryId": 45986,
3173+
"experimentTemplateId": 8,
3174+
"experimentTypeId": 4,
3175+
"handle": "eshlqek7wzvrxa",
3176+
"id": 45979,
3177+
"projectHandle": "pr4yxj956",
3178+
"projectId": 14898,
3179+
"started_by_user_id": 199654,
3180+
"state": 1,
3181+
"templateHistory": {
3182+
"dtCreated": "2019-05-13T11:29:38.882999+00:00",
3183+
"dtDeleted": None,
3184+
"experimentTemplateId": 8,
3185+
"id": 45986,
3186+
"params": {
3187+
"is_preemptible": False,
3188+
"name": "some_name",
3189+
"ports": 5000,
3190+
"project_handle": "pr4yxj956",
3191+
"tuning_command": "some command",
3192+
"worker_command": "some worker command",
3193+
"worker_container": "some_container",
3194+
"worker_count": 1,
3195+
"worker_machine_type": "k80",
3196+
"worker_use_dockerfile": False,
3197+
"workspaceUrl": "none"
3198+
},
3199+
"triggerEvent": None,
3200+
"triggerEventId": None
3201+
}
3202+
},
3203+
{
3204+
"dtCreated": "2019-05-13T11:25:03.760490+00:00",
3205+
"dtDeleted": None,
3206+
"dtFinished": None,
3207+
"dtModified": "2019-05-13T11:25:03.760490+00:00",
3208+
"dtProvisioningFinished": None,
3209+
"dtProvisioningStarted": None,
3210+
"dtStarted": None,
3211+
"dtTeardownFinished": None,
3212+
"dtTeardownStarted": None,
3213+
"experimentError": None,
3214+
"experimentTemplateHistoryId": 45985,
3215+
"experimentTemplateId": 8,
3216+
"experimentTypeId": 4,
3217+
"handle": "esdwnui5qsk8qm",
3218+
"id": 45978,
3219+
"projectHandle": "pr4yxj956",
3220+
"projectId": 14898,
3221+
"started_by_user_id": 199654,
3222+
"state": 1,
3223+
"templateHistory": {
3224+
"dtCreated": "2019-05-13T11:25:02.489045+00:00",
3225+
"dtDeleted": None,
3226+
"experimentTemplateId": 8,
3227+
"id": 45985,
3228+
"params": {
3229+
"is_preemptible": False,
3230+
"name": "some_name",
3231+
"ports": 5000,
3232+
"project_handle": "pr4yxj956",
3233+
"tuning_command": "some command",
3234+
"worker_command": "some worker command",
3235+
"worker_container": "some_container",
3236+
"worker_count": 1,
3237+
"worker_machine_type": "k80",
3238+
"worker_use_dockerfile": False,
3239+
"workspaceUrl": "none"
3240+
},
3241+
"triggerEvent": None,
3242+
"triggerEventId": None
3243+
}
3244+
},
3245+
{
3246+
"dtCreated": "2019-05-13T11:23:53.803162+00:00",
3247+
"dtDeleted": None,
3248+
"dtFinished": None,
3249+
"dtModified": "2019-05-13T11:23:53.803162+00:00",
3250+
"dtProvisioningFinished": None,
3251+
"dtProvisioningStarted": None,
3252+
"dtStarted": None,
3253+
"dtTeardownFinished": None,
3254+
"dtTeardownStarted": None,
3255+
"experimentError": None,
3256+
"experimentTemplateHistoryId": 45984,
3257+
"experimentTemplateId": 8,
3258+
"experimentTypeId": 4,
3259+
"handle": "eshz1z9k37w4nm",
3260+
"id": 45977,
3261+
"projectHandle": "pr4yxj956",
3262+
"projectId": 14898,
3263+
"started_by_user_id": 199654,
3264+
"state": 1,
3265+
"templateHistory": {
3266+
"dtCreated": "2019-05-13T11:23:52.778310+00:00",
3267+
"dtDeleted": None,
3268+
"experimentTemplateId": 8,
3269+
"id": 45984,
3270+
"params": {
3271+
"is_preemptible": False,
3272+
"name": "some_name",
3273+
"ports": 5000,
3274+
"project_handle": "pr4yxj956",
3275+
"tuning_command": "some command",
3276+
"worker_command": "some worker command",
3277+
"worker_container": "some_container",
3278+
"worker_count": 1,
3279+
"worker_machine_type": "k80",
3280+
"worker_use_dockerfile": False,
3281+
"workspaceUrl": "none"
3282+
},
3283+
"triggerEvent": None,
3284+
"triggerEventId": None
3285+
}
3286+
},
3287+
],
3288+
"message": "success",
3289+
"meta": {
3290+
"filter": [],
3291+
"limit": 11,
3292+
"offset": 0,
3293+
"totalItems": 15
3294+
}
3295+
}

0 commit comments

Comments
 (0)