Skip to content

Commit 1507bb1

Browse files
Merge pull request #73 from Paperspace/PS-10876-add-missing-parameters-to-the-sdk
Add missing is_preemptible parameter to SDK
2 parents e96834b + 089e238 commit 1507bb1

File tree

7 files changed

+75
-4
lines changed

7 files changed

+75
-4
lines changed

gradient/api_sdk/clients/experiment_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def create_single_node(
1818
experiment_env=None,
1919
model_type=None,
2020
model_path=None,
21+
is_preemptible=False,
2122
container=None,
2223
container_user=None,
2324
registry_username=None,
@@ -60,6 +61,7 @@ def create_single_node(
6061
:param dict experiment_env: Environment variables in a JSON
6162
:param str model_type: defines the type of model that is being generated by the experiment. Model type must be one of Tensorflow, ONNX, or Custom
6263
:param str model_path: Model path
64+
:param bool is_preemptible: Is preemptible
6365
:param str container: Container (dockerfile) [required]
6466
:param str container_user: Container user for running the specified command in the container. If no containerUser is specified, the user will default to 'root' in the container.
6567
:param str registry_username: Registry username for accessing private docker registry container if nessesary
@@ -71,6 +73,9 @@ def create_single_node(
7173
:rtype: str
7274
"""
7375

76+
if not is_preemptible:
77+
is_preemptible = None
78+
7479
experiment = models.SingleNodeExperiment(
7580
experiment_type_id=constants.ExperimentType.SINGLE_NODE,
7681
name=name,
@@ -84,6 +89,7 @@ def create_single_node(
8489
experiment_env=experiment_env,
8590
model_type=model_type,
8691
model_path=model_path,
92+
is_preemptible=is_preemptible,
8793
container=container,
8894
command=command,
8995
container_user=container_user,
@@ -117,6 +123,7 @@ def create_multi_node(
117123
experiment_env=None,
118124
model_type=None,
119125
model_path=None,
126+
is_preemptible=False,
120127
worker_container_user=None,
121128
worker_registry_username=None,
122129
worker_registry_password=None,
@@ -172,6 +179,7 @@ def create_multi_node(
172179
:param dict experiment_env: Environment variables in a JSON
173180
:param str model_type: defines the type of model that is being generated by the experiment. Model type must be one of Tensorflow, ONNX, or Custom
174181
:param str model_path: Model path
182+
:param bool is_preemptible: Is preemptible
175183
:param str worker_container_user: Worker container user
176184
:param str worker_registry_username: Registry username for accessing private docker registry container if nessesary
177185
:param str worker_registry_password: Registry password for accessing private docker registry container if nessesary
@@ -185,6 +193,10 @@ def create_multi_node(
185193
:returns: experiment handle
186194
:rtype: str
187195
"""
196+
197+
if not is_preemptible:
198+
is_preemptible = None
199+
188200
experiment = models.MultiNodeExperiment(
189201
name=name,
190202
project_id=project_id,
@@ -205,6 +217,7 @@ def create_multi_node(
205217
experiment_env=experiment_env,
206218
model_type=model_type,
207219
model_path=model_path,
220+
is_preemptible=is_preemptible,
208221
worker_container_user=worker_container_user,
209222
worker_registry_username=worker_registry_username,
210223
worker_registry_password=worker_registry_password,
@@ -233,6 +246,7 @@ def run_single_node(
233246
experiment_env=None,
234247
model_type=None,
235248
model_path=None,
249+
is_preemptible=False,
236250
container=None,
237251
container_user=None,
238252
registry_username=None,
@@ -272,6 +286,7 @@ def run_single_node(
272286
:param dict experiment_env: Environment variables in a JSON
273287
:param str model_type: defines the type of model that is being generated by the experiment. Model type must be one of Tensorflow, ONNX, or Custom
274288
:param str model_path: Model path
289+
:param bool is_preemptible: Is preemptible
275290
:param str container: Container (dockerfile) [required]
276291
:param str container_user: Container user for running the specified command in the container. If no containerUser is specified, the user will default to 'root' in the container.
277292
:param str registry_username: Registry username for accessing private docker registry container if nessesary
@@ -283,6 +298,9 @@ def run_single_node(
283298
:rtype: str
284299
"""
285300

301+
if not is_preemptible:
302+
is_preemptible = None
303+
286304
experiment = models.SingleNodeExperiment(
287305
experiment_type_id=constants.ExperimentType.SINGLE_NODE,
288306
name=name,
@@ -296,6 +314,7 @@ def run_single_node(
296314
experiment_env=experiment_env,
297315
model_type=model_type,
298316
model_path=model_path,
317+
is_preemptible=is_preemptible,
299318
container=container,
300319
command=command,
301320
container_user=container_user,
@@ -329,6 +348,7 @@ def run_multi_node(
329348
experiment_env=None,
330349
model_type=None,
331350
model_path=None,
351+
is_preemptible=False,
332352
worker_container_user=None,
333353
worker_registry_username=None,
334354
worker_registry_password=None,
@@ -384,6 +404,7 @@ def run_multi_node(
384404
:param dict experiment_env: Environment variables in a JSON
385405
:param str model_type: defines the type of model that is being generated by the experiment. Model type must be one of Tensorflow, ONNX, or Custom
386406
:param str model_path: Model path
407+
:param bool is_preemptible: Is preemptible
387408
:param str worker_container_user: Worker container user
388409
:param str worker_registry_username: Registry username for accessing private docker registry container if nessesary
389410
:param str worker_registry_password: Registry password for accessing private docker registry container if nessesary
@@ -397,6 +418,10 @@ def run_multi_node(
397418
:returns: experiment handle
398419
:rtype: str
399420
"""
421+
422+
if not is_preemptible:
423+
is_preemptible = None
424+
400425
experiment = models.MultiNodeExperiment(
401426
name=name,
402427
project_id=project_id,
@@ -417,6 +442,7 @@ def run_multi_node(
417442
experiment_env=experiment_env,
418443
model_type=model_type,
419444
model_path=model_path,
445+
is_preemptible=is_preemptible,
420446
worker_container_user=worker_container_user,
421447
worker_registry_username=worker_registry_username,
422448
worker_registry_password=worker_registry_password,

gradient/api_sdk/clients/hyperparameter_client.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def create(
1515
worker_container_user=None,
1616
worker_registry_username=None,
1717
worker_registry_password=None,
18-
is_preemptible=True,
18+
is_preemptible=False,
1919
ports=None,
2020
workspace_url=None,
2121
artifact_directory=None,
@@ -66,6 +66,9 @@ def create(
6666
:rtype: str
6767
"""
6868

69+
if not is_preemptible:
70+
is_preemptible = None
71+
6972
hyperparameter = models.Hyperparameter(
7073
name=name,
7174
project_id=project_id,
@@ -112,7 +115,7 @@ def run(
112115
worker_registry_username=None,
113116
worker_registry_password=None,
114117
worker_container_user=None,
115-
is_preemptible=True,
118+
is_preemptible=False,
116119
ports=None,
117120
workspace_url=None,
118121
artifact_directory=None,
@@ -176,6 +179,9 @@ def run(
176179
:rtype: str
177180
"""
178181

182+
if not is_preemptible:
183+
is_preemptible = None
184+
179185
hyperparameter = models.Hyperparameter(
180186
name=name,
181187
project_id=project_id,

gradient/api_sdk/models/experiment.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class BaseExperiment(object):
2323
:param str project_id: Project ID
2424
:param str model_type: defines the type of model that is being generated by the experiment.
2525
:param str model_path: Model path
26+
:param bool is_preemptible: Is preemptible
2627
:param str id:
2728
:param int state: state of experiment can be one of::
2829
@@ -50,6 +51,7 @@ class BaseExperiment(object):
5051
project_id = attr.ib(type=str, default=None)
5152
model_type = attr.ib(type=str, default=None)
5253
model_path = attr.ib(type=str, default=None)
54+
is_preemptible = attr.ib(type=bool, default=None)
5355
id = attr.ib(type=str, default=None)
5456
state = attr.ib(type=int, default=None)
5557

gradient/api_sdk/serializers/experiment.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class BaseExperimentSchema(BaseSchema):
1616
project_id = marshmallow.fields.Str(required=True, dump_to="projectHandle", load_from="project_handle")
1717
model_type = marshmallow.fields.Str(dump_to="modelType", load_from="modelType")
1818
model_path = marshmallow.fields.Str(dump_to="modelPath", load_from="modelPath")
19+
is_preemptible = marshmallow.fields.Bool(dump_to="isPreemptible", load_from="isPreemptible")
1920
id = marshmallow.fields.Str(load_from="handle")
2021
state = marshmallow.fields.Int()
2122

gradient/commands/experiments.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def execute(self, json_, use_vpc=False):
4444

4545
def _handle_workspace(self, instance_dict):
4646
handler = self.workspace_handler.handle(instance_dict)
47+
instance_dict.pop("ignore_files", None)
4748
instance_dict.pop("workspace", None)
4849
instance_dict.pop("workspace_archive", None)
4950
instance_dict.pop("workspace_url", None)

tests/functional/test_experiments.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class TestExperimentsCreateSingleNode(object):
4040
"--registryPassword", "passwd",
4141
"--registryUrl", "registryUrl",
4242
"--apiKey", "some_key",
43+
"--modelPath", "some-model-path",
44+
"--modelType", "some-model-type",
45+
"--ignoreFiles", "file1,file2",
46+
"--isPreemptible",
4347
]
4448
BASIC_OPTIONS_REQUEST = {
4549
"name": u"exp1",
@@ -67,6 +71,9 @@ class TestExperimentsCreateSingleNode(object):
6771
"registryPassword": u"passwd",
6872
"registryUrl": u"registryUrl",
6973
"experimentTypeId": constants.ExperimentType.SINGLE_NODE,
74+
"modelPath": "some-model-path",
75+
"modelType": "some-model-type",
76+
"isPreemptible": True,
7077
}
7178
BASIC_OPTIONS_COMMAND_WITH_VPC_SWITCH = [
7279
"experiments", "create", "singlenode",
@@ -129,13 +136,13 @@ def test_should_send_proper_data_and_print_message_when_create_experiment_was_ru
129136
runner = CliRunner()
130137
result = runner.invoke(cli.cli, self.FULL_OPTIONS_COMMAND)
131138

139+
assert self.EXPECTED_STDOUT in result.output
132140
post_patched.assert_called_once_with(self.URL,
133141
headers=self.EXPECTED_HEADERS_WITH_CHANGED_API_KEY,
134142
json=self.FULL_OPTIONS_REQUEST,
135143
params=None,
136144
files=None,
137145
data=None)
138-
assert self.EXPECTED_STDOUT in result.output
139146
assert result.exit_code == 0
140147
assert self.EXPECTED_HEADERS_WITH_CHANGED_API_KEY["X-API-Key"] == "some_key"
141148

@@ -207,6 +214,10 @@ class TestExperimentsCreateMultiNode(object):
207214
"--parameterServerRegistryPassword", "psrpass",
208215
"--parameterServerRegistryUrl", "psrurl",
209216
"--apiKey", "some_key",
217+
"--modelPath", "some-model-path",
218+
"--modelType", "some-model-type",
219+
"--ignoreFiles", "file1,file2",
220+
"--isPreemptible",
210221
]
211222
BASIC_OPTIONS_REQUEST = {
212223
u"name": u"multinode_mpi",
@@ -249,6 +260,9 @@ class TestExperimentsCreateMultiNode(object):
249260
"parameterServerRegistryUsername": u"psrcus",
250261
"parameterServerRegistryPassword": u"psrpass",
251262
"parameterServerRegistryUrl": u"psrurl",
263+
"isPreemptible": True,
264+
"modelPath": "some-model-path",
265+
"modelType": "some-model-type",
252266
}
253267
RESPONSE_JSON_200 = {"handle": "sadkfhlskdjh", "message": "success"}
254268
RESPONSE_CONTENT_200 = b'{"handle":"sadkfhlskdjh","message":"success"}\n'
@@ -357,6 +371,10 @@ class TestExperimentsCreateAndStartSingleNode(TestExperimentsCreateSingleNode):
357371
"--registryUrl", "registryUrl",
358372
"--apiKey", "some_key",
359373
"--no-logs",
374+
"--modelPath", "some-model-path",
375+
"--modelType", "some-model-type",
376+
"--ignoreFiles", "file1,file2",
377+
"--isPreemptible",
360378
]
361379
BASIC_OPTIONS_COMMAND_WITH_VPC_SWITCH = [
362380
"experiments", "run", "singlenode",
@@ -421,6 +439,10 @@ class TestExperimentsCreateAndStartMultiNode(TestExperimentsCreateMultiNode):
421439
"--parameterServerRegistryUrl", "psrurl",
422440
"--apiKey", "some_key",
423441
"--no-logs",
442+
"--modelPath", "some-model-path",
443+
"--modelType", "some-model-type",
444+
"--ignoreFiles", "file1,file2",
445+
"--isPreemptible",
424446
]
425447
BASIC_OPTIONS_COMMAND_WITH_VPC_SWITCH = [
426448
"experiments", "run", "multinode",

tests/functional/test_hyperparameters.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ class TestCreateHyperparameters(object):
4949
"--hyperparameterServerContainerUser", "someHyperparameterServerContainerUser",
5050
"--hyperparameterServerMachineType", "someHyperparameterServerMachineType",
5151
"--workspace", "none",
52-
52+
"--modelPath", "some-model-path",
53+
"--modelType", "some-model-type",
54+
"--ignoreFiles", "file1,file2",
55+
"--isPreemptible",
5356
]
5457
EXPECTED_REQUEST_JSON_WHEN_ALL_PARAMETERS_WERE_USED = {
5558
"workerContainer": "some_container",
@@ -68,6 +71,9 @@ class TestCreateHyperparameters(object):
6871
"hyperparameterServerContainerUser": "someHyperparameterServerContainerUser",
6972
"hyperparameterServerMachineType": "someHyperparameterServerMachineType",
7073
"experimentTypeId": constants.ExperimentType.HYPERPARAMETER_TUNING,
74+
"modelPath": "some-model-path",
75+
"modelType": "some-model-type",
76+
"isPreemptible": True,
7177
}
7278
EXPECTED_HEADERS = http_client.default_headers.copy()
7379
EXPECTED_HEADERS_WITH_CHANGED_API_KEY = http_client.default_headers.copy()
@@ -256,6 +262,10 @@ class TestCreateAndStartHyperparameters(object):
256262
"--hyperparameterServerContainerUser", "someHyperparameterServerContainerUser",
257263
"--hyperparameterServerMachineType", "someHyperparameterServerMachineType",
258264
"--workspace", "none",
265+
"--modelPath", "some-model-path",
266+
"--modelType", "some-model-type",
267+
"--ignoreFiles", "file1,file2",
268+
"--isPreemptible",
259269
]
260270
EXPECTED_REQUEST_JSON_WHEN_ALL_PARAMETERS_WERE_USED = {
261271
"workerContainer": "some_container",
@@ -274,6 +284,9 @@ class TestCreateAndStartHyperparameters(object):
274284
"hyperparameterServerContainerUser": "someHyperparameterServerContainerUser",
275285
"hyperparameterServerMachineType": "someHyperparameterServerMachineType",
276286
"experimentTypeId": constants.ExperimentType.HYPERPARAMETER_TUNING,
287+
"modelPath": "some-model-path",
288+
"modelType": "some-model-type",
289+
"isPreemptible": True,
277290
}
278291
EXPECTED_HEADERS = http_client.default_headers.copy()
279292
EXPECTED_HEADERS_WITH_CHANGED_API_KEY = http_client.default_headers.copy()

0 commit comments

Comments
 (0)